一文了解什么是DoIP协议(超详细)

UDS诊断作为汽车ECU里的一个服务功能,位于应用层,它的实现需要有网络的支撑,我们把基于CAN总线实现的UDS诊断称为DoCAN,基于Ethernet实现的UDS诊断称为DoIP

DoIP

DoIP

Diagnostic communication over Internet Protocol,我们把通过以太网协议,承载UDS数据,实现诊断通信的这种方式称为DoIP

DoIP的好处有哪些呢?

相比DoCAN中CAN网络的封闭性,DoIP由于Ethernet的互联互通,可以实现车与车、车与人的远距离诊断通信

DoIP在传输层以下的规范遵循ISO 13400,而应用层还是遵循ISO 14229不变,这样可以保证UDS诊断在不同车载网络上的可移植性

在这里插入图片描述

ISO 13400-2规定了外部测试设备与车辆ECU之间的诊断通信要求,包括:

  • 网络层协议IP
  • 传输层协议TCP/UDP
  • 对网关的要求(网关如何集成到现有网络总)
  • 对测试设备的要求(如何发现车辆并建立通信)

支持DoIP的车辆网络架构图如下

在这里插入图片描述

从这张图上可以看出:汽车内部必须有一个DoIP的总网关,它作为和外部的诊断设备DoIP通信的唯一接口


网络层要求

MAC层

没什么可说的,和标准的以太网物理链路层一样,都是基于IEEE 802.3

网络层

和标准以太网网络层一样,但是需要注意的一点是,DoIP在以太网IP层首先IPv6协议,同时兼容IPv4

传输层

TCP

除了遵循TCP协议的标准规范外,DoIP在TCP协议上还应遵守:

  • 支持DoIP的ECU的诊断服务创建的socket必须监听在端口号13400上,外部测试设备通过连接此端口建立连接
  • 每个支持DoIP的ECU必须支持n+1个并发的TCP socket连接,这是为了防止有多个外部测试设备同时和ECU进行诊断通信
  • 外部测试设备创建的socket应选择本地端口,本地端口即系统随机的端口

TCP连接的过程

在这里插入图片描述

UDP

UDP协议在DoIP中的作用和使用的端口号为:

在这里插入图片描述

车辆发现的两种方式:

  • DoIP设备启动后,通过UDP向13400端口广播发送vehicle announcement message,源端口号为13400或随机,里面包含此DoIP设备的基本信息,外部测试设备需要监听13400来接收这些信息
  • 外部测试设备通过UDP广播发送request消息,目标端口号是13400,DoIP设备监听在13400端口,接收此request并响应

DoIP Protocol

DoIP报文的结构

在这里插入图片描述

DoIP Header

在这里插入图片描述

  • 其中Inverse Protocol Version是对Protocol Version的依比特取反
  • 而Payload Type则是表示这个DoIP报文的用途

Payload Type

在这里插入图片描述
在这里插入图片描述

其中最常用的几个:

  • 0x0001和0x0004用于汽车诊断连接建立之前的车辆发现过程
  • 0x0005和0x0006用于tcp socket连接成功后的诊断连接请求与响应
  • 0x8001、0x8002、0x8003分别表示诊断消息、诊断消息正响应、诊断消息负响应
  • 0x0007和0x0008用于检查建立的诊断连接是否仍然在使用中,如果不再使用,则关闭socket

从中可以看出DoIP诊断通信前需要做的事:

  • 车辆发现,有两种方式
  • DoIP设备启动后,首先通过UDP广播的形式把一条DoIP报文(vehicle announcement message,Payload Type为0x0004)发给网络上的所有的其他节点,其中就包括诊断仪,目的端口是13400,其中这条消息携带了DoIP设备的DoIP版本、VIN、logical address等信息,这条信息会发送三次,而之前监听在13400端口的诊断仪接收到这条信息,就知道了DoIP设备的基本信息
  • 如果诊断仪没有收到,还有一种办法,就是诊断仪这边主动请求,通过UDP广播的形式,主动发一条DoIP request消息(Payload Type为0x0001),目的端口号是13400,而之前启动后就一直监听在13400的DoIP设备,接收到这条消息后,就会回复一条携带自己信息的response给诊断仪
  • 建立TCP连接

诊断仪通过创建tcp socket,然后调用connect方法向DoIP设备发起TCP连接请求(目的ip是DoIP设备ip,目的端口号是13400),而DoIP设备在启动前已经通过创建tcp socket监听在13400端口,接收到tcp连接请求后就会完成三次握手

  • 建立诊断连接

在TCP连接建立后,诊断仪还需要发送一条Routing activation request的DoIP报文给DoIP设备,DoIP设备收到后会回复一条Routing activation response的DoIP报文,此时诊断连接建立,双方可以诊断通信


网关

汽车网络中由于同时存在多种网络,而造成不同网络上的诊断功能无法互相通信,这时候就需要网关的作用

比如说:
对于DoCAN和DoIP,网关起到的作用就是接收、解封装、封装、发送
DoCAN报文需要发给DoIP设备,网关会先把DoCAN的CAN网络头部剥离,留下UDS数据,然后再用这个UDS数据封装一条完整的DoIP报文,发出去
DoIP报文需要发给DoCAN设备,网关会先把DoIP的所有头部剥离,留下UDS数据,然后用这个UDS数据封装一条完整的DoCAN报文,发出去


DoIP协议(Diagnostics over Internet Protocol)是一种在汽车电子诊断应用中使用的网络协议,它可以将汽车中的诊断数据通过标准的Internet协议传输给远程诊断设备,从而允许远程的诊断过程和在线的软件更新。下面是一个简单的DoIP协议示例: ``` // DoIP消息头 typedef struct { uint16_t payload_size; // 消息体大小 uint8_t protocol_version; // 协议版本号 uint8_t inverse_version; // 反转协议版本号 uint32_t magic_number; // 魔数 uint16_t message_type; // 消息类型 uint16_t reserved; // 保留字段 } doip_header_t; // DoIP连接请求消息体 typedef struct { uint16_t source_address; // 源地址 uint16_t target_address; // 目标地址 uint16_t tester_address; // 测试器地址 uint16_t vehicle_address; // 车辆地址 uint8_t reserved[8]; // 保留字段 } doip_connect_request_t; // DoIP连接响应消息体 typedef struct { uint16_t source_address; // 源地址 uint16_t target_address; // 目标地址 uint16_t tester_address; // 测试器地址 uint16_t vehicle_address; // 车辆地址 uint8_t protocol_version; // 协议版本号 uint8_t inverse_version; // 反转协议版本号 uint8_t result_code; // 结果码 uint8_t reserved[3]; // 保留字段 } doip_connect_response_t; // DoIP发送数据消息体 typedef struct { uint8_t data[1024]; // 数据 } doip_send_data_t; ``` 需要注意的是,这只是一个简单的示例,实际的DoIP协议中可能涉及到更多的消息类型和字段。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汽车通信技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值