第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米。我习惯在调试时用这个接口连接诊断仪,稳定,不丢包。
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米 |
| 典型应用 | 诊断、控制 | 摄像头、激光雷达 |
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()
好了,这一章的内容就到这里。车载以太网是个大话题,咱们后面还会深入聊。下一章,我会讲讲入侵检测系统的架构设计,到时候见。