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时的几个关注点:

  1. 看时间戳:节点上电后,VAM应该在1秒内发出。超过2秒就算异常。
  2. 看逻辑地址:每个节点的逻辑地址应该是唯一的。如果发现重复,那就是配置错误。
  3. 看EID:EID是硬件绑定的,如果同一个EID出现在不同IP地址上,说明节点可能重启了。
  4. 看VIN:如果VIN字段不为空,要检查它跟车辆实际VIN是否一致。

嗯,这一章的内容就这些。节点发现与声明,说白了就是让诊断仪知道“车里有谁,谁是谁”。下一章我们会讲DoIP的TCP连接建立和路由激活,那才是真正开始通信的环节。

记住一句话:VAM是DoIP网络的“自我介绍”,没有它,后面的一切都无从谈起。