技术方案 v2.0

OTA 升级系统
技术方案

面向 IoT 设备、智能汽车、嵌入式系统的远程升级完整解决方案

99.9%
升级成功率
70%
流量节省(差分)
4种
升级模式
P0-P3
分级告警

系统概述

OTA(Over-The-Air)通过无线网络远程推送软件更新

🎯

高可靠性

断点续传机制、A/B 双分区隔离、自动回滚保障,升级过程可中断恢复,断电不变砖。

低流量消耗

支持差分升级算法(BsDiff/HDiff),仅传输变化部分,节省 70-90% 流量成本。

🔄

灵活可控

静默升级、强制升级、用户可选、定时预约四种模式,满足不同业务场景需求。

🔒

安全可信

RSA 签名验签、防回滚机制、HTTPS 传输加密,保障升级包安全可信。

📊

可观测性

完整状态跟踪、实时进度监控、分级告警体系,问题早发现早处理。

🚀

灰度发布

百分比/分组/白名单灰度策略,自动化晋级与暂停,平稳推送新版本。

升级模式设计

四种升级模式,覆盖不同业务场景

静默升级流程

1
检测版本
2
后台下载
3
签名验证
4
安装更新
5
重启生效
  • 下载在后台线程执行,不影响设备正常使用
  • 使用 A/B 分区确保升级失败可回退
  • 安装过程记录检查点,支持断点续装

适用场景

适用于安全补丁推送、紧急漏洞修复等无需用户感知的场景。

安全补丁 漏洞修复 后台更新

差分升级原理

旧版本
100 MB
新版本
100 MB
差分包大小
5-20 MB
节省 70-90% 流量

差分算法对比

算法 压缩率 适用场景
BsDiff 70-80% 通用场景
Courgette 85-90% Chromium 系列
HDiff 75-85% 嵌入式/IoT

强制升级状态机

IDLE
WAITING
DOWNLOADING
INSTALLING
SUCCESS

⚠️ 强制升级:不可关闭弹窗,显示倒计时,超时自动升级

UI 交互设计

  • 显示剩余时间(倒计时)
  • 不可关闭弹窗
  • 限制设备核心功能使用
  • 提供紧急联系方式(客服热线)
协议变更 停服通知

定时升级

用户预约升级时间,在指定时段执行升级,避开业务高峰期。

1
预约时间
2
等待触发
3
执行升级

调度策略

策略 说明
错峰调度 按设备分组,不同时间段执行
条件调度 满足条件后执行(电量、网络)

系统架构设计

微服务架构,模块化设计,易于扩展

客户端
📱
设备端 SDK
状态机引擎、下载管理、安全模块
服务层
📦
版本管理服务
版本信息、升级包存储
⚙️
任务调度服务
任务创建、调度、重试策略
📡
设备管理服务
设备注册、分组、状态监控
📊
监控告警服务
指标收集、告警触发
消息队列 & 存储
📨
Kafka
高优先级 / 普通 / 低优先级队列
💾
MySQL
任务、版本、设备的持久化
Redis
缓存、设备锁、限流
☁️
对象存储
OTA 包存储(OSS/S3)

任务状态机

CREATED
PENDING
WAITING
RUNNING
SUCCESS
FAILED
RETRYING

核心数据表

设备表 ota_device

device_id VARCHAR(64) -- 设备唯一标识 device_type VARCHAR(32) -- 设备类型 hardware_id VARCHAR(32) -- 硬件版本 current_version VARCHAR(32) -- 当前版本 group_id VARCHAR(32) -- 设备分组 allow_silent BOOLEAN -- 允许静默升级 allow_auto_reboot BOOLEAN -- 允许自动重启

版本表 ota_version

version VARCHAR(32) -- 版本号 device_type VARCHAR(32) -- 适用设备类型 upgrade_mode ENUM(...) -- 升级模式 priority INT -- 发布优先级 min_battery INT -- 最低电量要求 rollout_percentage INT -- 灰度比例

任务表 ota_task

task_id VARCHAR(64) -- 任务唯一标识 device_id VARCHAR(64) -- 设备ID target_version VARCHAR(32) -- 目标版本 status ENUM(...) -- 任务状态 retry_count INT -- 当前重试次数 error_code VARCHAR(32) -- 错误码

稳定性保障

多重机制保障升级可靠,断电不变砖

🔄

断点续传

HTTP Range 请求 + 本地进度记录,下载中断后自动恢复,支持切换网络后继续。

1
记录范围
2
Range请求
3
更新进度
🛡️

A/B 双分区

双分区隔离设计,新版本写入备分区并验证通过后切换,失败自动回退到原分区。

Slot A
当前系统
Slot B
备系统

自动回滚

启动失败、核心功能异常、心跳超时等场景自动触发回滚,恢复到上一稳定版本。

  • 启动超时自动回退
  • 功能异常自动检测
  • 心跳失联自动触发

错误码体系

错误码 名称 严重程度 处理策略
E_DOWNLOAD_FAILED 下载失败 重试3次,失败标记任务失败
E_VERIFY_FAILED 校验失败 不安装,标记任务失败
E_INSTALL_FAILED 安装失败 尝试回滚,失败上报严重故障
E_LOW_BATTERY 电量不足 等待充电后重试
E_NO_SPACE 空间不足 清理后重试或提示用户

分级告警

P0 紧急
电话 + 短信 + 群通知
升级导致大量设备变砖、服务不可用
P1 重要
短信 + 群通知
升级成功率低于阈值、特定版本安装失败率高
P2 一般
群通知 + 邮件
下载超时率升高、任务队列积压
P3 提醒
邮件
例行统计报告、升级趋势分析

灰度发布策略

多维度灰度 + 自动晋级,问题早发现早止损

灰度流程

1%
24h 监控
10%
24h 监控
50%
48h 监控
100%
持续监控

灰度方式

方式 描述
百分比灰度 按设备 ID 哈希分流
分组灰度 指定设备分组
白名单灰度 指定设备 ID 列表
时间段灰度 特定时间段放量

灰度监控指标

指标 阈值
升级成功率 < 98% 暂停
启动失败率 > 0.5% 暂停
功能异常率 > 1% 暂停
崩溃率 > 0.1% 暂停

安全设计

多重安全机制,保障升级包安全可信

🔐

包签名验证

RSA 私钥签名 + SHA256 摘要,设备端使用公钥验签,确保包未被篡改。

// 签名计算 Signature = RSA(private_key, SHA256(Header + Metadata + Content))
🚫

防回滚机制

  • 版本号单调递增校验
  • 每个版本有最小支持版本限制
  • 版本降级需要特殊授权
🔒

传输安全

  • TLS 1.3 加密传输通道
  • 证书绑定(Certificate Pinning)
  • HMAC + Timestamp 请求签名
  • TLS 双向认证

技术选型建议

消息队列

高吞吐 / 简单场景
Kafka 推荐
RabbitMQ 简单场景

任务调度

分布式任务调度
XXL-JOB 推荐
ElasticJob 可选

差分算法

根据场景选择
HDiff IoT 推荐
BsDiff 通用