DoIP diagnositic communication over internet protocal, 基于以太网的一种诊断协议,简单的来说就是基于TCP/IP实现的协议,基本上是用于实现UDS协议通过以太网对ECU的诊断,刷写。因为新能源汽车使用以太网架构,已经变成了一种流行的方式,所以UDS DoIP 基于以太网的实现,也变成了一种趋势。同时也可以根据DoIP协议自行扩展。

DoIP 并不仅仅是UDS的载体,DoIP是诊断的入口。DoIP功能:车辆发现,状态查询,路由激活(含安全认证),诊断数据收发。

DoIP 网络拓扑

在这里插入图片描述

DoIP 网络中各个角色:

(1) ExternalTest Equipment :

车辆外部设备是指存在车辆网络外部,通过DoIP协议与车辆内部子网DoIP Entity实现通讯建立的设备,通常为OBD诊断仪或者其他诊断客户端。

(2)DoIP edge Node gateway:

DoIP边缘节点是在车辆内部,与诊断口Ethernetactivation line直连的节点,并且其中有一个连接引脚是Activation line。
这个角色是一个Gateway,子网挂着若干ECU。这个角色可以同时支持DoIp的Server和client端。
server: 测试设备可以诊断该网关下的某个节点。????
在这里我认为被诊断的就是server端,发起诊断的就是客户端。
在OTA场景中,DoIp edge node gateway的应用层可以跑一个OTA客户端程序,进行对内网ECU的诊断和刷写,此时就是一个client。

(3)DoIPGateway :

DoIP网关是在车辆网络内部,实现与本模块及所连接多个子网内ECU通讯访问的节点。DoIP gateway与角色二 DoIP edge node gateway区别不是很大。实际的应用场景通常会让MCU充当这个角色,而MPU充当DoIP edge node gateway的角色,也有反过来的情况,那么该角色通常单单的跑Server端程序。

(4)DoIP node

该角色很好理解,对支持以太网连接的同时支持DoIP协议的ECU认为是DoIP node。

本章小结

整个车辆网络由四个角色组成,外部测试设备作为客户端,对车内网的各个支持DoIP协议栈的ECU进行诊断。(部分CAN ECU通常挂载在MCU上,由MCU进行DoIP转DoCAN的路由)车外网的外部测试设备通过OBD-II与车内网的edge gateway进行通信,edge gateway用来使能车内网的DoIP功能。在路由打通后,发送的诊断数据根据目的地址的不同分别流向车内网的不同ECU。

端口

从DoIP名字可以看出,该协议是在TCP/IP之上的,那么要想接收DoIP协议的报文,协议书规定需要监听一个专门分配给DoIP协议栈使用的端口号即13400,UDP,TCP都要监听此接受端口,而发送端口是在一个范围内的随机值[49152~65535],当然代码中协议栈要对对端的发送端口进行缓存,用于回送数据。
指定了端口号,客户端和服务端可以在此端口上进行收发数据。那么对该端口收到的数据是否真的是DoIP报文,就能对该网络报文进行解析。(有可能是网络攻击,有可能是其它应用恰好使用了该端口号)
对收到的报文进行解析,就涉及到DoIP协议的构成,只有符合该写一点规范才认为是合法有效的DoIP报文。

本章小结

一直监听13400这个端口的数据,一但发现符合DoIP协议的数据,进行通信。

协议

DoIP报文由协议头(header)+ 负载(payload)组成
协议头[8 byte]由下面四个字段组成
在这里插入图片描述
Protocol version [1 byte]
Inverse protocol version [1 byte]
Payload type [2 byte]
Payload length [4 byte]
负载[N byte] 根据实际的payload type,负载数据会不同
3.3Protocol version与Inverse protocol version
通常Protocol version为0x02,目前0x02以上的值目前是reserved状态
Inverse protocol version是Protocol version的取反的值,此例0x02去反后为0xFD
协议书上特别说明了Protocol version可以为0xFF,设这个值的作用是,当客户端和服务端的协议版本不匹配,可以设置此值绕过协议头版本不匹配而拒绝请求的case。
3.4 Payload type
payload type可以代表DoIP协议栈所能支持的功能,列举如下(特意分开了Server支持的type及Client支持的type)
在这里插入图片描述
在这里插入图片描述
如上分开描述,是因为在代码实现上,可以将逻辑拆分。

即Server端只关心自己支持的payload type,客户端只关心自己支持的payload type,不支持的可以忽视掉。有利于模块拆分及组合,有利于实现上一节所讲个各个角色,将来通过配置文件的配置,来表示不同的角色。

3.5 Payload length

payload length这里分配了4字节,也就是所DoIP报文最大传输4 GB /4294967295 bytes,即0xFFFFFFFF。它只是个允许的范围,通常来说通过DoIP进行诊断也就几字节到几十字节,而升级通常ECU的升级包也就几MB。所以4 GB只是个理论上限。
该值可以做长度的有效性验证,因为除了诊断数据,其它payload type都是有固定长度的。
还可以做什么?其实做开发时还要考虑遇到如下情况该怎么处理

  1. 数据粘连
  2. 数据截断
  3. 异常的超大size
  4. 超过协议栈可以处理size
    3.6 Payload
    这里的负载是指的是DoIP协议的负载,当然当Payload type为诊断类型时,其负载除了DoIP自身的内容,
    还包含了UDS数据,供上层UDS模块进行进一步的解析。
    因为每个Payload type负载都不同,这里不做解释,在后续功能章节,进行详细的介绍

Doip流程可分为三大步:

建立连接,发现车辆-建立会话-发送诊断

未清晰知识点:
利用swich将MPU,MCU,其它以太网ECU统统通过以太网进行连接,并对外网与内网进行隔离。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐