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开发,回来看看这四层,思路就清晰了。
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)→ 网络与物理层(以太网)。每一层各司其职,缺一不可。