DoIP是Diagnostic communication over Internet Protocol 的简称,顾名思义,就是通过网络协议进行诊断通信。这里的网络协议,指的就是OSI七层模型中,通用计算机网络所使用的从层4到层1这四层协议。
DoIP由ISO13400 系列标准定义,作为实现基于Ethernet的诊断通信的方案。本标准的各部分内容如下:
— Part 1: General information and use case defnition
— Part 2: Transport protocol and network layer services
— Part 3: Wired vehicle interface based on IEEE 802.3
— Part 4: Ethernet Diagnostic Connector
— Part 5: Conformance test specifcation
我这里只有前四个,不知道第五个测试标准是否已经定义完了。
DoIP的优势有以下几点:
ISO13400定义的DoIP诊断中各层次所使用的标准号
上图展示了DoIP通信完整协议栈所使用的标准号。
ISO13400-1处于应用层(层7)之上,是对一些通用信息、应用场景的描述。
应用层基于ISO14229-1和ISO14229-5,前者是UDS的完整定义,后者是UDS通过网络协议传输的实现。
会话层(层5),ISO14229-2对于所有的诊断通信都是一样的,目的是为上层提供统一的接口,使上层应用不需要随着底层通信技术的变化而改变。
传输层和网络层(层4和层3)由ISO13400-2定义,ISO13400-2中规定了DoIP通信在传输层中使用TCP和UDP协议,在网络层中使用IPv4或IPv6。此标准中还定义了专属于DoIP通信的信息内容,这些信息和上层的诊断命令共同构成了传给TCP或UDP协议的SDU。
ISO13400-2定义了DoIP诊断通信对Ethernet数据链路层(层2)和物理层(层1)的要求,比如,规定DoIP通信在这两层上支持100BASE-TX (100 Mbit/s Ethernet) 和10BASE-T (10 Mbit/s Ethernet) 两种方案。
DoIP数据的基本结构
DoIP数据映射到以太网帧中
DoIP数据作为SDU层层向下传递,直至构成完整的以太网帧,通过物理层的介质发送出去。DoIP的数据内容分为5个部分:
应用场景
ISO13400中定义了DoIP的4种使用场景,如下四幅图所示:
点对点直连
多台外部测试设备分别和多台汽车在局域网内通过交换机点对点连接
一台外部测试设备跨越本地网络与多台车辆连接
外部测试设备的多个应用层实体(在一台硬件或多台硬件上)与单个车辆连接
路由机制
根据隐藏在Gateway后面的控制器的诊断类型的不同(比如有的通过DoIP,有的通DoCAN等),DoIP的路由机制可以分为两种,分别是CutThrough(以太网对以太网) 和Store&Forward-Routing (以太网对CAN, CAN FD 和LIN等)。
我用PPT粗略地画了两个示意图展示一下:
CutThrough
Store&Forward-Routing
原理很简单,当网关后面被诊断的ECU也支持DoIP时,则网关每收到一个以太网帧,只需要更改以太网帧包头中的地址信息即可转发出去。而如果网关后面被诊断的ECU不支持Ethernet,则网关需要完整地接收所有的诊断数据之后,再从应用层开始重新组织适合其他总线传输的数据帧。
接下来介绍一下支持ethernet及DoIP的车载网络架构。
带ethernet节点的车载网络架构示意图
上面这张图简要描述了带ethernet节点的车载网络和外部网络中的测试设备之间的关联。在车载网络中,必须有且只有一个DoIP edge node gateway,它作为汽车对外部诊断设备的唯一接口。此外,还可能存在以下几种类型的节点:
对于外部测试设备来说,它们必须只能和DoIP edge node gateway直接连接并通信,与车载网络中其他ECU的通信必须由DoIP edge node gateway路由。
数据链路层与物理层
根据ISO-13400的要求,DoIP通信在物理层支持100BASE-TX (100 Mbit/s Ethernet) 和10BASE-T (10 Mbit/s Ethernet) 两种制式。DoIP设备的MAC地址也符合IEEE 802.3 的要求。
传输层与网络层
ISO-13400规定,DoIP通信在传输层上必须同时支持UDP和TCP,并将UDP和TCP的使用场合进行了定义,对所使用的端口号也进行了定义。后面稍微详细说明一下。
ISO-13400规定,DoIP通信在网络层上使用IPv6协议,但是为了后向兼容的原因,也支持IPv4。此外,对于IPv4来说,还要支持地址解析协议(ARP ),对于IPv6来说,还要支持邻居发现协议(NDP) ,这两个协议是用于在只知道IP地址的情况下获取MAC地址的。
DoIP的数据格式
DoIP的数据格式
上图展示了DoIP的数据格式,在DoIP技术(一)中我们已经对DoIp数据的五部分进行了简要介绍,其中第五部分的数据又可以再细分为三部分
在本篇中,我将对这几部分数据的取值范围进行举例说明:
DoIP数据的前两个部分分别是DoIP版本和DoIP版本逐比特取反,DoIP版本的取值范围如下:
0x00: reserved
0x01: DoIP ISO/DIS 13400-2:2010
0x02: DoIP ISO 13400-2:2012
0x03…0xFE: reserved by this part of ISO 13400
0xFF: default value for vehicle identifcation request messages
DoIP数据的第三个部分是data type,即描述数据包中的数据类型,取值范围如下图所示:
DoIP数据类型概览
上面这个表格不但定义了代表不同数据类型的值,还说明了具体的数据类型应该是通过UDP还是TCP来发,并定义了应该在哪个端口上发。
其中最常用的数据类型应该是0x8001,0x8002,0x8003了,代表的含义分别是诊断消息、诊断消息正响应和诊断消息负响应。
0x0001至0x0004用于汽车标识上报或请求,只能通过UDP报文来发送这种命令,主要用于在汽车和诊断仪进入网络之后、诊断连接建立之前的车辆发现过程。
0x0005 和0x0006标识的Routing activation request 和 response用于在socket建立之后,进行诊断通信的请求。
0x0007和0x0008用于Alive check,用于检查当前建立的诊断连接socket是否仍然在使用中,如果不再使用,则关闭socket释放资源。
DoIP数据的第三个部分是data length,这个很简单,就是标识后面的user data到底有多少。
DoIP数据的第五部分很简单,分别用来标识数据的发送者和接收者,以及具体的诊断数据。
下图是一个DoIP数据完整结构的举例:
DoIP数据完整结构举例
byte 0:ISO13400 版本
byte 1:ISO13400 版本逐比特取反
byte 2~3:数据类型,0x8001,表明这是一个诊断信息的数据包
byte 4~7:数据长度,在这个例子中的值是7,表示后面有7个字节的数据
byte 8~9:源地址
byte 10~11:目的地址
byte 12~13:具体的诊断命令,SID是22,表示读取,DID是0xF8 10
这个数据段作为SDU传递给下层协议,逐层封装成为完整的以太网帧发送出去。
DoIP实体内部管理诊断逻辑连接
DoIP连接状态
DoIP实体内管理着一个DoIP连接表(DoIP connection table ),用来记录和维护诊断通信的逻辑连接。上图就是这个表中的一个元素,即一个逻辑连接的状态机。上图中的方框就是连接所处的状态,[DoIP-XXX]是状态之间跳转时发生的事情。
[DoIP-127] 当一个新的套接字建立,逻辑连接的状态就从“listen”跳转到“socket initialized”,同时启动一个定时器, initial inactivity timer。
[DoIP-128] 当DoIP实体接收到tester发来的一个routing activation信息后,逻辑连接的状态就从“socket initialized”跳转到“Registered [Pending for Authentication]” ,此时 initial inactivity timer被停止,启动一个名为general inactivity timer的定时器。
[DoIP-129] 在完成Authentication之后,逻辑连接的状态就从“Registered [Pending for Authentication]”跳转到“Registered [Pending for Confrmation]” 。
[DoIP-130] 在完成Confrmation之后,逻辑连接的状态就从“Registered [Pending for Confrmation]”跳转到“Registered [Routing Active] ” 。
[DoIP-132] 如果initial timer 或general inactivity timer 过期后仍没收到后续请求,或者authentication 和 confrmation 被拒绝了,又或者外部测试设备对alive check 消息没有响应,则逻辑连接进入“Finalize”状态,此时TCP套接字将被关闭,并重新回到“listen”状态。
建立连接和车辆发现过程
在网络环境中建立连接和车辆发现的过程
当DoIP实体和外部测试设备都连接到一个网络中时,它们会利用DHCP协议获得一个属于自己的IP地址。在网络中,路由器作为DHCP server,为新加入到该网络中的设备分配IP地址。在获取IP地址之后,有两种车辆发现的方法,如上图所示。一种方法是车辆主动上报自己的信息3次。如果测试设备没有收到车辆主动上报的信息,则会发送一个identification request,如果网络中有车辆的话,车辆对这个请求进行响应,测试设备便发现了被测车辆。
DoIP 诊断通信会话建立和诊断消息发送过程
DoIP会话示例
上图中红线标识的内容就是在第二部分“ 建立连接和车辆发现过程”中的内容。在诊断仪发现车辆之后,会把车辆添加到自己的车辆列表中。当用户选择这个列表中的某辆车,就会发生蓝线标识出的过程,即在第一部分“ DoIP实体内部管理诊断逻辑连接”所描述的内容,如果连接建立成功,用户就可以对车辆进行诊断了。
接下来的过程就很简单了,用户给汽车发出诊断信息,网关会根据信息接收对象把诊断信息转发给网络中相关的ECU,当得到ECU 的响应之后,网关再把最终的响应发送给诊断仪。当用户选择退出时,用于DoIP通信的这个套接字就被关闭了。