OTA 升级包/刷写脚本 交互流程

3/10/2026 OTA

# OTA 升级包/刷写脚本 交互流程

📚 本文目标:系统梳理车联网 OTA 升级的完整技术流程,便于面试准备和技术参考


# 📋 目录

  1. 基础概念
  2. 整体架构
  3. 核心交互流程
  4. UDS 诊断协议详解
  5. 通信协议栈
  6. 异常处理机制
  7. 安全机制
  8. 面试问答

# 一、基础概念

# 1.1 什么是 OTA?

OTA(Over-The-Air) 空中下载技术,指通过无线网络远程升级设备固件/软件的技术。

对比项 传统升级方式 OTA 升级
升级方式 4S 店专用设备连接 远程无线推送
成本 高(人工+设备) 低(自动化)
用户体验 不便(需到店) 便捷(自动进行)
响应速度 快(即时修复 bug)

# 1.2 OTA 升级类型

类型 说明 优势 适用场景
全量升级 传输完整的固件包 实现简单,兼容性好 小版本更新、跨大版本
差分升级 只传输新旧版本差异 数据量小,节省流量和时间 补丁修复、小版本迭代
压缩升级 固件包经过压缩 进一步减少传输量 空间受限场景

# 1.3 相关术语

术语 说明
T-Box Telematics Box,车联网通信盒,负责云端通信
ECU Electronic Control Unit,电子控制单元
UDS Unified Diagnostic Services,统一诊断服务(ISO 14229)
Bootloader 引导加载程序,负责固件加载和升级
CAN Controller Area Network,控制器局域网
DoIP Diagnostics over IP,基于以太网的诊断
DTC Diagnostic Trouble Code,诊断故障码

# 二、整体架构:云-管-端

# 2.1 架构图

┌─────────────────────────────────────────────────────────────────┐
│                         【云端平台】                             │
│  ┌───────────┐  ┌───────────┐  ┌───────────┐  ┌───────────┐     │
│  │ 升级包    │   │ 版本管理  │  │ 任务调度   │  │ 监控告警  │      │
│  │ 生成服务  │   │   服务    │  │   服务    │  │   服务    │      │
│  └───────────┘  └───────────┘  └───────────┘  └───────────┘     │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │   4G/5G 网络    │
                    │ HTTP/HTTPS/MQTT │
                    └─────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                      【车机/T-Box】                              │
│  ┌───────────┐  ┌───────────┐  ┌───────────┐  ┌───────────┐     │
│  │ 下载管理   │  │ 升级策略   │  │ 诊断会话  │  │ 状态上报  │      │
│  │  模块      │  │  模块     │  │  管理     │  │  模块     │     │
│  └───────────┘  └───────────┘  └───────────┘  └───────────┘     │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
                    ┌─────────────────┐
                    │  CAN/Ethernet   │
                    │    车内总线      │
                    └─────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│                      【目标 ECU】                                │
│  ┌─────────────────┐              ┌─────────────────┐           │
│  │   Bootloader    │ ←──────────→ │   Application   │           │
│  │   引导分区       │              │   应用分区      │            │
│  └─────────────────┘              └─────────────────┘           │
└─────────────────────────────────────────────────────────────────┘

# 2.2 各层职责

层级 组件 主要职责
云端 OTA 平台 升级包生成、版本管理、任务分发、升级监控
车端 T-Box/网关 下载升级包、解析升级策略、UDS 诊断通信、状态上报
ECU 目标控制器 接收固件、刷写写入、完整性校验、回滚机制

# 三、核心交互流程(八步法)

# 流程总览

【云端平台】                             【车端T-Box】                           【目标ECU】
     │                                        │                                        │
     │  ① 下发升级任务                        │                                        │
     │ ────────────────────────────────────→ │                                        │
     │                                        │                                        │
     │                                        │  ② 下载升级包                          │
     │                                        │ ←─────────────────────────────────  │
     │                                        │    (HTTPS + 断点续传)                 │
     │                                        │                                        │
     │                                        │  ③ 诊断会话准备                        │
     │                                        │ ──────────────────────────────────→ │
     │                                        │    (10/27/85/3E)                     │
     │                                        │                                        │
     │                                        │  ④ 擦除Flash/准备写入                 │
     │                                        │ ──────────────────────────────────→ │
     │                                        │    (31/2E)                            │
     │                                        │                                        │
     │                                        │  ⑤ 数据传输 (34/36/37)                │
     │                                        │ ←────────────────────────────────→ │
     │                                        │                                        │
     │                                        │  ⑥ 完整性校验 (31)                    │
     │                                        │ ──────────────────────────────────→ │
     │                                        │                                        │
     │                                        │  ⑦ 重启生效 (11)                      │
     │                                        │ ──────────────────────────────────→ │
     │                                        │                                        │
     │  ←─────────────────────────────────  │  ⑧ 上报升级结果                        │
     │     上报升级状态                        │                                        │

# 步骤 ①:云端下发升级任务

云端操作

A[版本管理] --> B[生成升级包] --> C[创建升级任务] --> D[车辆分组] --> E[下发任务]
任务属性 说明
目标车辆 按 VIN、车型、区域等分组
升级包 全量包或差分包
升级策略 立即升级/预约升级/条件升级
优先级 高(安全补丁)/中(功能优化)/低(体验改进)
超时时间 下载超时、升级超时

# 步骤 ②:车端下载升级包

下载流程

1. T-Box 接收升级任务
   ↓
2. 检查升级条件(电量、网络、车辆状态)
   ↓
3. 从云端下载升级包(HTTPS)
   ├── 支持断点续传
   ├── 分片下载(大文件)
   └── 实时进度上报
   ↓
4. 完整性校验
   ├── MD5/SHA256 校验
   ├── 数字签名验证
   └── 包格式解析

关键技术点

技术 作用
断点续传 网络中断后可继续下载,避免重新开始
分片下载 大文件分包下载,支持并发和重试
加密传输 HTTPS + TLS,防止中间人攻击
签名校验 RSA/ECDSA 签名,确保升级包未被篡改

# 步骤 ③:诊断会话准备(预编程)

下载完成后,车端需要与 ECU 建立诊断会话,确保 ECU 处于可刷写状态。

预编程流程

序号 指令 含义 作用
10 03 切换到扩展会话 允许执行诊断操作
3E 00 测试器保持 周期性发送,防止会话超时
27 01/02 安全访问 种子+密钥验证,解锁刷写权限
85 02 关闭 DTC 存储 防止刷写过程中产生误报故障码
28 00 01 关闭通信报文 降低总线负载,提高刷写稳定性

安全访问流程(种子-密钥机制)

【车端】                  【ECU】
   │                         │
   │ ──── 27 01 ─────────→  │ 请求种子
   │                         │
   │ ←──── 67 01 [种子] ──  │ 返回随机种子
   │                         │
   │ ──── 27 02 [密钥] ──→  │ 发送计算后的密钥
   │                         │ 验证密钥
   │ ←──── 67 02 ────────  │ 验证成功,解锁

# 步骤 ④:刷写准备(编程会话)

进入编程模式

指令 作用 说明
10 02 切换到编程会话 ECU 进入可刷写状态,暂停应用
2E F1 99 写入指纹信息 记录刷写时间、操作者等信息
31 01 FF 00 擦除 Flash 擦除目标区域的旧固件

Flash 擦除过程

【车端】                  【ECU】
   │                         │
   │ ──── 31 01 FF 00 ───→  │ 请求擦除
   │                         │
   │ ←──── 71 01 ────────  │ 擦除中...
   │                         │
   │ ←──── 71 01 ────────  │ 擦除中...
   │                         │
   │ ←──── 71 02 ────────  │ 擦除完成

⚠️ 注意:擦除操作不可逆,必须确保升级包完整且正确!


# 步骤 ⑤:数据传输(核心)

这是 OTA 升级的核心流程,基于 UDS 协议的 34/36/37 服务。

完整数据传输时序

【车端】                                          【ECU】
   │                                                │
   │ ──── 34 [块大小] [地址] [长度] ─────────────→  │ 请求下载
   │                                                │
   │ ←──── 74 [块大小] ─────────────────────────  │ 同意传输,返回最大块大小
   │                                                │
   │ ──── 36 [块序号=1] [数据...] ──────────────→  │ 传输第1块数据
   │ ←──── 76 [块序号=1] ───────────────────────  │ 接收成功
   │                                                │
   │ ──── 36 [块序号=2] [数据...] ──────────────→  │ 传输第2块数据
   │ ←──── 76 [块序号=2] ───────────────────────  │ 接收成功
   │                                                │
   │ │  ... 继续传输 ... │
   │                                                │
   │ ──── 36 [块序号=N] [数据...] ──────────────→  │ 传输最后一块
   │ ←──── 76 [块序号=N] ───────────────────────  │ 接收成功
   │                                                │
   │ ──── 37 ──────────────────────────────────→  │ 请求退出传输
   │ ←──── 77 ─────────────────────────────────  │ 传输完成

服务详解

服务 ID 名称 方向 数据格式 说明
0x34 Request Download 车端 →ECU 34 [数据格式] [地址大小] [内存地址] [数据长度] 请求开始下载,指定写入地址
0x74 Response Download ECU→ 车端 74 [最大块大小] ECU 确认可接收,返回单次最大长度
0x36 Transfer Data 车端 →ECU 36 [块序号] [数据内容...] 传输固件数据块
0x76 Response Transfer ECU→ 车端 76 [块序号] 确认接收成功
0x37 Request Transfer Exit 车端 →ECU 37 请求结束传输
0x77 Response Transfer Exit ECU→ 车端 77 确认传输结束

关键技术点

要点 说明
块大小协商 车端请求期望块大小,ECU 返回实际支持的最大值
序号机制 每个数据块带有序号,防止乱序或丢失
流控机制 ECU 可通过 NRC(Negative Response Code)请求暂停
超时处理 传输超时需重试,连续失败则中止升 ���

# 步骤 ⑥:完整性校验

数据传输完成后,必须进行完整性校验,确保固件写入正确。

校验流程

【车端】                                          【ECU】
   │                                                │
   │ ──── 31 01 02 02 ──────────────────────────→  │ 请求执行校验例程
   │                                                │
   │ ←──── 71 01 ───────────────────────────────  │ 校验中...
   │                                                │ 执行 CRC/Checksum 校验
   │ ←──── 71 01 ───────────────────────────────  │ 校验中...
   │                                                │
   │ ←──── 71 02 [校验结果] ─────────────────────  │ 校验完成
   │                                                │
   │ ──── 31 01 01 04 ──────────────────────────→  │ 请求校验结果
   │ ←──── 71 02 [结果] ───────────────────────  │ 返回结果

校验类型

校验类型 说明 作用
Checksum 简单累加和校验 快速验证数据完整性
CRC16/CRC32 循环冗余校验 更可靠的错误检测
数字签名验证 RSA/ECDSA 签名 确保固件来源可信

校验结果处理

结果 处理方式
成功 (0x00) 继续后续流程,准备重启
失败 触发回滚机制,恢复旧版本

# 步骤 ⑦:重启生效

校验通过后,ECU 重启使新固件生效。

重启方式

方式 指令 说明
软重启 11 01 ECU 复位,保持供电
硬重启 断电重启 完全断电后重新上电
应用重启 11 03 重启应用分区

Bootloader 启动流程

【ECU 上电/复位】
        ↓
【Bootloader 启动】
        ↓
┌───────┴────────┐
│ 检测升级标志    │
└───────┬────────┘
        ↓
   ┌────┴────┐
   │ 有新固件? │
   └────┬────┘
        │
    ┌───┴───┐
    │ YES   │ NO
    ↓       ↓
【新固件校验】  【跳转旧固件】
    ↓
 CRC/签名验证
    ↓
┌───┴────────┐
│  验证通过?  │
└───┬────────┘
    │
┌───┴────┐
│ YES    │ NO → 回滚机制
↓
【搬移固件】
 Flash A/B 分区切换
    ↓
【跳转新固件】

A/B 分区机制(双备份):

┌─────────────────────────────────────┐
│           Flash 存储布局              │
├─────────────────────────────────────┤
│  Bootloader   (固定区域)             │
├──────────────┬──────────────────────┤
│  Partition A │  Partition B          │
│  (当前版本)  │  (备份/新版本)         │
└──────────────┴──────────────────────┘

优势:
• 升级失败可立即回滚
• 无需连接外部设备
• 提高升级可靠性

# 步骤 ⑧:结果上报

升级完成后,车端向云端上报升级结果。

上报内容

字段 说明
VIN 车辆识别码
ECU ID 目标 ECU 标识
旧版本 升级前的版本号
新版本 升级后的版本号
升级状态 成功/失败/回滚
失败原因 NRC 码/错误描述
升级耗时 下载时间+刷写时间

云端处理

【接收升级结果】
       ↓
【更新车辆状态】
       ↓
【生成升级报告】
       ↓
【触发后续操作】
  • 成功:更新版本记录
  • 失败:创建工单/告警
  • 回滚:分析原因

# 四、UDS 诊断协议详解

# 4.1 UDS 协议概述

UDS(Unified Diagnostic Services) 是 ISO 14229 定义的统一诊断服务标准,广泛应用于汽车诊断领域。

特性 说明
标准号 ISO 14229-1 (应用层)、ISO 15765-2 (传输层)
通信方式 基于 CAN、以太网等总线
请求/响应 主从模式,诊断仪主动请求,ECU 被动响应
服务分类 诊断会话、数据传输、安全访问、例程控制等

# 4.2 UDS 报文结构

请求报文格式

┌──────────┬──────────┬─────────────────────────┐
│   SID    │  子功能  │        数据参数          │
│ (服务ID) │   参数   │     (可选)              │
│  1 byte  │  1 byte  │      N bytes            │
└──────────┴──────────┴─────────────────────────┘

响应报文格式

┌──────────┬──────────┬─────────────────────────┐
│ SID+0x40 │  子功能  │        数据参数          │
│ (肯定响应)│  参数   │     (可选)              │
│  1 byte  │  1 byte  │      N bytes            │
└──────────┴──────────┴─────────────────────────┘

┌──────────┬──────────┬─────────────────────────┐
│   7F     │   SID    │        NRC              │
│ (否定响应)│ (服务ID) │    (负响应代码)         │
│  1 byte  │  1 byte  │      1 byte             │
└──────────┴──────────┴─────────────────────────┘

# 4.3 OTA 升级常用 UDS 服务

服务 ID 名称 请求 响应 用途
0x10 Diagnostic Session Control 10 [会话类型] 50 [会话类型] 切换诊断会话模式
0x11 ECU Reset 11 [复位类型] 51 [复位类型] ECU 复位重启
0x22 Read Data By Identifier 22 [DID...] 62 [DID...] [数据] 读取数据标识符
0x27 Security Access 27 [级别/子功能] [密钥] 67 [级别] 安全访问验证
0x28 Communication Control 28 [控制类型] [通信类型] 68 控制通信报文
0x2E Write Data By Identifier 2E [DID] [数据] 6E [DID] 写入数据标识符
0x31 Routine Control 31 [控制类型] [RID] [参数] 71 [RID] [结果] 例程控制(擦除/校验)
0x34 Request Download 34 [格式] [地址] [大小] 74 [块大小] 请求下载数据
0x35 Request Upload 35 [格式] [地址] [大小] 75 [块大小] 请求上传数据
0x36 Transfer Data 36 [序号] [数据] 76 [序号] 传输数据块
0x37 Request Transfer Exit 37 77 退出数据传输
0x3E Tester Present 3E [子功能] 7E [子功能] 测试器保活
0x85 Control DTC Setting 85 [开关] C5 [开关] 控制 DTC 存储

# 4.4 诊断会话类型

会话类型 说明 权限
Default Session 0x01 默认会话,ECU 正常运行 最低
Programming Session 0x02 编程会话,允许刷写
Extended Diagnostic Session 0x03 扩展诊断会话
Safety System Diagnostic Session 0x04 安全系统诊断

# 4.5 安全访问机制

种子-密钥算法流程

┌─────────────────────────────────────────────────────────┐
│              安全访问验证流程                           │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  1. 诊断仪发送: 27 01 (请求种子)                       │
│     ↓                                                   │
│  2. ECU 返回: 67 01 [SEED] (返回随机种子)             │
│     ↓                                                   │
│  3. 诊断仪计算: KEY = f(SEED) 使用预设算法            │
│     ↓                                                   │
│  4. 诊断仪发送: 27 02 [KEY] (发送密钥)                │
│     ↓                                                   │
│  5. ECU 验证: 比较计算结果                               │
│     ↓                                                   │
│  6. ECU 返回: 67 02 (验证成功) 或 7F 27 35 (验证失败)  │
│                                                         │
└─────────────────────────────────────────────────────────┘

常见 NRC(Negative Response Code)

NRC 含义 可能原因
0x13 设备响应过长 ECU 处理超时
0x22 条件不满足 未满足服务执行条件
0x31 请求超出范围 参数值超出允许范围
0x33 安全访问拒绝 种子-密钥验证失败
0x35 密钥验证失败 密钥计算错误或次数超限
0x37 请求序号错误 数据块序号不匹配

# 五、通信协议栈

# 5.1 车云通信协议

┌─────────────────────────────────────────────┐
│           应用层: HTTP/HTTPS/MQTT           │
│           升级包下载、任务下发、状态上报      │
└─────────────────────────────────────────────┘
                    │
┌─────────────────────────────────────────────┐
│           安全层: TLS 1.2+                  │
│           双向认证、加密传输                 │
└─────────────────────────────────────────────┘
                    │
┌─────────────────────────────────────────────┐
│           传输层: TCP/UDP                   │
│           可靠传输(QoS保障)                  │
└─────────────────────────────────────────────┘
                    │
┌─────────────────────────────────────────────┐
│           网络层: IP                        │
│           4G/5G 蜂窝网络                    │
└─────────────────────────────────────────────┘

# 5.2 车内诊断通信协议

协议 传输介质 特点 应用场景
DoCAN CAN 总线 带宽低、稳定可靠 传统车型、低速升级
DoIP 以太网 带宽高、支持大数据 新能源车型、高速升级
FlexRay FlexRay 总线 实时性高、容错性强 安全关键系统

# 5.3 DoCAN 与 DoIP 对比

对比项 DoCAN DoIP
传输介质 CAN 总线 以太网
最大带宽 500 Kbps ~ 1 Mbps 100 Mbps ~ 1 Gbps
传输层 ISO-TP (ISO 15765-2) TCP/UDP
寻址方式 CAN ID IP 地址 + 端口
适用场景 传统 ECU 升级 智能座舱、ADAS ECU

# 5.4 协议栈映射

【车端诊断应用】
       │
       ├─── UDS 诊断服务 (ISO 14229)
       │
【传输层适配】
       │
       ├─── DoCAN (ISO 15765-2)  ←─ CAN 总线
       │
       └─── DoIP (ISO 13400)     ←─ 以太网

# 六、异常处理机制

# 6.1 升级过程中的异常场景

异常场景 触发条件 处理策略
网络中断 4G/5G 信号弱或丢失 断点续传、任务重试
电量不足 蓄电池电压低于阈值 暂停升级、等待充电
车辆行驶中 车速不为 0 延迟升级到停车状态
ECU 通信失败 总线故障、ECU 无响应 重试机制、诊断故障码
校验失败 CRC/签名验证错误 中止升级、触发回滚
刷写中断电 升级过程中断电 Bootloader 自动回滚

# 6.2 回滚机制

A/B 分区回滚流程

┌─────────────────────────────────────────────┐
│         升级失败时的回滚处理                │
├─────────────────────────────────────────────┤
│                                             │
│  1. 检测失败条件:                           │
│     • 校验失败 (CRC错误)                    │
│     • 签名验证失败                          │
│     • 启动失败 (应用程序崩溃)               │
│     • 超时 (Bootloader检测)                │
│                                             │
│  2. Bootloader 处理:                       │
│     • 标记新分区为无效                      │
│     • 切换回旧分区                          │
│     • 记录故障码 (DTC)                      │
│                                             │
│  3. 车端处理:                               │
│     • 上报升级失败                          │
│     • 记录失败原因                          │
│     • 等待下次升级任务                      │
│                                             │
└─────────────────────────────────────────────┘

# 6.3 重试机制

重试类型 重试次数 重试间隔 说明
下载重试 3-5 次 1-5 分钟 网络波动导致下载失败
刷写重试 2-3 次 立即 传输失败、NRC 错误
会话重试 3 次 10 秒 会话超时、3E 保活失败

# 6.4 状态机管理

升级状态转换

┌──────────┐
│   待机   │
└─────┬────┘
      │ 接收任务
      ▼
┌──────────┐    下载失败    ┌──────────┐
│  下载中  │ ──────────────→ │ 下载失败 │
└─────┬────┘                 └─────┬────┘
      │ 下载完成                   │ 重试
      ▼                             │
┌──────────┐                 ┌─────┴────┐
│ 预编程中  │ ◄─────────────── │          │
└─────┬────┘    会话失败       │          │
      │                       │          │
      │ 刷写中                │          │
      ▼                       │          │
┌──────────┐    校验失败      │          │
│  刷写中  │ ──────────────→ │          │
└─────┬────┘                 │          │
      │ 重启中               │          │
      ▼                     │          │
┌──────────┐    启动失败      │          │
│ 重启中   │ ──────────────→ │  回滚中   │
└─────┬────┘                 └─────┬────┘
      │                           │
      ▼                           ▼
┌──────────┐                 ┌──────────┐
│  升级成功 │                 │  升级失败 │
└──────────┘                 └──────────┘

# 七、安全机制

# 7.1 安全威胁分析

威胁类型 风险描述 防护措施
中间人攻击 篡改升级包内容 HTTPS + 双向认证
重放攻击 重复发送旧升级包 时间戳 + Nonce
恶意固件 注入恶意代码 数字签名验证
拒绝服务 大量请求导致服务不可用 限流 + 黑名单
权限提升 未授权访问 ECU 安全访问 (种子-密钥)

# 7.2 安全防护体系

┌─────────────────────────────────────────────────┐
│              应用层安全                          │
│  • 权限控制 (RBAC)                               │
│  • 操作审计 (日志记录)                           │
└─────────────────────────────────────────────────┘
                    │
┌─────────────────────────────────────────────────┐
│              数据层安全                          │
│  • 升级包签名 (RSA/ECDSA)                        │
│  • 固件加密 (AES)                                │
│  • 完整性校验 (SHA256)                           │
└─────────────────────────────────────────────────┘
                    │
┌─────────────────────────────────────────────────┐
│              传输层安全                          │
│  • HTTPS/TLS 加密                                │
│  • 双向认证 (mTLS)                               │
│  • 证书管理 (PKI)                                │
└─────────────────────────────────────────────────┘
                    │
┌─────────────────────────────────────────────────┐
│              设备层安全                          │
│  • 安全启动 (Secure Boot)                       │
│  • 种子-密钥验证                                 │
│  • A/B 分区保护                                  │
└─────────────────────────────────────────────────┘

# 7.3 升级包签名与验证

签名流程(云端)

1. 生成升级包 (固件.bin)
   ↓
2. 计算哈希值: SHA256(固件)
   ↓
3. 私钥签名: Sign(哈希, 私钥)
   ↓
4. 附加签名: 固件 + 签名
   ↓
5. 上传到升级服务器

验证流程(车端)

1. 下载升级包
   ↓
2. 分离固件和签名
   ↓
3. 计算固件哈希: SHA256(固件)
   ↓
4. 验证签名: Verify(哈希, 签名, 公钥)
   ↓
5. 验证通过 → 继续升级
   验证失败 → 拒绝升级

# 7.4 国密算法应用

算法 用途 说明
SM2 数字签名 替代 RSA/ECDSA
SM3 哈希算法 替代 SHA256
SM4 对称加密 替代 AES

# 八、面试问答

# 8.1 核心问题

# Q1:请描述一下 OTA 升级的完整流程?

参考回答(3 分钟版):

"OTA 升级是一个跨系统的复杂流程,我主要从云端后台的角度来说:

第一阶段:任务下发 云端根据 VIN 和车型分组,创建升级任务并下发给目标车辆。

第二阶段:车端下载 T-Box 接收任务后,检查电量、网络等前置条件,然后通过 HTTPS 断点续传下载升级包。下载完成后进行 MD5 和签名验证。

第三阶段:诊断通信 车端通过 UDS 协议与目标 ECU 通信。先切换扩展会话、做安全访问验证、关闭 DTC 存储,确保 ECU 处于可刷写状态。

第四阶段:数据刷写 切换到编程会话后,使用 34/36/37 服务进行数据传输。这是核心流程,需要按照 ECU 支持的块大小分块传输固件。

第五阶段:校验与生效 传输完成后进行 CRC 校验,通过后重启 ECU,Bootloader 验证新固件并切换分区。

第六阶段:结果上报 车端将升级结果(成功/失败/回滚)上报云端。

关键点:我们在项目中重点处理了断电续传和回滚机制,确保异常情况下车辆不会变砖。"

# Q2:差分升级是如何实现的?

参考回答

"差分升级的核心是只传输新旧版本的差异部分,主要步骤:

云端(生成差分包)

  1. 使用差分算法(如 bsdiff、bspatch)对比新旧版本
  2. 生成差分包(通常只有原包的 10%-30% 大小)
  3. 对差分包进行签名和压缩

车端(还原固件)

  1. 下载差分包并验证
  2. 使用旧版本固件 + 差分包还原出新固件
  3. 还原方式有两种:
    • 上位机还原:T-Box 还原后再刷写
    • 下位机还原:ECU 自己支持差分解压

优势:节省流量、缩短下载时间、降低服务器成本。 风险:差分算法选择不当可能导致还原失败,需要充分测试。"

# Q3:如果刷写过程中断电怎么办?

参考回答

"这是 OTA 升级必须考虑的关键场景,我们有多层保护机制:

ECU 层面

  • A/B 双分区设计:一个分区运行,另一个分区升级
  • Bootloader 保护:上电时检测升级标志,验证失败自动回滚
  • 原子写入:擦除后确保完整写入,避免半新半旧状态

车端层面

  • 电量检测:电压低于阈值(如 12V)拒绝升级
  • 状态记录:记录当前刷写进度和阶段
  • 重试机制:恢复后可从断点继续

云端层面

  • 任务监控:实时监控升级状态
  • 失败告警:升级失败立即通知
  • 版本锁定:失败车辆暂停新任务推送

实际项目中我们专门测试过各种断电场景(擦除中、传输中、校验中等),确保任何时点断电都不会导致车辆变砖。"

# Q4:如何保证 OTA 升级的安全性?

参考回答

"OTA 安全涉及多个层面:

传输安全

  • HTTPS + TLS 1.2+ 加密传输
  • 双向认证(mTLS)防止伪造设备

包安全

  • RSA/ECDSA 数字签名,防篡改
  • SHA256 完整性校验
  • 必要时对固件进行 AES 加密

访问控制

  • 安全访问机制(种子-密钥)
  • 诊断会话权限控制
  • VIN 精确匹配,防止误刷

设备安全

  • Secure Boot 安全启动
  • A/B 分区防回滚保护

审计监控

  • 全流程日志记录
  • 异常行为告警

在我们的项目中,还采用了国密算法(SM2/SM3/SM4)满足国内合规要求。"

# Q5:UDS 协议中的 34/36/37 服务是什么作用?

参考回答

"这三个服务是 UDS 协议中用于数据传输的核心服务:

0x34 - Request Download(请求下载)

  • 由诊断仪发起
  • 告诉 ECU 要下载的数据信息:地址、大小、数据格式
  • ECU 返回它能接受的最大块大小

0x36 - Transfer Data(传输数据)

  • 真正传输固件内容的服务
  • 每个数据块带有序号,防止乱序
  • 支持 4095 字节数据(单帧)或更多(多帧)
  • ECU 每接收一块返回 0x76 应答

0x37 - Request Transfer Exit(退出传输)

  • 传输完成后发送
  • ECU 确认传输结束

完整流程:34 → 74 → 36 → 76 → ... → 37 → 77

在云端后台设计升级包时,我们需要根据 ECU 返回的块大小来合理分包,确保 36 服务能顺利传输。"

# Q6:你遇到过哪些 OTA 相关的技术难题?如何解决的?

参考回答(举例):

"在奇瑞项目中,我们遇到了一个棘手问题:

问题:某 ECU 在 36 服务传输数据时,间歇性返回 NRC 0x13(响应过长)。

排查过程

  1. 排查网络:CAN 总线负载正常
  2. 排查时序:调整 3E 保活间隔,无效
  3. 排查数据:发现该 ECU 在处理特定数据模式时性能下降

解决方案

  1. 减小单次传输块大小(从 4095 → 2048)
  2. 增加块间延迟(10ms → 20ms)
  3. 优化升级包数据布局

结果:传输成功率从 85% 提升到 99.8%。

总结:OTA 调试需要软硬件协同,有些问题只有通过大量测试和日志分析才能定位。"

# 8.2 常见追问

追问问题 关键点
如何验证升级包是否正确? MD5/SHA256 + 数字签名验证
为什么需要 3E 保活? 防止诊断会话超时,ECU 自动退出编程模式
什么是 NRC? Negative Response Code,负响应代码
CAN 和以太网诊断有什么区别? DoCAN vs DoIP,带宽、传输层不同
如何支持批量车辆升级? 灰度发布、分组推送、并发控制

# 附录

# A. 常用 NRC 代码速查表

NRC 含义 常见原因
0x10 拒绝访问 安全级别不足
0x11 服务不支持 ECU 不支持该服务
0x12 子功能不支持 不支持该参数
0x13 设备响应过长 处理超时或数据过大
0x21 忙碌 ECU 正在处理其他任务
0x22 条件不满足 未满足服务执行条件
0x31 请求超出范围 参数值超出允许范围
0x33 安全访问拒绝 种子-密钥验证失败
0x35 密钥验证失败 密钥错误或尝试次数过多
0x37 请求序号错误 数据块序号不匹配

# B. OTA 升级时间估算参考

ECU 类型 固件大小 传输方式 预估耗时
BCM 1-2 MB DoCAN 5-10 分钟
娱乐主机 (IVI) 500 MB - 2 GB DoIP 15-60 分钟
ADAS 控制器 50-200 MB DoIP 10-30 分钟
网关 500 KB - 1 MB DoCAN 3-5 分钟

# C. 参考资料

标准/规范 说明
ISO 14229-1 UDS 应用层协议
ISO 15765-2 DoCAN 传输层协议
ISO 13400 DoIP 诊断协议
ISO 26262 功能安全标准
AUTOSAR 汽车开放系统架构

📝 最后提醒

  1. 理解整体流程,不需要死记硬背每条指令
  2. 重点掌握:34/36/37 数据传输、种子-密钥机制、A/B 分区回滚
  3. 结合项目经验,能讲清楚遇到的问题和解决方案
  4. 对安全机制有基本认识,知道有哪些防护措施
  5. 了解 CAN 和以太网的差异,能说明 DoCAN 和 DoIP 的区别

祝你面试顺利!🚀