4、DoIP节点发现与声明:车辆声明报文(VAM)、车辆识别请求与响应、节点状态管理
好,咱们进入第四章。这一章讲的是DoIP网络里最基础、也最核心的一个环节——节点发现与声明。
你想想看,一辆车里有几十个ECU,诊断仪一插上去,怎么知道谁是谁?哪个是网关?哪个是ABS?哪个是发动机控制器?总不能一个个去问吧?
嗯,DoIP设计了一套非常巧妙的机制。说白了,就是让节点自己“喊一嗓子”,告诉别人“我在这儿,我是谁”。
4.1 车辆声明报文(VAM)
VAM,全称 Vehicle Announcement Message。这是每个DoIP节点上线后,主动发送的第一条报文。
我记得第一次在实车上抓VAM时,还闹了个笑话。我以为所有节点都会同时发,结果发现它们是有顺序的。网关先发,然后其他ECU再发。这个顺序其实跟网络拓扑有关。
VAM的触发条件:
- 节点上电初始化完成
- 物理链路建立(比如以太网连接成功)
- 收到“车辆识别请求”时,也会触发一次VAM
VAM报文结构(我习惯用Wireshark抓包看):
Ethernet Header
Destination: 01:0x0C:CD:01:00:00 (DoIP广播MAC)
Source: 节点自己的MAC地址
IP Header
Destination: 239.192.255.255 (DoIP组播地址)
Source: 节点自己的IP地址
UDP Header
Destination Port: 13400 (DoIP默认端口)
DoIP Header
Protocol Version: 0x02 (ISO 13400-2)
Inverse Protocol Version: 0xFD
Payload Type: 0x0004 (VAM)
Payload Length: 32字节
VAM Payload
Logical Address: 0x0E80 (网关的地址,举例)
EID (Entity ID): 6字节,全球唯一
GID (Group ID): 6字节,组标识
Further Action Required: 0x00 (无后续动作)
VIN (可选): 17字节,车辆识别码
Reserved: 4字节
关键点:VAM用的是UDP组播,目标地址是239.192.255.255,端口13400。所有监听这个组播地址的诊断仪都能收到。
我在项目中遇到过一个问题:某个ECU的VAM总是延迟几秒才发出来。查了半天,发现是它的以太网PHY芯片初始化太慢。嗯,这种硬件层面的坑,光看协议是看不出来的。
4.2 车辆识别请求与响应
有时候诊断仪不想等节点自己发VAM,它想主动问。这时候就用到了车辆识别请求。
车辆识别请求:
- 诊断仪发送一个UDP广播或组播报文
- Payload Type: 0x0001 (Vehicle Identification Request)
- 可以带VIN过滤,也可以不带
车辆识别响应:
- 所有收到请求的DoIP节点,都会回复一个VAM
- Payload Type: 0x0004 (VAM)
- 内容跟主动发送的VAM完全一样
你可能会问:那诊断仪怎么区分是主动VAM还是响应VAM?
其实区分不了,也没必要区分。因为VAM报文本身不携带“这是主动发送”还是“这是响应”的标志。诊断仪只需要知道“现在有哪些节点在线”就够了。
我的小技巧:在实际抓包分析时,我习惯先发一个车辆识别请求,然后统计1秒内收到的VAM数量。如果少于预期,说明有节点没上线或者网络有问题。这招在产线测试时特别好用。
4.3 节点状态管理
节点不是一直在线,它也会下线、休眠、或者出故障。DoIP定义了几种节点状态:
| 状态 | 含义 | 触发条件 |
|---|---|---|
| 0x00 | 未初始化 | 节点刚上电,还没准备好 |
| 0x01 | 初始化完成 | 网络配置完成,可以收发报文 |
| 0x02 | 在线 | 已发送VAM,正常工作 |
| 0x03 | 离线 | 节点即将关闭或休眠 |
| 0x04 | 故障 | 检测到内部错误 |
节点状态变化时,会发送一个“节点状态变更”报文(Payload Type: 0x0006)。诊断仪收到后就知道某个节点状态变了。
我曾经踩过一个坑:某个ECU在休眠前没有发送离线状态报文,直接断网了。结果诊断仪一直以为它在线,发诊断请求过去就超时。后来我加了一个“心跳检测”机制,如果连续3次收不到VAM,就认为节点离线了。
注意:节点状态管理是DoIP网络稳定性的基石。如果节点不按规范发送状态变更报文,诊断仪就会产生误判。我建议在测试阶段,一定要用抓包工具验证每个节点的状态切换是否完整。
4.4 实战抓包分析要点
最后,我分享一下抓包分析VAM时的几个关注点:
- 看时间戳:节点上电后,VAM应该在1秒内发出。超过2秒就算异常。
- 看逻辑地址:每个节点的逻辑地址应该是唯一的。如果发现重复,那就是配置错误。
- 看EID:EID是硬件绑定的,如果同一个EID出现在不同IP地址上,说明节点可能重启了。
- 看VIN:如果VIN字段不为空,要检查它跟车辆实际VIN是否一致。
嗯,这一章的内容就这些。节点发现与声明,说白了就是让诊断仪知道“车里有谁,谁是谁”。下一章我们会讲DoIP的TCP连接建立和路由激活,那才是真正开始通信的环节。
记住一句话:VAM是DoIP网络的“自我介绍”,没有它,后面的一切都无从谈起。