OTA 固件升级
什么是 OTA?
OTA 的全称是 Over-the-Air Technology,即空中升级技术,也就是我们通常说的远程升级,在物联网硬件中特指对固件或系统的升级,有时也称为 FOTA,即 Firmware OTA。
OTA 固件版本管理
ZhiLian.Yun 提供了独立的固件托管服务,您只需创建固件版本,并上传固件包。
创建固件版本
进入 维护 > OTA 版本 > 创建 OTA 版本,填写如下内容:
- 固件名称:给固件版本起一个任意的名称。
- 所属设备类型:选择需要升级的设备所属设备类型。设备类型决定了该 OTA 版本可以匹配哪些设备。
- 版本号:支持通用的版本号命名方式,例如:
1.0.0
提示
关于版本号命名
通常版本号由两段或三段数字组成,例如: 1.9.15。三段版本号代表的意思分别是:
1:主版本号(major version)。比如升级了大量新的特性、整体有比较大的改变等。 9:小版本号(minor version)。比如升级了少量的特性、修复了 Bug 等。 15:构建版本号(release version)。用于区分在前两个版本号相同的情况下,不同的构建发布版本。 新旧版本号的对比,要从左到右进行依次对比,例如:
1.0.3 > 1.0.2 2.0.1 > 1.19.5 2.2.19 > 2.2.2
- 模块:用于表示该固件属于哪个模块,默认为
main,即硬件的主模块。当硬件中有多个需要升级的模块时,可使用不同的模块名称来创建固件。 - 是否指定待升级设备:如果不指定待升级设备,则默认该固件版本对设备类型下所有设备有效。 使用该功能,可对新固件限定小范围升级,从而验证升级可靠性。另外,也可以根据业务需要,实现灰度升级。
- 是否指定待升级版本:如果不指定待升级版本,则默认该固件版本对设备类型下所有版本的设备有效。 当进行差分升级时,需要特别约定固件升级前后的版本,适合使用该功能。
- 上传固件:支持文件格式包括:
.bin,.img,.dav,.tar,.gz,.zip,.gzip,.apk,.tar.gz。 - 固件下载地址使用 HTTPS:这里的设置决定了云平台下发给设备的升级命令消息中,固件下载地址是否使用 HTTPS。对于不支持 HTTPS 访问的单片机,可以关闭该选项,使用普通的 HTTP 下载地址。
OTA 版本详情
OTA 版本详情页包含 概览、版本分布、升级统计 和 设置 页面。
设备上报固件当前版本号
在设备进行 OTA 升级之前,云平台需要知道设备当前固件的版本号,从而为每个设备计算是否需要升级,以及需要升级到哪个新版本。
参考《设备HTTP接口-设备版本检查》
OTA 升级方式
ZhiLian.Yun 云平台支持两种 OTA 升级方式:
设备端定期检查新版本 云平台推送新版本 这两种升级方式可同时使用,既可实现设备端自动升级,也可在特定场景下由云平台主动推送升级,达到最佳的 OTA 升级体验。
设备端定期检查新版本
由设备端定期向云平台发起检查新版本的请求,云平台回应设备是否存在新版本需要升级。序列图如下:
- 设备开机 设备HTTP接口-设备版本检查 上报当前设备固件版本,返回下发最新版本
- 设备定期 设备HTTP接口-设备版本检查 上报当前设备固件版本,返回下发最新版本
- 设备发现新版本 HTTP 请求下载固件,HTTP返回固件二进制流
- 设备更新固件
- 设备上报更新固件进度事件
- 设备重启
云平台推送新版本
另一种 OTA 升级方式是由云平台主动推送包含新版本固件信息的消息给设备端,设备端收到消息后下载固件并完成升级。
这种方式和前一种方式的区别,主要在于不需要设备端主动上报事件来检查新版本,而是由工作人员手动触发推送。可以在 OTA 版本详情页向单台设备下发,也可以通过任务定时或批量推送。
- 设备开机
- 云平台下发升级指令
- 设备接收指令,回复指令, HTTP 请求下载固件,HTTP返回固件二进制流
- 设备更新固件
- 设备上报更新固件进度事件
- 设备重启
下发升级指令格式
订阅主题
down/设备码/command/send设备接收消息:
{
"id": 9,
"time": 1626197189638,
"data": {
"key": "otaUpgrade",
"input": {
"module": "main", // 固件模块名称
"enable": 1, // 是否可以升级,0 禁止升级,1 可以升级
"version": "1.0.1",// 目标版本号
"url": "https://ota.example.com/device/ota/main.bin", // 固件下载地址
"md5": "82ea6675a64a7049b6142aa242a4", // 固件 MD5 校验值
"size": 223, // 固件大小(字节)
"id":234, // 固件ID
"taskId":333, // 任务ID
}
}
}设备回复主题:
up/设备码/command/send_reply设备回复消息:
{
"id": 9,
"time": 1626197189640,
"code": 200,
"data": {
"key": "otaUpgrade",
"output": {
"result": "ok"
}
}
}设备上报更新固件进度事件
发布主题:
up/设备码/event/post设备发送消息:
{
"id": 5,
"ack": 1,
"time": 1626197189638,
"data": {
"key": "otaProgress",
"value": {
"id": 234, // 固件ID
"taskId": 333, // 任务ID
"module": "main", // 固件模块名称
"version": "1.0.1",// 目标版本号
"progress": 98, // 进度百分比
"code":42, // 错误码 200成功
"msg": "下载失败,无法连接服务器" // 错误信息
}
}
}平台响应主题:
down/设备码/event/post_reply平台回复消息:
{
"id": 5,
"time": 1626197189640,
"code": 200
}