2、车载网络通信协议:CAN、DoIP、SOME/IP 在 OTA 升级中的应用

车载网络通信,说白了就是 ECU 之间怎么“说话”。OTA 升级本质上是一场大规模的数据搬运,选错协议,升级就会卡死、超时,甚至把车刷成砖。我这些年踩过的坑,多半都跟协议选型和参数调优有关。

今天咱们就深入聊聊三种核心协议——CAN、DoIP、SOME/IP,它们在 OTA 场景下各自扮演什么角色,以及带宽与延迟这对“冤家”怎么权衡。

2.1 CAN 总线:老将出马,一个顶俩?

CAN 总线在车上跑了三十多年,可靠性没得说。但用在 OTA 上,它有个硬伤——带宽太低。

经典 CAN 只有 500 kbps,CAN FD 能到 8 Mbps。你想想看,一个 A/B 分区镜像动辄 100 MB,用 CAN FD 传也得 100 秒以上。这还不算协议开销和重传。

核心结论:CAN 只适合传小数据——升级指令、状态查询、诊断会话控制。千万别用它传固件包。

我在项目中遇到过一件事:某供应商坚持用 CAN 传 2 MB 的 bootloader,结果升级一次要 40 分钟,用户投诉率飙升。后来改成 DoIP,3 分钟搞定。

特性 经典 CAN CAN FD OTA 适用性
最大带宽 500 kbps 8 Mbps 仅控制指令
帧有效载荷 8 字节 64 字节 小数据包
传输 100 MB 耗时 ~28 分钟 ~2 分钟 不可接受
典型 OTA 用途 诊断请求/响应 小文件传输 控制面

避坑指南:我曾经在 CAN 上实现过 4 字节的“升级启动”指令,结果因为总线仲裁优先级设错,被 DBC 里一条周期报文抢占了 slot,导致升级指令延迟了 200 ms。ECU 超时退出了升级模式。教训:CAN 的优先级设计,在 OTA 场景下必须单独评审。

2.2 DoIP:以太网上的“快车道”

DoIP(Diagnostic over Internet Protocol)本质上是把 UDS 诊断协议搬到了 TCP/IP 上。它解决了 CAN 的两个痛点:带宽和并发。

DoIP 跑在 100BASE-T1 或 1000BASE-T1 上,带宽 100 Mbps 起步。一个 100 MB 的升级包,理论传输时间不到 10 秒。实际项目中,加上协议开销和 TCP 窗口调整,大概 30-60 秒。

我个人习惯在 DoIP 上做三件事:

  • 建立诊断会话——通过 DoIP 激活 ECU 的扩展会话
  • 传输固件数据——用 0x34/0x36 服务分段上传
  • 并行升级——同时给多个 ECU 传数据

但 DoIP 也有坑。我记得有一次在实车上测试,DoIP 连接总是断。排查了半天,发现是车载交换机的 VLAN 配置把 DoIP 报文过滤了。嗯,网络配置的坑,往往比协议本身更难搞。

经验之谈:DoIP 的 TCP 连接超时时间建议设成 30 秒以上。车载网络环境复杂,丢包重传很常见。我见过有人设 5 秒超时,结果升级到一半连接断了,ECU 进入“挂起”状态,只能断电恢复。

2.3 SOME/IP:面向服务的“调度员”

SOME/IP(Scalable service-Oriented MiddlewarE over IP)是 AUTOSAR 体系里的服务发现和通信中间件。它不直接传固件,而是负责“谁该升级、什么时候升、升完了通知谁”。

在 OTA 场景下,SOME/IP 主要干这几件事:

  1. 服务发现——OTA Master 通过 SOME/IP-SD 发现所有可升级的 ECU
  2. 事件通知——ECU 上报升级进度、错误码
  3. 远程过程调用——触发升级流程、查询版本号

你想想看,如果没有 SOME/IP,OTA Master 就得硬编码每个 ECU 的 IP 和端口,扩展性极差。SOME/IP 让整个升级架构变得“热插拔”——加一个新 ECU,它自己注册服务就行。

功能 SOME/IP 角色 OTA 中的具体用途
服务发现 Offer/Subscribe OTA Master 发现升级目标
事件通知 Event ECU 上报升级进度
方法调用 Method 触发升级、回滚操作
字段访问 Field 读取/写入版本号

关键点:SOME/IP 的序列化开销比 DoIP 大。每个方法调用都有 Service ID、Method ID、Session ID 等头部。所以 SOME/IP 适合传控制信令,不适合传大块二进制数据。固件传输还是交给 DoIP 更高效。

2.4 带宽与延迟的权衡:没有银弹

很多刚入行的朋友问我:“能不能只用一种协议搞定 OTA?”我的回答是:不行。每种协议都有自己的“舒适区”。

我画了一张图,帮你理解三者的分工:

OTA 升级协议栈分工图 OTA 应用层(升级策略、版本管理) SOME/IP(服务发现、事件通知、RPC) CAN(控制指令) DoIP(固件传输) SOME/IP-UDP(信号) 权衡原则 • 控制面(指令、状态)→ CAN 或 SOME/IP,追求低延迟 • 数据面(固件、镜像)→ DoIP,追求高带宽 • 服务发现 → SOME/IP,追求动态灵活性

带宽和延迟的权衡,说白了就是:你要快,还是要准?

  • 高带宽协议(DoIP):适合传大文件,但 TCP 握手、窗口调整会引入延迟。升级 100 MB 固件,延迟 100 ms 可以接受。
  • 低延迟协议(CAN/SOME/IP-UDP):适合传控制指令,延迟要求 < 10 ms。但带宽低,传大文件会卡死总线。

我曾经踩过的坑:在一个项目中,我把 SOME/IP 的事件通知和 DoIP 的固件传输混在同一个 TCP 连接里。结果固件传输占满了带宽,SOME/IP 的心跳包延迟飙升,ECU 误判 OTA Master 离线,自动退出了升级模式。教训:控制面和数据面必须走不同的连接,或者用优先级队列隔离。

2.5 实车部署中的协议选型建议

根据我参与过的几个量产项目,我总结了一套选型原则:

升级场景 推荐协议 理由
单个 ECU 小固件(< 1 MB) CAN FD 无需以太网硬件,成本低
单个 ECU 大固件(> 10 MB) DoIP 带宽充足,支持断点续传
多 ECU 并行升级 DoIP + SOME/IP SOME/IP 做调度,DoIP 做传输
升级前版本检查 SOME/IP 服务发现机制,自动获取版本号
紧急降级指令 CAN 低延迟,高可靠性,不依赖网络栈

个人习惯:我一般会在 OTA Master 里做一个“协议适配层”。上层升级逻辑不关心底层用 CAN 还是 DoIP,适配层根据 ECU 能力和当前网络负载,自动选择最优协议。这样后期换 ECU 或者加新协议,改适配层就行,不用动核心逻辑。

嗯,协议选型没有标准答案。关键是你得清楚每个协议的“脾气”——CAN 可靠但慢,DoIP 快但依赖网络,SOME/IP 灵活但有开销。理解了这些,你就能在实车部署中做出合理的权衡。