OTA固件升级
大约 6 分钟
一、流程概述
HTTPS 方式 OTA 升级流程描述
结合 MQTT 服务、设备和 Web 端总结的主题发送情况:
云端下发升级包信息给设备:
主题:
/${serialNumber}/http/upgrade/set
方向:云端 -> 设备
触发时机:在 Web 端判断 OTA 版本可升级且用户确认升级后
消息内容:包含升级包的 URL、版本和状态,如
{ "taskId": 26, "url": "/profile/iot/1/2024-0824-001954.bin", "version": 1.2, "status": 1 }
设备上报升级进度:
- 主题:
/${serialNumber}/http/upgrade/reply
- 方向:设备 -> 云端
- 触发时机:设备下载升级包过程中定时上报
- 消息内容:包含升级进度和状态,如
{ "taskId": 26, "progress": 100, "version": "1.2", "status": 2 }
- 主题:
设备升级完成后上报最新版本以及状态:
主题:
/${serialNumber}/http/upgrade/reply
方向:设备 -> 云端
触发时机:设备端升级完成后
消息内容:包含最新版本和状态,如
{ "taskId": 26, "version": "1.2", "status": 3 }
模拟的整体交互流程:
// status状态字段定义
AWAIT(0, "等待升级","未推送固件到设备"),
SEND(1, "已发送","已发送设备"),
REPLY(2, "升级中","设备OTA升级中"),
SUCCESS(3, "成功","升级成功"),
FAILED(4, "失败","升级失败"),
STOP(5, "停止","设备离线停止推送"),
UNKNOWN(404, "未知","未知错误码");
//主题定义
${taskId}/ws/ota/status 是云端后台推送给云端前台的一个展示状态主题
${serialNumber}/http/upgrade/set 是云端推送给设备的主题
${serialNumber}/http/upgrade/reply 是设备上给云端的主题
左边是云端上报 , 右边是设备上报
Topic: /26/ws/ota/status
{
"serialNumber": "D1832O34Z5M1",
"status": 0,
"timestamp": 1724482221250
}
Topic: /26/ws/ota/status
{
"serialNumber": "D1832O34Z5M1",
"status": 1,
"timestamp": 1724482221251
}
Topic: /D1832O34Z5M1/http/upgrade/set
{
"taskId": 26,
"url": "/profile/iot/1/2024-0824-001954.bin",
"version": 1.2,
"status": 1
}
Topic: /D1832O34Z5M1/http/upgrade/reply
{
"taskId": 26,
"progress": 5,
"version": "1.2",
"status": 2
}
Topic: /26/ws/ota/status
{
"serialNumber": "D1832O34Z5M1",
"status": 2,
"timestamp": 1724482231404,
"progress": 5
}
Topic: /D1832O34Z5M1/http/upgrade/reply
{
"taskId": 26,
"progress": 50,
"version": "1.2",
"status": 2
}
Topic: /26/ws/ota/status
{
"serialNumber": "D1832O34Z5M1",
"status": 2,
"timestamp": 1724482251326,
"progress": 50
}
Topic: /D1832O34Z5M1/http/upgrade/reply
{
"taskId": 26,
"progress": 70,
"version": "1.2",
"status": 2
}
Topic: /26/ws/ota/status
{
"serialNumber": "D1832O34Z5M1",
"status": 2,
"timestamp": 1724482290405,
"progress": 70
}
Topic: /D1832O34Z5M1/http/upgrade/reply
{
"taskId": 26,
"progress": 100,
"version": "1.2",
"status": 2
}
Topic: /26/ws/ota/status
{
"serialNumber": "D1832O34Z5M1",
"status": 2,
"timestamp": 1724482302296,
"progress": 100
}
Topic: /D1832O34Z5M1/http/upgrade/reply
{
"taskId": 26,
"progress": 100,
"version": "1.2",
"status": 3
}
Topic: /26/ws/ota/status
{
"serialNumber": "D1832O34Z5M1",
"status": 3,
"timestamp": 1724482308749
}
二进制包方式OTA升级
一、引言
OTA(Over-the-Air)升级是一种通过无线网络对设备进行远程升级的技术。本文档旨在详细描述 OTA 升级的流程,包括升级启动、升级包传输等环节。
二、OTA 升级流程概述
- 平台自行拼装 OTA 格式,启动 OTA 升级。
- 云端向设备发送升级启动指令。
- 设备收到升级启动指令后,进行校验和验证,若通过则向云端回复指令。
- 云端收到设备的正确回复后,开始 OTA 升级包传输。
- 云端向设备发送升级包传输指令。
- 设备收到升级包传输指令后,进行校验和验证,若通过则向云端回复指令。
- 云端根据设备的回复判断是否所有升级包都已传输完成,若未完成则继续发送下一个升级包传输指令,直至升级完成。
三、具体流程步骤
报文示例:
- 升级启动阶段:
- 云端 -> 设备:
0x55aa 0x00 0x0A 0x0004 [固件包字节数] [校验和]
- 设备 -> 云端:
0x55aa [0x00 - 0xFF] 0x0A 0x0001 [升级包分包传输大小] [校验和]
- 升级包传输阶段:
- 云端 -> 设备:
0x55aa 0x00 0x0B 0x0004 + [数据包长度] [包偏移][数据包内容] [校验和]
- 设备 -> 云端:
0x55aa [0x00 - 0xFF] 0x0B 0x0000 [校验和]
- 升级启动
- 云端 -> 设备:云端向设备发送升级启动指令,指令包含帧头(0x55aa)、版本号(0x00)、指令类型(0x0A)、子指令(0x0004)、固件包字节数和校验和(从帧头开始,按字节求和,对 256 求余)。
- 设备 -> 云端:设备收到升级启动指令后,进行校验和验证。若校验和验证通过,设备向云端回复指令,指令包含帧头(0x55aa)、版本号(0x00 - 0xFF)、指令类型(0x0A)、子指令(0x0001)、升级包分包传输大小(0x00:256byte(默认);0x01:512byte;0x02:1024byte)和校验和(计算方式同云端发送的指令)。
- 升级包传输
- 云端 -> 设备:云端向设备发送升级包传输指令,指令包含帧头(0x55aa)、版本号(0x00)、指令类型(0x0B)、子指令(0x0004 + 数据包长度)、前四字节为包偏移,后面为数据包内容(若包偏移大于等于固件包大小,则包传输结束)和校验和(从帧头开始,按字节求和,对 256 求余)。
- 设备 -> 云端:设备收到升级包传输指令后,进行校验和验证。若校验和验证通过,设备向云端回复指令,指令包含帧头(0x55aa)、版本号(0x00 - 0xFF)、指令类型(0x0B)、子指令(0x0000)、空内容和校验和(计算方式同云端发送的指令)。
- 升级完成判断
- 云端收到设备的回复后,判断是否所有升级包都已传输完成。
- 若已完成,OTA 升级结束。
- 若未完成,继续发送下一个升级包传输指令,回到升级包传输步骤。
二、注意事项
- 在整个升级过程中,校验和的验证是确保数据准确性和完整性的重要环节,任何校验和不匹配的指令都应被视为错误并进行相应的处理。
- 升级包的传输过程中,需要确保无线网络的稳定性,以避免数据丢失或传输中断。
- 若升级过程中出现异常情况,应具备相应的错误处理机制,例如重试、回滚等操作,以保证设备的正常运行。
三、操作流程
HTTPS 方式 OTA 升级流程操作
1. 运维管理-产品固件:添加固件,选择产品:
2. 固件详情添加任务:
- 产品固件列表点击固件详情
- 新增任务,升级范围可选全部设备或指定设备 注意:选择预定升级时间,会在该时间节点升级,如果不选择,点击保存后立即升级
3. 实时观察任务升级进度:
查看任务详情:
等待预定升级时间开始升级:
设备升级中:
设备升级成功: