3. 车载以太网基础:物理层、TCP/IP协议栈、SOME/IP与DoIP

各位同学,今天我们聊聊车载以太网的基础。说实话,我刚从CAN转到以太网时,心里是有点发怵的。CAN多简单啊,一根线,几个节点,报文发出去就完事了。以太网呢?七层模型、IP地址、端口号、还有一堆我看不懂的协议缩写。但干久了你会发现,其实核心逻辑没变——还是那套“谁跟谁说话,说什么,怎么说”的老规矩。

3.1 以太网物理层:线缆与信号

车载以太网和咱们办公室用的以太网不太一样。办公室用的是RJ45接口,四对差分线。车上呢?空间有限,线束越少越好。所以车载以太网物理层,主流是BroadR-Reach技术,后来标准化成了100BASE-T11000BASE-T1

说白了,就是一对双绞线搞定收发。你想想看,一对线既要发又要收,怎么做到的?靠的是回声消除技术。嗯,这里要注意,这个技术对线缆质量要求很高。我在项目中遇到过,某次台架测试,以太网老是丢包,查了半天,结果是线束供应商用了劣质双绞线,绞距不对。换线后,问题立刻消失。

关键参数对比:
特性100BASE-T11000BASE-T1
速率100 Mbps1 Gbps
线对1对1对
最大距离15米15米
典型应用诊断、OTA摄像头、ADAS

我个人习惯,在项目初期就会跟硬件团队确认:MDI(Medium Dependent Interface)的共模扼流圈选型对不对。这个细节很多人忽略,但直接影响EMC性能。你想想看,车上那么多电机、继电器,干扰大得很,物理层扛不住,上层协议再牛也白搭。

3.2 TCP/IP协议栈:车载的“普通话”

以太网物理层铺好了,接下来就是怎么组织数据。TCP/IP协议栈,说白了就是一套分层的通信规则。车载领域,我们最关心的是IPv4UDPTCP这三层。

为什么不是IPv6?嗯,目前量产车还是IPv4为主。虽然IPv6地址多,但车载网络规模小,IPv4够用。我建议你先把IPv4搞透,IPv6等需要时再补。

这里有个坑,我必须要说。车载以太网的DoIPSOME/IP,底层走的是UDP还是TCP?很多人搞混。我的经验是:

  • SOME/IP:主要走UDP。因为要快,要实时。控制信号、传感器数据,丢一两个包没关系,但延迟必须低。
  • DoIP:诊断数据走TCP。因为诊断要求可靠,不能丢包。你想想看,刷写ECU时丢一个包,ECU就变砖了,谁敢用UDP?
避坑指南: 我曾经在调试SOME/IP时,发现服务发现总是超时。查了三天,最后发现是UDP校验和计算错误。车载以太网的UDP校验和,默认是必须计算的,不像PC端可以关掉。这个细节,很多协议栈默认配置是错的。

3.3 SOME/IP协议:面向服务的通信

SOME/IP,全称Scalable service-Oriented MiddlewarE over IP。名字很长,但核心思想很简单:把ECU的功能封装成“服务”

以前CAN通信,我们定义ID、信号、周期。现在SOME/IP呢?定义的是ServiceMethodEventField。举个例子:

  • Service:车窗控制服务
  • Method:调用“打开车窗”方法(请求-响应模式)
  • Event:车窗状态变化时,主动通知(发布-订阅模式)
  • Field:获取或设置车窗位置(类似属性)

我个人觉得,SOME/IP最妙的是服务发现(Service Discovery)。ECU启动后,会发一个广播:“我提供车窗控制服务,谁需要?” 其他ECU收到后,就可以订阅。这比CAN的静态配置灵活多了。

来看一个典型的SOME/IP报文结构:

// SOME/IP Header (8 bytes)
0x00 0x01  // Service ID (车窗控制 = 0x0001)
0x00 0x01  // Method ID (打开车窗 = 0x0001)
0x12 0x34  // Length (后续数据长度)
0x56 0x78  // Request ID (客户端标识)
0x01       // Protocol Version (当前为1)
0x01       // Interface Version (当前为1)
0x00       // Message Type (0x00 = Request)
0x00       // Return Code (0x00 = OK)
// Payload
0x01       // 车窗ID (左前 = 0x01)
0x64       // 目标位置 (100%)
注意: SOME/IP的序列化方式,用的是大端序(Big-Endian)。这和CAN的Intel格式(小端)完全相反。我见过有人把CAN的DBC解析思路直接套到SOME/IP上,结果数据全反了。切记,车载以太网默认大端。

3.4 DoIP协议:诊断 over IP

DoIP,Diagnostic over Internet Protocol。说白了,就是把UDS诊断协议搬到以太网上。为什么要这么做?因为CAN诊断太慢了。刷写一个ADAS控制器,几百兆的固件,CAN要刷几个小时。DoIP呢?几分钟搞定。

DoIP的物理连接,用的是TCP端口13400。诊断仪先发一个车辆识别请求,ECU回复VIN码、EID等信息。然后诊断仪就可以像CAN诊断一样,发UDS请求了。

这里有个关键点:DoIP的激活线。车载以太网诊断,通常需要一根额外的激活线(或通过CAN唤醒)。为什么?因为ECU平时要休眠省电,不能一直监听TCP端口。诊断仪必须先拉高激活线,ECU才启动DoIP服务。

我曾经在实车测试时,发现诊断仪连不上ECU。查了半天,原来是激活线没接。嗯,这个低级错误,犯过一次就不会再犯了。

DoIP的典型报文流程:

  1. 车辆发现:诊断仪发UDP广播(端口13400),询问“谁在线?”
  2. 车辆声明:ECU回复“我在,这是我的VIN和IP地址”
  3. 建立TCP连接:诊断仪连ECU的TCP 13400端口
  4. 路由激活:诊断仪发路由激活请求,ECU回复确认
  5. 诊断通信:发送UDS请求(如0x22读取数据、0x2E写入数据)
实战建议: 用CANalyzer抓DoIP报文时,记得开启TCP重组功能。因为UDS请求可能被拆成多个TCP段,CANalyzer默认只显示原始TCP包,不重组的话你看到的是一堆乱码。我个人习惯,在CANalyzer的“Ethernet”窗口里,勾选“Reassemble TCP streams”。

3.5 融合分析:CAN与以太网如何协同

最后,聊聊CAN和以太网怎么一起工作。现在的车,不可能全是以太网,也不可能全是CAN。通常是网关ECU负责桥接两个网络。

举个例子:ADAS摄像头通过以太网把图像数据传给域控制器,域控制器算完,通过CAN把控制指令发给转向ECU。这时候,你抓CAN报文,看到的是转向角度;抓以太网报文,看到的是图像流。两者时间戳要对齐,才能分析“图像延迟是否导致转向响应慢”。

我建议你在CANalyzer里,同时打开CAN窗口Ethernet窗口,用时间同步功能。这样,你可以看到CAN报文和以太网报文在同一个时间轴上。我曾经用这个功能,定位到一个“摄像头数据延迟导致自动泊车撞墙”的bug。嗯,那又是另一个故事了。

好了,这一章的内容就到这里。下一章,我们开始动手,用CANalyzer抓第一个以太网报文。