Skip to content

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 升级体验。

设备端定期检查新版本 ​

由设备端定期向云平台发起检查新版本的请求,云平台回应设备是否存在新版本需要升级。序列图如下:

  1. 设备开机 设备HTTP接口-设备版本检查 上报当前设备固件版本,返回下发最新版本
  2. 设备定期 设备HTTP接口-设备版本检查 上报当前设备固件版本,返回下发最新版本
  3. 设备发现新版本 HTTP 请求下载固件,HTTP返回固件二进制流
  4. 设备更新固件
  5. 设备上报更新固件进度事件
  6. 设备重启

云平台推送新版本 ​

另一种 OTA 升级方式是由云平台主动推送包含新版本固件信息的消息给设备端,设备端收到消息后下载固件并完成升级。

这种方式和前一种方式的区别,主要在于不需要设备端主动上报事件来检查新版本,而是由工作人员手动触发推送。可以在 OTA 版本详情页向单台设备下发,也可以通过任务定时或批量推送。

  1. 设备开机
  2. 云平台下发升级指令
  3. 设备接收指令,回复指令, HTTP 请求下载固件,HTTP返回固件二进制流
  4. 设备更新固件
  5. 设备上报更新固件进度事件
  6. 设备重启
下发升级指令格式 ​

订阅主题

down/设备码/command/send

设备接收消息:

json
{
  "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
    }
  }
}

设备回复主题:

text
up/设备码/command/send_reply

设备回复消息:

json
{
  "id": 9,
  "time": 1626197189640,
  "code": 200,
  "data": {
    "key": "otaUpgrade",
    "output": {
      "result": "ok"
    }
  }
}
设备上报更新固件进度事件 ​

发布主题:

text
up/设备码/event/post

设备发送消息:

json
{
  "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": "下载失败,无法连接服务器" // 错误信息
    }
  }
}

平台响应主题:

text
down/设备码/event/post_reply

平台回复消息:

json
{
  "id": 5,
  "time": 1626197189640,
  "code": 200
}