DoIP使用场景
无论是开发阶段,生产,还是售后阶段,都少不了对车内ECU进行诊断通信,而随着现在以太网在车内的大量使用,DoIP也是工程师们绕不开的话题。
在ISO13400-1:2011中,定义了这样几个DoIP的使用场景:
Tester既可以直接与车辆相连接:
也可以是tester通过网络互连与车辆相连接/通信:
由于车内也有可能需要进行诊断工作,为了能够同时与车内或车外tester进行通信,那么就要求ECU/DoIP节点可以拥有多个逻辑IP接口(例如共享同一个物理以太网接口/MAC地址)。ECU可以基于这些IP接口进行独立的DoIP通信:
- Activation-Line-Low触发仅限于特定的IP接口,每一个接口都有它自己对应的逻辑Activation Line,所以当Activation-Line-Low发生时,不是所有的DoIP连接都会关闭。
- 进行Routing Activation时,对于SA的检查只在进行Activation的接口上执行。也就是说,对于SA为X的tester,是可以在两个不同的接口上进行routing activation的。
进行车内DoIP诊断时,有一些和外界IP接口不一样的情况:
- 内部的IP接口在ECU的整个生命周期都是一直在线/使能的。
- 内部的IP接口一般都有分配一个固定IP地址
- 因此,内部的IP接口也不需要Activation-Line的过程,对于内部逻辑来说,也即Activation-Line一直是high。
总结来说,对于CP或者AP的DoIP模块,需要能配置工作在哪些接口上,并且对于每一个接口:
- 是否需要Activation Line
- 是否支持动态IP分配
- 是否&何时需要做Vehicle annoucement
车辆网络
我们可以用上图来理解使用DoIP的车辆网络架构,在车内有一个节点与外界网络或者诊断设备相连接,我们可以称他为edge node,其他的则是DoIP node。由于车内还存在非以太网通信的节点,将这些非以太网诊断消息转换称以太网诊断消息的节点也可以称作DoIP gateway。
建立连接与车辆发现
ECU与诊断设备直连
当ECU与诊断设备直连时,我们假设这种情况下是不存在DHCP服务器的,ECU需要根据配置好的静态ip分配给自己,或者使用AUTOIP获取。
当ECU/DoIP实体拥有ip地址后,它会广播发送一个车辆声明消息(vehicle announcement message),附带有VIN,EID,GID和逻辑地址信息,这条广播消息会基于UDP重复发送三次。
由于我们无法假定外部诊断设备能够及时收到ECU发出的车辆声明消息,所以外部诊断设备可能还需要通过发送车辆ID请求消息来轮询车辆的存在。
ECU与外部诊断设备通过网络连接
过程和直连方式类似,当获取ip之后,ECU会广播发送车辆声明消息,如果外部诊断设备没能及时收到这个消息,那么会发送车辆ID请求消息进行轮询。
如果希望ECU在接收到外部诊断设备发送过来的车辆ID请求消息,会进行处理并响应的话,需要由应用层,或者集成代码中先调用DoIP\_ActivationLineSwitchActive()将Activation Line Status设置为active。
DoIP 会话
在完成车辆发现之后,外部诊断设备可以将车辆ID添加到“列表”中,不过这个功能不由ISO13400定义,设备软件开发者可自行定义是否需要,或者如何实现。当外部诊断设备告知工程师已经有车辆“上线”时,就可以准备进行DoIP会话了。
在进行任何诊断之前,还需要双方建立TCP连接。成功建立TCP连接后,ECU等待外部诊断设备发送路由激活请求,然后才会开始具体的诊断会话。
在TCP连接建立之后,DoIP会开启DoIPInitialInactivityTime和DoIPGeneralInactivityTime。DoIPInitialInactivityTime的作用是避免TCP socket一直没收收到任何路由激活请求或者收到了不合法的DoIP消息,timer超时之后会关闭TCP连接,恢复到监听状态。而DoIPGeneralInactivityTime则是为了避免网络通信出现故障,或者长时间没有进行任何诊断消息的收发而占用TCP连接的情况。
当接收到从外部诊断设备发送过来的路由激活请求后,DoIPInitialInactivityTime随即停止,socket状态变为“registered [Routing Active]”,ECU会恢复正响应,然后可以开始接收并处理DoIP消息了。
当接收到消息时,DoIP首先会调用DoIP header handler,如果包含类型为0x8001的诊断消息,那么接下来会由message handler做进一步处理。
此时DoIP会首先回复一条确认消息,告诉外部诊断设备已经接收到了诊断请求,之后DoIP节点可能会开始交由DCM处理诊断请求,或者作为gateway继续将消息转发给其他非DoIP节点。在目标ECU处理完UDS诊断消息时,目标ECU会回复诊断响应消息。
如果连接不再需要,那么应当关闭TCP连接,或者在一段时间超时之后ECU会自己断开连接。
DoIP帧格式
https://blog.csdn.net/AgingMo...
DoIP头部的Byte 0代表协议版本,例如0x02。
Byte 1 代表协议版本的补码,例如协议版本为0x02时,这一个Byte应当为0xFD。
Byte 2和Byte 3代表payload类型。
接收方向的payload类型
发送方向的payload类型
Byte4-7代表payload长度(不包含头部长度),单位为字节。
Payload类型
Generic acknowledge
收到不合法的DoIP头部时,应当回复payload类型为0x0000的DoIP报文,并在回复的报文的payload中带上NACK代码,例如0x00代表协议信息不正确,0x01代表payload类型不支持,0x02代表payload长度超过所配置的DoIPMaxRequestBytes的值,0x03代表DoIP当前buffer空间不够,0x04代表payload长度对于当前的payload类型是不合法的
Vehicle Identification
payload类型为0x0001的消息代表车辆ID请求,payload长度恒为0,当DoIP收到后需要在DoIPInitialVehicleAnnouncementTime后回复payload类型为0x0004的车辆声明消息。
payload类型为0x0002的消息代表带EID的车辆ID请求,长度应当为6,在DoIPUseMacAddressForIdentification设置为True的情况下,DoIP会将收到的6个byte的payload数据与本机MacAddress作比较,如果匹配的话会回复payload类型为0x0004的车辆声明消息。
payload类型为0x0003的消息代表带VIN的车辆ID请求,长度应当为17,接收到的这17个byte会与Dcm_GetVin()返回的值作比较,如果匹配,那么DoIP会回复payload类型为0x0004的车辆声明消息。
payload类型为0x0004代表车辆声明消息,
LA代表DoIPLogicalAddress。
EID代表DoIP Entity ID,如果DoIPUseMacAdressForIdentification设置为True,那么ID就是MAC地址,如果设置为false,那么就是DoIPEID。
GID代表Group ID。
Routing activation
payload 类型为0x0005代表路由激活请求消息,长度为7或11个byte。头两个byte代表source address,第三个byte代表激活类型,接下来的4个byte为保留位,恒为0,最后4个byte可选,为OEM指定的数据。
payload 类型为0x0006代表路由激活响应消息,
同样,最后还有4个可选byte,为OEM指定的数据。Logical Address Tester为路由激活请求消息中的Tester SA地址,而Logical Address DoIP entity则是配置的DoIPLogicalAddress的值。
payload类型为0x0007的是Alive check请求消息,它不需要带payload数据,只需要设置payload类型为0x0007。当发送完alive check请求后,DoIP模块应当等待DoIPAliveCheckResponseTimeout时间以等待响应,如果没有在这个时间内收到alive check响应报文,那么对应的socket connection将被重置。
payload类型为0x0008的是Alive check响应消息,2个byte的数据为source address。
Node Information
payload类型为0x4003的为诊断电源模式信息请求(diagnostic power mode information request),payload长度为0。
payload类型为0x4004的为诊断电源模式信息响应(diagnostic power mode information response),有一个byte的payload,代表诊断电源模式,这个值通过调用DoIPPowerModeCallback获取。
payload类型为0x4001的为诊断实体状态请求,payload长度为0.
payload类型为0x4002的为诊断实体状态响应,
Node type为0x00代表是DoIP node,0x01代表是DoIP Gateway。Max open sockets为配置的DoIPMaxTesterConnections的值。Currently open socket代表当前激活的连接。Max data size为DoIPMaxRequestBytes的值,不过它只在DoIPEntirySattusMaxByteFieldUse设置为True的时候才有效。
诊断消息
payload类型为0x8001的为诊断消息,无论是请求还是响应都是使用0x8001,
payload类型为0x8002的为诊断确认消息,
payload类型为0x8003的为诊断否定确认消息,
如不做特别说明,本文基于21-11版本的规范进行说明。同时本文不作各家供应商都完全实现的假设。
—END—
作者: KimChan
来源: https://mp.weixin.qq.com/s/rYoY6dF_dBcZfFNWsJiKAg
微信公众号:
推荐阅读:
更多汽车电子干货请关注汽车电子与软件专栏。