4、通信协议基础:HTTP/HTTPS、MQTT、UDS on CAN、DoIP协议对比与选型

各位同学,咱们今天聊点实在的。做OTA,说白了就是让车跟云“说话”。但车上的环境跟咱们手机不一样,网络不稳定、带宽有限、安全要求还贼高。选什么协议,直接决定了你的升级体验是“丝滑”还是“卡成PPT”。

我这些年折腾下来,发现很多新手容易犯一个毛病:上来就选HTTP,觉得它最通用。嗯,这里要注意,通用不等于适用。今天我就把这四个主流协议掰开揉碎了讲,顺便聊聊我踩过的坑。

4.1 HTTP/HTTPS:最熟悉的陌生人

HTTP,大家都不陌生。做Web开发的天天用。但在车上用,你得多个心眼。

优点很明显:

  • 生态成熟,工具链丰富。curl、Postman随便测。
  • 基于TCP,可靠性有保障。
  • HTTPS加了TLS加密,安全性能过关。

但缺点也致命:

  • 头部开销大。 一个HTTP请求,光Header就几百字节。你想想看,车机流量可是要花钱的。
  • 实时性差。 它是请求-响应模式。服务器不能主动推数据。你要做远程诊断?得车机不停地轮询。
  • 长连接管理复杂。 车载网络经常断线重连,HTTP的Keep-Alive在这种场景下表现一般。

我的经验: 我个人习惯把HTTP/HTTPS用在“大文件下载”和“非实时配置下发”上。比如下载升级包,用HTTPS分块下载,配合断点续传,效果不错。但千万别用它做实时状态上报,否则服务器压力会很大。

避坑指南: 我曾经在一个项目里,用HTTP轮询车辆状态,每5秒一次。结果1000台车同时在线,服务器直接挂了。后来改成MQTT推送,问题才解决。

4.2 MQTT:为物联网而生的轻量级选手

MQTT,我愿称之为“车联网的瑞士军刀”。它设计之初就是为了解决低带宽、高延迟、不可靠网络下的通信问题。

核心特性:

  • 发布/订阅模式。 服务器可以主动推消息,实时性比HTTP好太多。
  • 报文极小。 最小报文只有2个字节。你想想看,这比HTTP省了多少流量。
  • 三种QoS等级。 从“最多发一次”到“确保送达一次”,灵活控制可靠性。
  • 遗嘱消息。 设备异常断线时,服务器能收到通知。这个功能在车上很有用。

在OTA中的典型应用:

  • 车辆状态实时上报(电量、位置、升级进度)。
  • 云端下发升级指令。
  • 远程诊断请求与响应。

注意: MQTT虽然轻量,但安全性需要自己加强。默认不加密,建议搭配TLS使用。另外,QoS等级别设太高,否则在弱网环境下反而会增加延迟。我一般用QoS 1,兼顾可靠性和效率。

4.3 UDS on CAN:汽车诊断的“老黄牛”

UDS(统一诊断服务)跑在CAN总线上,这是汽车电子工程师的必修课。它不负责传大文件,但负责“精细控制”。

为什么OTA需要它?

  • 刷写前的准备工作。 比如解锁ECU、进入编程会话、检查安全访问权限。
  • 刷写中的控制。 比如擦除Flash、写入数据、校验完整性。
  • 刷写后的验证。 比如读取故障码、检查软件版本。

技术特点:

  • 基于请求-响应,但比HTTP更“硬实时”。
  • 报文长度受限(CAN 2.0最大8字节,CAN FD最大64字节)。
  • 需要分包传输,逻辑复杂。

我的经验: 我记得有一次做Bootloader开发,UDS的“34服务”(请求下载)和“36服务”(传输数据)配合不好,导致刷写过程中ECU死锁。后来查了三天,发现是分包序号处理有bug。所以,UDS的时序逻辑一定要用状态机严格管理。

4.4 DoIP:当诊断走上IP网络

DoIP(基于IP网络的诊断协议),说白了就是把UDS搬到以太网上。随着车载以太网普及,DoIP越来越重要。

相比UDS on CAN的优势:

  • 带宽大。 100Mbps甚至1Gbps,刷写速度提升明显。
  • 传输距离远。 不再受CAN总线长度限制。
  • 支持并行诊断。 可以同时跟多个ECU通信。

在OTA中的角色:

  • 作为“高速通道”,传输大块数据(比如升级包)。
  • 作为“远程通道”,通过4G/5G网络进行远程诊断。

避坑指南: 我曾经在DoIP的“路由激活”阶段踩过坑。车辆在行驶中,网络拓扑会变化,DoIP的连接状态需要动态管理。否则,会出现“诊断会话中断”的问题。建议在应用层加心跳机制。

4.5 协议选型对比表

特性 HTTP/HTTPS MQTT UDS on CAN DoIP
传输层 TCP TCP CAN TCP/UDP
报文开销 大(几百字节) 小(2字节起) 极小(8字节) 中等
实时性 低(轮询) 高(推送) 高(硬实时)
适用场景 大文件下载、配置下发 状态上报、指令下发 ECU刷写控制、诊断 高速刷写、远程诊断
安全性 高(HTTPS) 中(需自建) 低(需应用层加密)
复杂度

4.6 选型建议:别纠结,看场景

说了这么多,到底怎么选?我的建议是:不要只用一种协议,要组合使用。

  • 云端到车机: 用MQTT做指令和状态通道,用HTTPS做下载通道。
  • 车机到ECU: 用UDS on CAN做精细控制,用DoIP做高速数据传输。
  • 远程诊断: 用DoIP over MQTT,把诊断报文封装在MQTT里传输。

最后说一句: 协议只是工具,别为了用而用。我见过有人非要在CAN上跑HTTP,结果性能惨不忍睹。也见过有人用MQTT传升级包,结果丢包率居高不下。选型之前,先想清楚你的核心需求是什么:是实时性?是可靠性?还是带宽?想明白了,答案自然就有了。

好,这一章就到这里。下一章我们聊聊“升级包的结构设计与差分算法”,这可是OTA的核心技术之一,敬请期待。