网络层需求
整车网络架构
车载网络架构示意图“从图中可以看出,汽车内部不同的ECU具有不同的网络协议,比如LIN、CAN、Ethernet等,那么想要实现各个ECU诊断功能,就需要不同的网络通信,如果外部测试设备采用DoIP的形式,而内部的ECU网络协议各不相同,如何能让外部测试设备和汽车内部所有节点通信呢?答案是网关,网关可以实现收发两端不同协议之间的通信,所以整车必须有一个DoIP网关,它是和外部进行DoIP诊断通信的唯一接口
”
可以看出
-
应用层需求
生活中常见的路由器,由于具有DHCP服务器的功能,就能为相连的设备分配IP地址
我们的手机,也具有无线DHCP服务器的功能,也就是热点功能
目前DoIP实体的IP地址都是静态写入的,所以这部分的内容暂时不表述
数据传输顺序
DoIP消息也是使用网络传输顺序-大端
DoIP协议
ISO 13400明确了两个注意点
- 任何以组播地址或广播地址为源IP地址的报文,都应忽略
- 每个udp数据报只能传输一个DoIP消息
-
DoIP消息通用结构
“
DoIP消息都是使用的通用结构,这点要明确
”- Protocol Version
DoIP协议版本号,1个字节
目前主流使用的是02的版本,03版本预留以后使用,ff是默认的版本
当通信一方支持的DoIP版本,另一方不支持时,就可以使用默认版本
- Inverse Protocol Version
反转协议版本,1个字节
它的值是协议版本号与0xff的异或运算
它与DoIP协议版本一起用于协议验证,以确保接收到DoIP消息格式正确
- Payload Type
DoIP数据类型,2个字节
所有类型如下
- 0x0000
Generic DoIP header negative acknowledge,通用DoIP报头否定确认
当DoIP实体接收到外部测试设备发来的DoIP消息时,首先会确认自己是否支持这条报文里的DoIP协议版本号、反向版本号、数据类型等
如果不支持,DoIP实体就会回复一条通用DoIP报头否定确认报文
通用DoIP头部否定确认报文结构这个NACK code占用一个字节,它不同的值表示不同的DoIP消息的错误类型,以及DoIP实体要如何处理接收到的DoIP消息
由于通用DoIP报头否定报文也是DoIP消息,所以它也使用DoIP消息通用结构,只是payload type是0x0000
当type为0x0000时,还会把NACK code的值放在payload里的第一个位置
下面看一下NACK code值对应的是哪种错误类型,以及这种错误类型的DoIP消息要如何处理
- 0x00
DoIP实体不支持DoIP协议版本或反向协议版本错误
这种情况下,DoIP实体需要关闭socket,这里的socket应该是tcp socket
- 0x01
DoIP实体不支持DoIP消息里的payload type
这种情况下,DoIP实体忽略这条错误的DoIP消息即可
- 0x02
DoIP消息payload长度超过了DoIP实体支持的最大DoIP消息的长度
这种情况下,DoIP实体忽略这条错误的DoIP消息即可- 0x03
DoIP消息payload长度超过了DoIP实体的DoIP程序的处理内存
这种情况下,DoIP实体忽略这条错误的DoIP消息即可
- 0x04
DoIP消息的Payload Length字段不正确
这种情况下,DoIP实体需要关闭socket,这里的socket应该是tcp socket
其他的一些注意点
“
通用DoIP报头否定报文是由DoIP实体发给外部测试设备的,外部测试设备收到这个报文后,不需要响应这个报文
”“
外部测试设备不应该发送通用DoIP报头否定报文,但是如果硬要发给DoIP实体,DoIP实体会忽略它,不作处理
”“
如果DoIP实体发送了错误的DoIP消息给外部测试设备,外部测试设备不需要对其进行处理,也就是没必要回复通用DoIP报头否定报文
”DoIP报头处理流程如下,建议详细分析
“
这里有个有趣的点,之前一直不明白Alive check request和Alive check response是DoIP实体发、外部测试设备响应,还是外部测试设备发、DoIP响应,通过上图应该就很明显了,DoIP实体发确认DoIP是否存活请求给外部测试设备,外部测试设备作出响应
-