Skip to main content

Thingsboard OTA

tip

OTA功能至少大于等于3.3版本

一、 准备工作

用到主题预览

  • 请求查询云端固件版本信息:v1/devices/me/attributes/request/+
  • 接收设备云端固件版本信息:v1/devices/me/attributes/response/+
  • 推送当前进度:v1/devices/me/telemetry
  • 请求下载安装包:v2/fw/request/+/chunk/+
  • 接收安装包数据:v2/fw/response/+/chunk/+

对比当前固件版本信息

请求v1/devices/me/attributes/request/+查询固件信息

{
"sharedKeys": "fw_version,fw_checksum_algorithm,fw_checksum,fw_size,fw_title"
}

接收v1/devices/me/attributes/response/+固件版本信息

{
"shared": {
"fw_checksum": "ca937967008aab4f444f1d871f493b8ddc5a83273ee10728ca58abe14a1e0ca8",
"fw_size": 580400,
"fw_title": "TEST2",
"fw_checksum_algorithm": "SHA256",
"fw_version": "0.0.01"
}
}

字段解释

  • fw_checksum:校验总数
  • fw_size:文件大小,以字节为单位
  • fw_title:标题
  • fw_checksum_algorithm:校验和算法,默认SHA256
  • fw_version:版本
tip

在设备启动的时候对比当前版本号是否一致不一致则进行更新

被动更新

通过订阅设备数据属性更新消息来达到被动更新v1/devices/me/attributes,此场景用于正在运行中的设备

当接收到有消息推送到此topic的时候,判断以下字段是否和当前固件是否一致,如果不一致则进行更新:

{
"fw_title": "ESB8266",
"fw_version": "0.01",
"fw_tag": "ESB8266 0.01",
"fw_size": 580400,
"fw_checksum_algorithm": "SHA256",
"fw_checksum": "ca937967008aab4f444f1d871f493b8ddc5a83273ee10728ca58abe14a1e0ca8"
}
tip

每一次在云平台更新固件的时候,平台都会主动给v1/devices/me/attributes推送消息

二、 设置固件更新状态

这一步的用意是为了记录当前设备的更新状态,用户可以观看到当前更新状态

通过v1/devices/me/telemetry上报当前设备固件更新状态

{
"current_fw_title": "Initial", //设备当前标题
"current_fw_version": "v0",//设备当前版本号
"fw_state": "DOWNLOADING" //固件升级状态,参考下面说明
}
  1. current_fw_title:当前设备标题
  2. current_fw_version:当前设备版本
  3. fw_state:状态
    • DOWNLOADING: 收到关于新固件/软件更新的通知,设备开始下载更新包
    • DOWNLOADED: 设备已完成更新包的下载
    • VERIFIED: 设备已验证下载包的校验和。
    • UPDATING: 设备已启动固件/软件更新。通常在设备重新启动或服务重新启动之前发送
    • UPDATED: 固件已成功更新到下一版本
    • FAILED: -未验证校验和,或设备更新失败。

三、 下载固件

请求下载固件

通过请求Topic:v2/fw/request/+/chunk/+下载固件

tip

第一个+号为:requestId 第二个+号为:chunkNum

  • requestId: 设备自定义请求ID,requestId + 1 用于平台返回数据时的组包主键
  • chunkNum: 下载包编号从0开始,然后累计。直到下载的数据大小与目标大小一致即可

订阅固件数据包Topic

通过订阅Topic:v2/fw/response/${requestId}/chunk/${chunkNum}来接收 下载固件的请求

返回内容为Byte字节数据

tip

每次返回的数据追加到已下载里面,然后每次都要比较下载的数据与目标数据是否一致,如果一直代表下载完成,接着对包进行校验

Example banner