徽州骆驼 · 2022年01月19日

DoIP---基于以太网的诊断

1b1bdd31cdf4048bb085fa221cc4c5c8.jpg

DoIP使用场景

无论是开发阶段,生产,还是售后阶段,都少不了对车内ECU进行诊断通信,而随着现在以太网在车内的大量使用,DoIP也是工程师们绕不开的话题。

在ISO13400-1:2011中,定义了这样几个DoIP的使用场景:

image.png

Tester既可以直接与车辆相连接:
8854aa9da54a909d2517d676a7f84560.jpg

也可以是tester通过网络互连与车辆相连接/通信:

9c7d9cae7f1827631afbc4056bc1db10.jpg

由于车内也有可能需要进行诊断工作,为了能够同时与车内或车外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

车辆网络

e84d8cd7d7e5d9aad1f1beeb59929ff0.jpg

我们可以用上图来理解使用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请求消息来轮询车辆的存在。

3a2cad8dc0f94e5035bd3236dc90eb51.jpg

ECU与外部诊断设备通过网络连接

过程和直连方式类似,当获取ip之后,ECU会广播发送车辆声明消息,如果外部诊断设备没能及时收到这个消息,那么会发送车辆ID请求消息进行轮询。

如果希望ECU在接收到外部诊断设备发送过来的车辆ID请求消息,会进行处理并响应的话,需要由应用层,或者集成代码中先调用DoIP\_ActivationLineSwitchActive()将Activation Line Status设置为active。

caf214dbbfedce99a80bf9b96c28c6e9.jpg

DoIP 会话

在完成车辆发现之后,外部诊断设备可以将车辆ID添加到“列表”中,不过这个功能不由ISO13400定义,设备软件开发者可自行定义是否需要,或者如何实现。当外部诊断设备告知工程师已经有车辆“上线”时,就可以准备进行DoIP会话了。

在进行任何诊断之前,还需要双方建立TCP连接。成功建立TCP连接后,ECU等待外部诊断设备发送路由激活请求,然后才会开始具体的诊断会话。

c09b9374f7ba7f0679c2b8c3821686cb.jpg

在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帧格式

f22f1667850c060b59c39ae6b27d2216.jpg

https://blog.csdn.net/AgingMo...

aeac9954fc356cf4705d11d0d3ca4c28.jpg
DoIP头部的Byte 0代表协议版本,例如0x02。

Byte 1 代表协议版本的补码,例如协议版本为0x02时,这一个Byte应当为0xFD。

Byte 2和Byte 3代表payload类型。

a82bdf427465687954cd3c4765fe8d01.jpg

接收方向的payload类型
7201666134d4be9369cd8f00194acde5.jpg

发送方向的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代表车辆声明消息,

084eda534fe5aef8bf5fc963c25a77fe.jpg

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代表路由激活响应消息,

aa423d437dbeae9bcbcaab0a65e5f54c.jpg

同样,最后还有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的为诊断实体状态响应,

3d90f194bc11ca4b53436182fa65177f.jpg

Node type为0x00代表是DoIP node,0x01代表是DoIP Gateway。Max open sockets为配置的DoIPMaxTesterConnections的值。Currently open socket代表当前激活的连接。Max data size为DoIPMaxRequestBytes的值,不过它只在DoIPEntirySattusMaxByteFieldUse设置为True的时候才有效。

诊断消息

payload类型为0x8001的为诊断消息,无论是请求还是响应都是使用0x8001,

2121d8bef5b1f2fe0cf8ce11cbc02b69.jpg

payload类型为0x8002的为诊断确认消息,

9786d9270d830a9fee56830bbfc2b556.jpg

payload类型为0x8003的为诊断否定确认消息,

dea2e1cee96c6acddb50c9b38100b39e.jpg

如不做特别说明,本文基于21-11版本的规范进行说明。同时本文不作各家供应商都完全实现的假设。

—END—

作者: KimChan
来源: https://mp.weixin.qq.com/s/rYoY6dF_dBcZfFNWsJiKAg
微信公众号:
 title=

推荐阅读:

更多汽车电子干货请关注汽车电子与软件专栏。
推荐阅读
关注数
5706
内容数
440
汽车电子与软件行业的相关技术报道及解读。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息