第四章:车载以太网基础

说实话,我刚入行那会儿,车载网络基本就是CAN的天下。那时候谁要是提以太网,大家会觉得「这玩意儿是搞IT的才用的吧?」。但时代变了,真的变了。现在你打开一辆高端车的电气架构图,以太网已经成了骨干网络。

这一章,我们就来聊聊车载以太网的那些事儿。我会结合我这些年踩过的坑,给你讲清楚协议栈、SOME/IP、DoIP,还有以太网和CAN到底怎么选。

4.1 车载以太网协议栈(AVB/TSN)

先说说协议栈。车载以太网和咱们办公室用的以太网,底层物理层是一样的,但上层协议栈完全不同。为什么?因为车里面需要确定性——说白了,就是数据必须在规定时间内到达,不能像上网看视频那样卡一下还能忍。

这里有两个关键协议族:AVB和TSN。

4.1.1 AVB(音频视频桥接)

AVB最初是为了解决音视频同步问题。我记得2016年做第一个AVB项目时,客户要求摄像头画面和雷达数据必须严格同步。当时我天真地以为,只要带宽够大就行。结果呢?数据是传过去了,但时间戳对不上,画面和雷达点云差了50毫秒——这在自动驾驶里可是要命的。

AVB的核心机制包括:

  • 精确时间同步(gPTP):IEEE 802.1AS,让所有节点的时间误差控制在微秒级
  • 流预留协议(SRP):IEEE 802.1Qat,提前为数据流预留带宽
  • 信用整形器(CBS):IEEE 802.1Qav,控制数据发送的节奏

关键点:AVB不是万能的。它适合软实时场景,比如音视频流。但如果你需要硬实时(比如制动控制信号),AVB就不够用了。这时候得请出TSN。

4.1.2 TSN(时间敏感网络)

TSN是AVB的进化版。说白了,AVB是「尽量准时」,TSN是「必须准时」。TSN引入了一个杀手锏——时间感知整形器(TAS)。

怎么理解呢?想象一下,网络时间被切成一个个小片。在每个时间片里,只有特定的数据流可以发送。这样一来,高优先级的数据(比如制动指令)就能在固定的时间窗口内完成传输,完全不受其他数据干扰。

我去年调试一个TSN项目时,遇到过一个问题:明明配置了时间窗口,但数据还是偶尔超时。查了两天才发现,是时钟同步的精度不够。嗯,这里要注意:TSN依赖gPTP,如果gPTP没调好,整个TSN就是空中楼阁。

特性 AVB TSN
时间同步精度 微秒级 纳秒级
确定性 软实时 硬实时
典型应用 音视频、摄像头 控制信号、安全相关
复杂度 中等

4.2 SOME/IP协议

SOME/IP,全称是Scalable service-Oriented MiddlewarE over IP。名字很长,但核心思想很简单:把汽车里的功能封装成服务,通过以太网来调用。

你想想看,传统CAN通信是信号导向的——你定义一个CAN ID,里面塞几个信号,接收方按ID解析。但SOME/IP不一样,它是服务导向的。一个ECU可以发布一个服务(比如「获取车速」),其他ECU可以订阅这个服务。谁需要谁订阅,不需要就取消,非常灵活。

我个人习惯把SOME/IP分成两种通信模式:

  • 请求/响应模式:客户端发请求,服务端回响应。适合查询类操作,比如读取故障码。
  • 事件通知模式:服务端主动推送数据。适合周期性数据,比如车速、转速。

这里有个坑,我曾经踩过。SOME/IP的序列化(Serialization)方式跟CAN完全不同。CAN里你直接读寄存器就行,但SOME/IP需要按照指定的格式把数据打包成字节流。如果你序列化和反序列化的两端不一致,数据解析出来就是乱码。我曾经因为一个字节序(Endianness)配置错误,调试了整整两天。

小技巧:调试SOME/IP时,先用Wireshark抓包看看原始字节流。确认发送端和接收端的序列化参数完全一致,再往下查。

4.3 DoIP协议

DoIP,Diagnostics over IP。说白了,就是用以太网来做诊断。以前诊断都是走CAN(UDS over CAN),但CAN的带宽有限,刷写一个ECU固件可能要半小时。换成DoIP,同样的固件,几分钟搞定。

DoIP的协议栈分三层:

  1. 物理层和传输层:TCP/UDP over IP
  2. DoIP协议层:处理连接管理、路由激活、诊断消息封装
  3. 应用层:UDS诊断服务(比如读取DTC、写入数据)

我记得有一次,客户反馈说DoIP连接总是超时。我排查后发现,是TCP的Keep-Alive参数没配好。DoIP要求在一定时间内没有数据交互时,发送Keep-Alive报文来维持连接。如果这个时间设置得太长,中间的路由器可能会把连接断开。

警告:DoIP的端口号是13400,这是IANA分配的。不要随便改。另外,DoIP要求支持同时多个诊断连接,但实际项目中建议限制为1-2个,否则ECU资源可能不够用。

4.4 以太网与CAN的对比

很多新手会问:既然以太网这么牛,为什么还要用CAN?

这个问题,我当年也问过我的导师。他的回答让我记到现在:「工具没有好坏,只有合不合适。」

咱们来做个对比:

维度 CAN 车载以太网
带宽 最高8 Mbps(CAN FD可达15 Mbps) 100 Mbps ~ 1 Gbps
传输距离 40米@1 Mbps 100米@100 Mbps
确定性 天生确定性(CSMA/CR) 需要TSN支持
成本 低(芯片几毛钱) 高(PHY芯片几美金)
功耗 较高
适用场景 控制信号、传感器数据 摄像头、大容量数据、诊断

你看,CAN的优势在于简单、便宜、确定性强。一个刹车信号,用CAN传,延迟是固定的,不会因为网络拥堵而变慢。但以太网的优势在于带宽大,可以传高清视频、激光雷达点云这些海量数据。

所以现在的趋势是:

  • 控制域:继续用CAN/CAN FD,甚至LIN
  • 骨干域:用以太网连接各个域控制器
  • 传感器域:摄像头、激光雷达直接走以太网

我曾经参与过一个项目,客户非要所有信号都走以太网。结果呢?成本翻倍,功耗飙升,而且因为TSN配置复杂,开发周期延长了三个月。最后不得不改回CAN+以太网的混合架构。

我的建议:别盲目追求新技术。CAN和以太网不是替代关系,是互补关系。该用CAN的地方用CAN,该用以太网的地方用以太网,这才是成熟工程师的思路。

好了,这一章的内容就到这里。下一章我们会进入实战环节——用Python写一个简单的SOME/IP客户端和服务端。到时候我会手把手带你过一遍代码,保证你学完就能用。