DoIP(Diagnostic communication over Internet Protocol)
以太网被越来越多地应用在整车总线中,尤其是各个需要实时传输大量信息的系统中(如:信息娱乐系统,T-Box)。本文会对个人学习DoIP时的领悟和思路进行一些整理。旨在记录与厘清思路,同时希望能够帮助到一起学习的同好,方便后续更深入地学习研究,共同进步。
1. Do CAN (Diagnostic over CAN) vs DoIP
Do CAN,就是常用的通过CAN总线进行的UDS诊断,是目前最为常见常用的诊断方式。
通过TCP/IP以及以太网进行车辆的诊断,就是DoIP技术。车辆上的网关,能够做到对车载网络和外部测试设备间路由和转发消息,通过以太网实现基于UDS的诊断服务。同时,这种技术也是解决快速更新ECU、标定、远程诊断的重要手段之一。
Do CAN和DoIP在使用时的连接方式差别可以通过下图体现:
可以看到Do CAN通过CAN总线进行被测实体和外部测试工具的连接,而DoIP则是使用了100BASE-Tx的网线以及1根以太网激活线来连接两者。
Do CAN的诊断操作流程和DoIP的诊断操作流程由于协议规定不同也有差别,DoIP相对步骤更多也更为复杂:
Step | Do CAN | DoIP |
1 | 导入诊断数据库(CDD/ODX/PDX) | 导入诊断数据库 |
2 | 硬件连接 | 硬件连接并激活以太网 |
3 | 执行诊断服务 | 车辆识别 |
4 | -- | 路由激活 |
5 | -- | 执行诊断服务 |
6 | -- | 断开DoIP连接 |
Do CAN和DoIP在OSI框架下规定的协议栈分别如下:
OSI | DoCAN Standard | DoIP Standard |
应用层 | ISO 14229-1/5 | ISO 14229-1/5 |
表示层 |
OEM 定义
(J1939等) |
OEM 定义
(J1939等) |
会话层 | ISO 14229-2 | ISO 14229-2 |
传输层 | ISO 15765-2 | ISO 13400-2 (TCP) |
网络层 | ISO 15765-2 | ISO 13400-2 (IP) |
数据链路层 | ISO 11898 (CAN) | ISO 13400-3 (Ethernet) |
物理层 | ISO 11898 (CAN) | ISO 13400-3 (100/10BASE-Tx) |
可以看到两者从传输层到物理层采用的是不同的协议。
ISO 13400-1/2/3/4主要定义了以太网的物理层、数据链路层、网络层、传输层,并且提供了一个典型的DoIP实现过程。
2. 各层要求及DoIP报文结构
2.1 物理层
DoIP Edge Node,也就是车内特殊的网关,一般称为边缘节点,它用于连接外部测试设备与车辆内部网络,需要满足:能够支持100/10 BASE-Tx。
用于连接的以太网线缆要求至少是CAT5,链路段最长不能超过50m。
关于以太网激活线:
外部设备连接、断开车辆时,边缘节点可以通过以太网激活线,打开或关闭以太网控制器。
激活线电压高于5V并持续200ms后,即进入激活状态。当激活电压低于2V并持续200ms后,退出激活状态。
2.2 数据链路层
边缘节点需要支持100/10 Mbit/s Ethernet,并且支持自动协商。
测试设备要求支持100BASE-Tx且能够自动翻转Auto-MDI(X)(能够自动识别线缆连接类型,避免由于使用错线缆导致的以太网连接失败)。
2.3 网络层
网络层需要满足包含MAC层、IP、ARP、NDP、ICMP的要求,各要求如下:
MAC层:
我们最常见的就是MAC地址,也就是以太网物理地址,需要唯一且符合IEEE 802.3;
MAC层限制了数据的长度,最小是64个字节,最大四1500个字节,基于以太网的IP数据包最大长度是1500字节。
网际协议IP:
网际协议是用于各种介质上进行封包交换的端到端数据通信协议,网际协议基于数据报,是独立于传输介质协议。所有网络上的DoIP实体需要有相同的IP协议版本,目前有IPV4和IPV6两种。(车内支持DoIP的所有节点均可以称为DoIP实体)
ARP:
ARP即地址解析协议,是在仅已知主机IP地址的情况下用于确定主机MAC地址的方法之一,使用IPV4协议的话,所有DoIP实体均需要实现ARP。
NDP:
NDP即邻居发现协议,也是在仅已知主机IP地址的情况下用于确定主机MAC地址的方法之一,使用IPV6协议的话,所有DoIP实体均需要实现NDP。
ICMP:
ICMP即互联网控制消息协议,是IP协议的一部分,ICMP用于发送比如指示、请求的服务器不可用或是无法访问主机的错误消息。
使用IPV4的话,每个DoIP实体需要实现ICMP,使用IPV6的话需要实现ICMPv6。
2.4 传输层
传输层需要满足包含TCP、UDP和DHCP协议,各协议需要满足的简单内容如下:
TCP协议:
TCP协议是一种面向连接的协议,用于主机的应用程序间建立连接并交换数据,TCP能够保证发送方到接收方间传输的数据可靠和有序。所有的DoIP实体均需要实现TCP。
TCP端口:
端口名称 | 端口号 | 用途 |
TCP_DATA | 13400 | 用于与外部设备坚立通信,外部设备应该支持多个TCP数据连接,本地端口则会在建立套接字时自动选择 |
UDP协议:
UDP协议是一种无连接协议,数据包会被发送方直接发出,并且哪怕数据丢失或无序到达也不会通知接收方或者发送方,但是UDP对轻量级或时间敏感的程序更快速也更高效。每个DoIP实体需要实现UDP。
UDP端口:
端口名称 | 端口号 | 用途 |
UDP_DISCOVERY | 13400 | 作为车辆识别,请求命令的目的端口号 |
UDP_TEST_EQUIPMENT_REQUEST |
动态分配
49152-65535 |
外部测试设备使用UDP发送消息时的本地端口号 |
DHCP:
DHCP协议是应用层协议,使用UDP分配IP地址,有些系统会使用网关为各个节点分配IP地址。
2.5 DoIP报文基本结构
DoIP报文是用于实现DoIP协议的数据报,外部设备或DoIP实体收发DoIP报文,接收到DoIP报文的实体根据报文内容进行相应处理或应答就是DoIP的原理,DoIP报文结构如下:
DoIP报文包含在以太网报文内,DoIP数据作为SDU层层向下传递,DoIP数据内容可以分为5个内容:
1. 所使用的ISO13400版本信息(1字节);
2. 所使用的的ISO13400版本信息取反(1字节);
3. 负载类型(2字节),用于标识这一帧报文的实际用途,如:请求车辆信息、诊断命令、Alive Check、上报车辆信息等;
目前比较常用的可以在下表找到:
Payload Type Value | Payload Type name |
0x0000 | Generic DoIP header negative acknowledge |
0x0001 | Vehicle identification request message |
0x0002 | Vehicle identification requeset message with EID |
0x0003 | Vehicle identification requeset message with VIN |
0x0004 |
Vehicle announcement message
vehicle identification response message |
0x0005 | Routing activation request |
0x0006 | Routing activation response |
0x8001 | Diagnostic message |
0x8002 | Diagnostic message positive acknowledgement |
0x8003 | Diagnostic message negative acknowledgement |
4. 数据长度(4字节);
5. 诊断数据(0-4294967295字节);
2.6 逻辑地址
逻辑地址类似于CAN总线的仲裁ID。
物理逻辑地址是表示一个诊断应用层实体的地址,任何一个结构内的DoIP实体或边缘节点均有其逻辑地址。
功能逻辑地址用于将消息发送到车内的一组或者所有诊断应用层实体。
以上就是关于DoIP报文结构和在OSI模型各层的要求相关的内容,接下来会简述DoIP的使用场景和网络架构。
3. DoIP的使用场景网络架构
3.1 应用场景:
在ISO 13400中定义了DoIP的4个应用场景:
1. 点对点直连(1个测试设备连接1台车);
2. 多台外部设备分别和多台汽车在局域网内通过交换机点对点连接(通过交换机将多个测试设备一一对应连接到多台车);
3. 1台外部测试设备跨越本地网络和多台车辆连接(1台设备通过wifi、交换机等和多台车辆连接);
4. 外部测试设备的多个应用层实体和单台车辆连接(多台测试设备连接到1台车,这些测试设备可以执行发送不同的DoIP报文,如:A设备用于诊断B设备用于刷新ECU);
3.2 网络架构:
下图简要描述了带以太网节点的车载网络和外部网络里的测试设备之间链接。在车载网络中有且仅有1个边缘节点,用于连接外部测试设备。边缘节点可以再连接支持DoIP的网关和其他网络节点,边缘节点本身也具有网关功能,能够通过车内的网络连接到其他的ECU群体。
将ISO 13400中的架构图简化后可以获得类似下图的结构:
在完成以太网激活、车辆连接、路由激活后,测试设备将以太网报文发往边缘节点,边缘节点根据报文内容将报文下发到其他网关或解析出诊断报文发送到连接的ECU中,之后根据收到的回复再将回复的报文转换成以太网报文发回测试设备,1个基于DoIP的诊断服务就完成了。
以上就是关于DoIP的使用场景和网络架构相关内容,接下来会简述DoIP实现的步骤流程。
4. DoIP的实现步骤
4.1. 创建导入数据库
导入ODX、PDX、CDD、COD数据库,根据使用的诊断工具不同,导入的过程各有不同。
4.2. 硬件连接、以太网激活
连接外部测试设备和边缘节点,并通过给激活线加载200ms的5V电压进行激活。在边缘节点检测到数据链路连接的时候,每个DoIP实体都会同时执行Auto-IP和DHCP进行IP地址分配并获得子网掩码。也就是所有连接的设备(包含外部测试设备和内部挂载设备)都会在同一个网段上。
4.3. 车辆识别
在ISO 13400中,规定了车辆识别的具体流程:
在完成了硬件连接和以太网激活和IP地址分配后,车辆的边缘节点会自动发送3条UDP的车辆公告信息报文(Vehicle announcement message)来告知外部测试设备车内DoIP边缘节点的参数信息(VIN码、EID、IP地址等)。
如果在外部测试设备没有接受到这3帧车辆公告信息报文,可以自行发送车辆识别请求报文(Vehicle identification request)对边缘节点进行问询。
在边缘节点收到车辆识别请求报文后,会回复车辆识别应答报文(Vehicle identification response),这条报文和3条车辆公告信息报文的内容是一致的。
在收到车辆识别应答报文后,外部DoIP测试设备就能够获取到车辆信息并显示在各自的UI上,方便用户选择车辆并进行下一步操作,也就是路由激活。
4.4. 路由激活
路由激活的本质就是DoIP连接,这个连接才是实际的DoIP连接动作。这个连接的过程在ISO 13400有定义(TCP socket status)。
过程如下:
一、 外部测试设备和Server(DoIP边缘节点)生成套接字并进行连接,目标端口是TCP_DATA,这一步需要在所有TCP消息交换前完成;
二、将外部设备的逻辑地址分配给当前套接字,将连接设置成“已注册[等待身份验证]”的连接状态;;
三、完成或跳过身份验证机制后,将连接设置成“已注册[等待确认]”的连接状态;
四、完成或跳过确认机制后,将连接设置成“已注册[路由激活]”的连接状态;
完成了以上4步后,DoIP连接完成,之后可以进行DoIP诊断消息的请求和应答。
4.5. DoIP诊断消息的请求和应答
在DoIP实体收到任何类型的数据后,都会调用通用DoIP帧头处理程序,如果有效负载包含诊断信息(符合DoIP报文结构,且负载类型位是诊断相关的0x8001,0x8002,0x8003),那么就会调用诊断信息处理程序。
ISO 13400对整个诊断过程有具体的描述和定义,如下:
4.6. 断开DoIP连接
在外部测试设备不再需要连接时,通过TCP/IP协议机制关闭连接,然后DoIP实体会启动终止过程,释放相关资源,以便套接字可以用于新的连接。
如果连接没有关闭,应该通过解除激活计时器(General inactivity timer)或在执行活动检查(alive check)之后释放资源。
以上就是DoIP的实现步骤,接下来会 使用SPY3硬件和软件配合建立一个DoIP的Demo演示。
5. DoIP Demo
SPY3是一款车辆总线工具,其设备和软件能够支持DoIP诊断,本次使用3台SPY3的设备进行一个DoIP的Demo演示。
具体使用设备为:
2台FIRE2(绿盒)、1台旧款的FIRE(红盒)
FIRE2测试设备有1路100BASE-Tx的以太网,用于模拟边缘节点和作为外部的DoIP诊断实体,FIRE测试设备则是只有CAN和Lin通道,用于模拟车内的ECU回复诊断消息。
Demo系统连接如下:
2台FIRE2分别需要运行通过SPY3编写的外部测试设备用工程和边缘节点模拟工程,FIRE需要运行编写的ECU响应模拟工程。
在开始运行设备前,分别对2台FIRE2进行TCP/IP的设置,保证设备在同一个IP网段下,设置如下:
运行所有的设备和配套工程,在执行诊断的界面上按照以下方式操作:
可以从SPY3的Messages界面中看到整个的车辆识别和建立连接的过程中所有的报文,此时连接建立成功。
在SPY3的Diagnostic界面(专用诊断界面)可以对要发送的诊断命令的参数进行设置,需要选择诊断属于DoIP诊断,并且选择连接到的车辆。在选择设置完成后,点击”Launch”按钮就可以发送这条诊断请求,目前我们发送1001命令。
通过边缘节点运行的SPY3工程中Messages界面查看到整个诊断流程的报文,包含收到诊断报文→转换为CAN诊断信息发给ECU→ECU回复→将回复内容转换成DoIP报文回复给诊断设备的过程。
从诊断节点的反馈窗口可以看到本次的1001诊断成功,获得了Positive Response。
同样的,发送一条2701诊断指令,也是重复之前的过程,最终完成了车辆解锁。
以上就是关于DoIP的相关内容以及1个使用SPY3建立的DoIP Demo的演示。Demo中使用的设备、软件及相关问题欢迎私信留言互通有无,,谢谢大家!