第4章:车载以太网基础:100BASE-T1与1000BASE-T1物理层、AVB/TSN协议族、SOME/IP与DDS中间件、DoIP协议

各位同行,今天我们来聊聊车载以太网。说实话,这玩意儿刚出来的时候,我内心是拒绝的。你想啊,CAN总线用了这么多年,稳定可靠,干嘛要换?直到我第一次调试一辆搭载了激光雷达和多个高清摄像头的样车,CAN总线那点带宽,连一路视频流都塞不进去。嗯,从那以后,我就成了车载以太网的忠实拥趸。

4.1 物理层:100BASE-T1与1000BASE-T1

先说说物理层。车载以太网和咱们办公室用的以太网最大的区别,就是它只用一对双绞线。为什么?省成本、减重量、抗干扰。我见过一个项目,因为线束太重,整车续航直接掉了5公里。所以,单对线方案是刚需。

4.1.1 100BASE-T1

100BASE-T1,也叫BroadR-Reach。速率100Mbps,传输距离15米。这个距离够用吗?说实话,在车里完全够了。从车头到车尾,撑死了也就5米。我习惯在调试时用这个接口连接诊断仪,稳定,不丢包。

我的小技巧: 100BASE-T1的线缆建议使用屏蔽双绞线(STP)。我曾经因为用了非屏蔽线,在EMC测试时吃了大亏,辐射发射超标了6dB。后来换成屏蔽线,一次过。

4.1.2 1000BASE-T1

1000BASE-T1,顾名思义,千兆速率。它用了PAM3调制,比100BASE-T1的PAM2复杂一些。传输距离也是15米。这个接口主要用在摄像头、激光雷达这些高带宽设备上。

我记得第一次调通1000BASE-T1链路时,示波器上看到的眼图简直漂亮。但别高兴太早,千兆链路的调试比百兆麻烦得多。你想想看,速率高了10倍,对信号完整性的要求也高了10倍。

参数 100BASE-T1 1000BASE-T1
速率 100 Mbps 1 Gbps
调制方式 PAM2 PAM3
线对 1对 1对
最大距离 15米 15米
典型应用 诊断、控制 摄像头、激光雷达
避坑指南: 我曾经在项目里混用了100BASE-T1和1000BASE-T1的PHY芯片,结果链路死活协商不上。后来查手册才发现,这两种PHY的自动协商机制不兼容。所以,设计时一定要明确接口速率,别混用。

4.2 AVB/TSN协议族

AVB(Audio Video Bridging)和TSN(Time-Sensitive Networking),说白了就是给以太网装上“时钟同步”和“优先级调度”的功能。为什么需要这个?因为车载音频、视频流对延迟和抖动非常敏感。你总不希望倒车影像的画面卡成PPT吧?

4.2.1 时钟同步(gPTP)

gPTP(IEEE 802.1AS)是AVB/TSN的核心。它让网络中的所有节点共享同一个时钟,精度在微秒级。我习惯在调试时先确认gPTP是否同步成功。如果同步失败,后面的音视频流肯定出问题。

# 检查gPTP同步状态(Linux环境下)
# 查看ptp4l日志
journalctl -u ptp4l | tail -20

# 输出示例
ptp4l[1234]: master offset         -12 s2 freq   -1234 path delay       567
ptp4l[1234]: master offset         -10 s2 freq   -1235 path delay       568
# offset值越小,同步精度越高

4.2.2 流预留(SRP)

SRP(Stream Reservation Protocol)负责为音视频流预留带宽。说白了,就是告诉交换机:“这条流很重要,别给我丢了。” 我遇到过一个问题,SRP预留失败,导致音频流被其他数据包冲断,车里音响“咔咔”响。排查了半天,发现是交换机配置错了。

4.3 SOME/IP与DDS中间件

中间件,说白了就是让不同ECU之间能“说上话”。SOME/IP和DDS是两种主流方案。

4.3.1 SOME/IP

SOME/IP(Scalable service-Oriented MiddlewarE over IP)是宝马主导的协议。它基于服务发现,客户端找服务端,一问一答。我习惯在调试时用Wireshark抓包,看SOME/IP的Service Discovery报文。

# Wireshark过滤SOME/IP报文
someip

# 或者过滤特定服务ID
someip.srv_id == 0x1234

SOME/IP的优点是轻量,适合资源受限的ECU。但它的缺点是实时性一般,因为每次调用都要走一次请求-响应。

4.3.2 DDS

DDS(Data Distribution Service)是OMG的标准。它采用发布-订阅模式,数据生产者只管发,消费者只管收,中间由DDS中间件负责路由。说白了,就是“你发你的,我收我的,互不干扰”。

DDS的实时性比SOME/IP好,但资源消耗也大。我建议在自动驾驶域控制器这类高性能平台上用DDS,在普通ECU上用SOME/IP。

特性 SOME/IP DDS
通信模式 请求-响应 发布-订阅
实时性 一般
资源消耗
典型应用 诊断、控制 传感器数据融合

4.4 DoIP协议

DoIP(Diagnostics over Internet Protocol),就是把UDS诊断报文封装在TCP/IP里传输。为什么不用CAN?因为CAN的带宽不够,而且远程诊断时,你总不能拉根CAN线到云端吧?

DoIP的端口号是13400。我习惯在调试时先确认TCP连接是否建立,然后发送诊断请求。

# 使用Python发送DoIP诊断请求
import socket

# 创建TCP连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("192.168.1.100", 13400))

# 构造DoIP报文头
# 协议版本: 0x02
# 逆向协议版本: 0xFD
# 负载类型: 0x8001 (诊断消息)
# 负载长度: 4字节
header = bytes([0x02, 0xFD, 0x80, 0x01, 0x00, 0x00, 0x00, 0x04])

# 构造UDS诊断请求 (读取VIN码)
# 服务ID: 0x22 (读取数据)
# DID: 0xF190 (VIN)
uds_request = bytes([0x22, 0xF1, 0x90])

# 发送
sock.send(header + uds_request)

# 接收响应
response = sock.recv(1024)
print(response.hex())

sock.close()
重点: DoIP的报文头有8个字节,分别是协议版本、逆向协议版本、负载类型、负载长度。负载类型0x8001表示诊断消息。这个结构一定要记牢,我见过有人把负载类型写反了,结果ECU根本不响应。

好了,这一章的内容就到这里。车载以太网是个大话题,咱们后面还会深入聊。下一章,我会讲讲入侵检测系统的架构设计,到时候见。