DoIP诊断协议实战演练 - 第1节

1.1 为什么需要DoIP?——从CAN诊断说起

做汽车诊断的工程师,没人不认识CAN总线。过去十几年,咱们一直用CAN做UDS诊断,速度虽然够用,但瓶颈越来越明显。

我记得2018年做一个项目,客户要求刷写一个整车的固件,光一个域控制器就有200MB。用CAN诊断刷,500kbps的速率,算上协议开销,刷一次要40多分钟。客户当场就急了——这效率,产线一天能下线几台车?

说白了,CAN诊断的痛点就三个:

  • 带宽太低——经典CAN最高500kbps,CAN FD勉强到2Mbps,刷大软件还是慢
  • 连接麻烦——必须用VCI(车辆通信接口),笔记本得拖着个盒子
  • 远程诊断难——CAN天生是车内总线,想远程连车?得加网关、加4G模块、搭VPN

这时候,DoIP(Diagnostics over Internet Protocol)就登场了。它直接把诊断报文封装在TCP/IP里,跑在以太网上。你想想看,以太网是什么速度?100Mbps起步,千兆也不稀奇。刷个200MB的固件,几分钟搞定。

核心观点:DoIP不是要取代UDS,而是给UDS换了一条高速公路。诊断协议还是那个UDS,底层传输从CAN换成了以太网+IP。

1.2 DoIP在汽车诊断中的角色

DoIP在整车诊断架构里,到底扮演什么角色?我习惯用一个三层模型来理解:

层级 角色 典型协议/技术
应用层 诊断功能定义 UDS (ISO 14229)
传输层 诊断数据封装与路由 DoIP (ISO 13400)
网络层 物理连接与通信 TCP/IP, 以太网

你看,DoIP卡在中间。它不关心上层诊断业务——读故障码、刷写、会话控制这些,那是UDS的事。它也不管底层怎么传——是双绞线还是光纤,是100M还是1000M,那是以太网的事。

DoIP只做一件事:把UDS报文正确地、可靠地送到目标ECU,再把响应拿回来。

嗯,这里要注意。DoIP不是简单地把CAN报文转成IP包。它有一套完整的机制:

  • 车辆发现——诊断仪怎么找到车?用DHCP拿IP,用VIN广播识别
  • 连接管理——同时允许多少个诊断会话?怎么防止冲突?
  • 路由激活——诊断仪要发一条指令告诉网关:“我要开始诊断了”
  • 数据封装——UDS报文怎么塞进TCP流里?头部加什么信息?

我在一个量产项目上吃过亏。当时没仔细看DoIP的连接管理,测试时两台诊断仪同时连车,结果网关直接拒绝服务。后来查标准才发现,ISO 13400明确规定了最大并发连接数,而且要求诊断仪必须先发路由激活报文。

1.3 DoIP协议栈架构

DoIP的协议栈,从下往上分四层。我画了一张图,帮你把结构看清楚:

DoIP协议栈架构 应用层 UDS诊断服务(ISO 14229) DoIP层(ISO 13400) 车辆发现 · 连接管理 · 路由激活 · 数据封装 DoIP头部(版本号 + 负载类型 + 长度) 传输层 TCP(可靠流) / UDP(发现与广播) 网络层与物理层 IPv4/IPv6 · 以太网MAC · 100BASE-T1 / 1000BASE-T1 诊断仪 车辆网关

这张图我建议你存下来。每次做DoIP开发,回来看看这四层,思路就清晰了。

1.3.1 应用层——UDS诊断服务

这一层你肯定熟。读故障码(0x19)、写数据(0x2E)、例程控制(0x31)、请求下载(0x34)……所有诊断业务都在这里。DoIP不碰这些,它只负责把UDS报文原封不动地传过去。

我的习惯:开发DoIP时,先把UDS服务调通。用CANoe或者PC模拟器,确保诊断仪和目标ECU的UDS交互没问题。然后再加DoIP层,否则出了问题你分不清是UDS的锅还是DoIP的锅。

1.3.2 DoIP层——核心逻辑

这是ISO 13400定义的核心。我挑几个关键点说说:

  • 车辆发现(Vehicle Discovery):诊断仪发UDP广播,问“谁在?报上VIN”。网关回复自己的IP和VIN。这个过程叫DoIP实体公告。
  • 路由激活(Routing Activation):诊断仪连上TCP端口13400后,必须先发一条路由激活请求。网关验证通过后,才允许后续诊断通信。这是安全门槛。
  • 诊断数据封装:每个UDS报文前面加一个DoIP头部,包含协议版本号、负载类型、负载长度。接收方根据头部信息拆包、重组。

我曾经遇到一个坑:某款网关的路由激活超时设得太短,诊断仪刚连上还没来得及发激活请求,网关就把TCP连接断了。后来我们两边协商,把超时从2秒改到5秒,问题解决。

1.3.3 传输层——TCP与UDP的分工

DoIP用了两种传输协议,各有各的活:

协议 端口 用途 特点
UDP 13400 车辆发现、诊断仪在线检测 无连接、广播、轻量
TCP 13400 路由激活、诊断数据交换 可靠、有序、面向连接

UDP负责“找人”,TCP负责“干活”。这个分工很合理——发现阶段不需要可靠传输,丢了就再广播一次;诊断数据必须可靠,所以用TCP。

1.3.4 网络层与物理层——以太网上车

这一层是DoIP的底座。现在主流方案有两种:

  • 100BASE-T1:单对双绞线,传输距离15米,功耗低,适合车内ECU互联
  • 1000BASE-T1:千兆速率,用于域控制器之间的大数据交互

IP层通常用IPv4,IPv6也有支持,但实际项目里IPv4占绝大多数。DHCP用来给诊断仪和ECU分配IP地址,也有项目用Auto-IP(链路本地地址)。

注意:DoIP的物理层和普通以太网不一样。100BASE-T1用的是BroadR-Reach技术,不能直接插家用路由器。调试时需要用专用的DoIP接口卡或者带T1端口的交换机。我第一次用普通网线连DoIP网关,死活不通,查了半天才发现是物理层不匹配。

1.4 小结

这一章我们聊了DoIP的来龙去脉。说白了,DoIP就是给UDS诊断换了个更快的通道——从CAN的500kbps跳到以太网的100Mbps起步。它在诊断架构里扮演传输层的角色,不碰业务逻辑,只负责可靠传数据。

协议栈四层结构:应用层(UDS)→ DoIP层(ISO 13400)→ 传输层(TCP/UDP)→ 网络与物理层(以太网)。每一层各司其职,缺一不可。