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 主要干这几件事:
- 服务发现——OTA Master 通过 SOME/IP-SD 发现所有可升级的 ECU
- 事件通知——ECU 上报升级进度、错误码
- 远程过程调用——触发升级流程、查询版本号
你想想看,如果没有 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?”我的回答是:不行。每种协议都有自己的“舒适区”。
我画了一张图,帮你理解三者的分工:
带宽和延迟的权衡,说白了就是:你要快,还是要准?
- 高带宽协议(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 灵活但有开销。理解了这些,你就能在实车部署中做出合理的权衡。