4. OTA升级的通信架构:基于DoIP的升级通信与UDS协议应用

好,咱们进入第四讲。这一章我打算聊聊OTA升级的通信架构。说白了,就是升级数据怎么从云端跑到ECU里去的。我个人习惯把通信架构比作一条高速公路——路修不好,车跑得再快也得堵死。

在AUTOSAR体系下,OTA升级的通信主要依赖两个东西:DoIPUDS。DoIP负责把数据包从以太网送进来,UDS负责定义这些数据包的含义和交互流程。嗯,咱们一个一个拆开讲。

4.1 DoIP:升级数据的“高速公路”

DoIP,全称Diagnostics over IP。你想想看,传统的诊断通信用的是CAN总线,速率顶天了也就1Mbps。升级一个几百KB的固件,那得等多久?我在项目中遇到过,用CAN刷写一个2MB的MCU固件,整整花了40分钟。客户直接投诉说“这车升级比看病还慢”。

DoIP的出现就是为了解决这个问题。它把诊断数据封装到TCP/UDP包里,跑在以太网上。100Mbps甚至1Gbps的带宽,刷写时间直接降到分钟级甚至秒级。

核心要点:DoIP不是一个新的诊断协议,它只是UDS在以太网上的“运输工具”。UDS的请求/响应内容不变,变的只是底层的传输介质。

DoIP的协议栈分几层,我画了个图帮你理解:

DoIP协议栈分层结构 应用层(UDS诊断服务) DoIP消息封装层 TCP/UDP传输层 IPv6/IPv4网络层 以太网MAC层 100BASE-T1 / 1000BASE-T1物理层

你看,最上层还是UDS应用层,中间加了DoIP消息封装层。这一层负责把UDS的请求/响应打包成DoIP格式的报文。我记得刚开始接触DoIP时,总搞不清它和普通以太网通信的区别。后来想明白了——DoIP本质上是一个诊断隧道,它规定了车辆ECU如何被发现、如何建立连接、如何传输诊断数据。

4.2 DoIP的关键机制

DoIP有几个关键机制,我挑最重要的说:

  • 车辆发现:通过UDP广播,Tester可以找到网络上有哪些DoIP节点。每个节点会回复自己的VIN码、逻辑地址等信息。
  • 路由激活:建立TCP连接后,Tester发送路由激活请求,ECU确认后分配一个源地址。这一步相当于“握手”。
  • 诊断消息传输:UDS请求/响应被封装在DoIP消息体中,通过TCP连接传输。支持大数据的拆分和重组。

避坑指南:我曾经在项目中遇到过一个问题——DoIP的TCP连接超时设置太短,导致大数据传输时频繁断连。后来我把超时时间从5秒改到了30秒,问题就解决了。记住,OTA升级的数据包往往很大,TCP参数要适当放宽。

4.3 UDS协议在OTA中的角色

UDS(Unified Diagnostic Services)是ISO 14229定义的一套诊断服务。在OTA升级中,UDS负责定义“怎么刷”、“刷哪里”、“刷完怎么验证”。

我列个表,把OTA升级中常用的UDS服务整理一下:

UDS服务ID 服务名称 在OTA中的作用
0x10 诊断会话控制 切换到编程会话模式,解锁ECU的刷写权限
0x27 安全访问 验证Tester身份,防止非法刷写
0x31 例程控制 触发擦除、校验、激活等例程
0x34 请求下载 告知ECU即将开始数据传输,协商数据块大小
0x36 传输数据 实际传输固件数据块,支持连续传输
0x37 请求退出传输 结束数据传输,ECU开始校验完整性
0x2E 写入数据标识符 写入升级状态、版本号等元数据
0x22 读取数据标识符 读取当前版本号、升级状态等信息

你看,整个升级流程就是这些UDS服务的组合。我习惯把OTA升级的UDS交互流程总结为三个阶段:

  1. 准备阶段:0x10切换会话 → 0x27安全访问 → 0x31擦除例程
  2. 传输阶段:0x34请求下载 → 0x36传输数据(循环) → 0x37请求退出
  3. 验证阶段:0x31校验例程 → 0x2E写入版本 → 0x22读取确认

核心要点:UDS的0x36传输数据服务支持“连续帧”模式。也就是说,你可以一次性发送多个数据块,不需要每个块都等ECU的响应。这在OTA升级中能大幅提升传输效率。我建议把连续帧的窗口大小设为5-10个块,既保证效率,又不会因为丢包导致大量重传。

4.4 DoIP + UDS的典型升级流程

好,咱们把DoIP和UDS串起来,看看一个完整的OTA升级通信流程是什么样的:

DoIP + UDS 典型OTA升级通信流程 云端OTA平台 Tester(网关/代理) 目标ECU ① 下载固件 ② DoIP车辆发现 ③ DoIP路由激活 ④ 0x10 编程会话 ⑤ 0x27 安全访问 ⑥ 0x31 擦除例程 ⑦ 0x34 请求下载 ⑧ 0x36 传输数据(循环) ⑨ 0x37 请求退出 ⑩ 0x31 校验/激活

这个流程看起来步骤多,但实际跑起来很快。我做过一个项目,用DoIP+UDS刷写一个8MB的固件,从开始到激活完成,总共只用了12秒。相比CAN的40分钟,简直是天壤之别。

注意事项:DoIP虽然快,但它对网络环境有要求。如果车载以太网的交换机配置不当,或者线束质量不好,很容易出现丢包和重传。我曾经在实车上遇到过,因为一个劣质的以太网连接器,导致升级成功率从99%掉到了70%。排查了整整两天才找到原因。所以,硬件质量一定要把好关。

4.5 通信架构设计的几个关键点

最后,我总结几个通信架构设计时容易忽略的点:

  • 超时机制:UDS的每个服务都有超时时间。OTA升级中,擦除和校验操作耗时较长,建议把P2*Server(响应超时)设为5秒以上,避免误判为超时。
  • 数据块大小:0x34请求下载时,ECU会返回它支持的最大数据块大小。我建议Tester根据这个值动态调整,不要硬编码。有的ECU支持4KB,有的只支持1KB,硬编码容易出问题。
  • 错误处理:UDS的否定响应码(NRC)要仔细处理。比如0x78(请求正确接收,响应待定)表示ECU正在忙,Tester应该等待而不是立即重试。
  • 安全校验:0x27安全访问的种子和密钥算法要足够复杂。我见过一些项目直接用固定密钥,结果被逆向工程破解了。至少要用AES-128级别的加密。

嗯,这一章的内容就到这里。通信架构是OTA升级的骨架,骨架搭好了,后面的升级策略、安全机制才能稳稳地往上放。你想想看,如果通信链路都不稳定,再好的升级算法也是白搭。

个人经验:我建议你在设计通信架构时,先做一轮“最坏情况分析”。比如,假设网络延迟100ms,丢包率5%,ECU处理速度最慢,看看整个升级流程能不能在客户要求的时限内完成。这个分析能帮你提前发现很多坑。


公众号:蓝海资料掘金营,微信deep3321