车载以太网之DoIP协议_第一篇

  • 1、DoIP含义
  • 1.1 DoIP使用场景
  • 1.2 DoIP在Autosar中的位置
  • 2、以太网协议
  • 2.1 物理层与数据链路层
  • 2.2 网络层与传输层
  • 2.3 DoIP数据格式
  • 2.3.1 Protocol version与Inverse protocol version
  • 2.3.2 Payload type
  • 2.3.3 Payload类型
  • 2.3.3.1 Generic acknowledge(0x0000)
  • 2.3.3.2 Vehicle Identification(0x0001至0x0004)
  • 2.3.3.3 Routing activation(0x0005 和0x0006)
  • 2.3.3.4 Alive check(0x0007和0x0008)
  • 2.3.3.5 Node Information(0x4001,0x4002,0x4003,0x4004)
  • 3、诊断发送


1、DoIP含义

DoIP(Diagnostic communication over Internet Protocol)其实就是基于以太网的通讯协议对UDS协议的数据进行传输。
其本身也是一种协议,规范于ISO13400标准。由于DoIP可以传输大量数据,以及响应速度快,且可以通过以太网进行远程诊断,因此DoIP逐步成为代替传统的CAN等总线方式,成为车载网络诊断的必然趋势。

1.1 DoIP使用场景

车辆检查与维修、车辆/ECU 软件刷写、车辆/ECU 组装线检查与维修。

1.2 DoIP在Autosar中的位置

python 车载以太网通讯 车载以太网 协议_udp

2、以太网协议

2.1 物理层与数据链路层

ISO-13400规定,DoIP通信在物理层支持100BASE-TX (100 Mbit/s Ethernet) 和10BASE-T (10 Mbit/s Ethernet) 两种制式。
DoIP相关设备的MAC地址也与IEEE 802.3的要求相符合。

2.2 网络层与传输层

网络层:ISO-13400规定,DoIP通信在网络层上支持IPv6和IPv4协议。对于IPv4,要支持地址解析协议(ARP ),对于IPv6要支持邻居发现协议(NDP) ,这两个协议是用于在只知道IP地址的情况下获取MAC地址的。
传输层:ISO-13400规定,DoIP通信在传输层上需要同时支持UDP协议与TCP协议,并对使用的端口号进行了定义,端口号13400。

2.3 DoIP数据格式

python 车载以太网通讯 车载以太网 协议_udp_02

Protocol version [1 byte]

Inverse protocol version [1 byte]

Payload type [2 byte]

Payload length [4 byte]

负载[N byte] 根据实际的payload type,负载数据会不同

2.3.1 Protocol version与Inverse protocol version

通常Protocol version为0x02,Inverse protocol version是Protocol version的取反的值,此例0x02去反后为0xFD。
Protocol version可以为0xFF,这个值的作用是,当客户端和服务端的协议版本不匹配时设置此值可以绕过协议头版本不匹配而拒绝请求的情况。

2.3.2 Payload type

代表DoIP协议栈所能支持的功能

python 车载以太网通讯 车载以太网 协议_网络_03


接收方向的payload类型

python 车载以太网通讯 车载以太网 协议_数据_04


发送方向的payload类型

2.3.3 Payload类型

2.3.3.1 Generic acknowledge(0x0000)

DoIP报头否定响应报文格式。收到不合法的DoIP头部时,应当回复payload类型为0x0000的DoIP报文,并在回复的报文的payload中带上NACK代码

python 车载以太网通讯 车载以太网 协议_tcp/ip_05

2.3.3.2 Vehicle Identification(0x0001至0x0004)

用于汽车标识上报或请求,只能通过UDP报文来发送这种命令,主要用于在汽车和诊断仪进入网络之后、诊断连接建立之前的车辆发现过程。
0x0001:的消息代表车辆ID请求,payload长度恒为0,当DoIP收到后需要在DoIPInitialVehicleAnnouncementTime后回复payload类型为0x0004的车辆声明消息。
0x0002:的消息代表带EID的车辆ID请求,长度应当为6,在DoIPUseMacAddressForIdentification设置为True的情况下,DoIP会将收到的6个byte的payload数据与本机MacAddress作比较,如果匹配的话会回复payload类型为0x0004的车辆声明消息。

0x0003:代表带VIN的车辆ID请求,长度应当为17,接收到的这17个byte会与Dcm_GetVin()返回的值作比较,如果匹配,那么DoIP会回复payload类型为0x0004的车辆声明消息。

0x0004:代表车辆声明消息

python 车载以太网通讯 车载以太网 协议_数据_06


python 车载以太网通讯 车载以太网 协议_python 车载以太网通讯_07


EID:DoIP Entity ID,如果DoIPUseMacAdressForIdentification设置为True,那么ID就是MAC地址,如果设置为false,那么就是DoIPEID。

GID代表Group ID。

2.3.3.3 Routing activation(0x0005 和0x0006)

标识的Routing activation request 和 response用于在socket建立之后,进行诊断通信的请求。

0x0005:代表路由激活请求消息,长度为7或11个byte。头两个byte代表source address,第三个byte代表激活类型,接下来的4个byte为保留位,恒为0,最后4个byte可选,为OEM指定的数据。

python 车载以太网通讯 车载以太网 协议_数据_08

0x0006:代表路由激活响应消息。

python 车载以太网通讯 车载以太网 协议_tcp/ip_09

2.3.3.4 Alive check(0x0007和0x0008)

用于Alive check,用于检查当前建立的诊断连接socket是否仍然在使用中,如果不再使用,则关闭socket释放资源。

0x0007:是Alive check请求消息,它不需要带payload数据,只需要设置payload类型为0x0007。当ECU发送完alive check请求后,DoIP模块应当等待DoIPAliveCheckResponseTimeout时间以等待响应,如果没有在这个时间内收到来自诊断设备的alive check响应报文,那么对应的socket connection将被重置。

python 车载以太网通讯 车载以太网 协议_tcp/ip_10

0x0008:是Alive check响应消息,2个byte的数据为source address。

python 车载以太网通讯 车载以太网 协议_网络_11

2.3.3.5 Node Information(0x4001,0x4002,0x4003,0x4004)

0x4001:为诊断实体状态请求,payload长度为0。

0x4002:为诊断实体状态响应。

0x4003:为诊断电源模式信息请求(diagnostic power mode information request),payload长度为0。

0x4004:为诊断电源模式信息响应(diagnostic power mode information response),有一个byte的payload,代表诊断电源模式,这个值通过调用DoIPPowerModeCallback获取。

2.3.3.5 Diagnostic Message(0x8001,0x8002,0x8003):分别代表的含义分别是诊断消息、诊断消息正响应和诊断消息负响应。

python 车载以太网通讯 车载以太网 协议_网络_12


诊断报文格式

0x8001:为诊断消息,无论是请求还是响应都是使用0x8001。

0x8002:为诊断确认消息。

0x8003:为诊断否定确认消息。

python 车载以太网通讯 车载以太网 协议_udp_13


这里的源地址和目标地址都是ECU的逻辑地址

3、诊断发送

python 车载以太网通讯 车载以太网 协议_数据_14


请求DID F810读取

byte 8~9:源地址(ECU的逻辑地址)

byte 10~11:目的地址(ECU的逻辑地址)

byte 12~13:具体的诊断命令,SID是22,表示读取,DID是0xF810