thingsboard iot平台已经支持设备ota,官方提供的demo都是设备直连的情况。提供的网关python程序不能直接升级设备。研究了下,网关其实也是设备,可以将升级包下载到网关,由网关对设备进行升级。前提是这个网关程序是自己写的,或者更改官方的python程序。
1 网关先关注以下主题
v1/devices/me/attributes
v1/devices/me/attributes/response/+
v1/devices/me/rpc/request/+
v1/devices/me/rpc/response/+
v2/fw/response/+/chunk/+
2 上电后设备先发送以下信息,告知iot平台固件版本号
v1/devices/me/telemetry
{
"current_fw_title": "Initial",
"current_fw_version": "v1.1"
}
3 平台点击网关选择升级包时,此topic会收到如下信息
v1/devices/me/attributes
{"fw_title":"otatest","fw_version":"v1.2","fw_tag":"otatest v1.2","fw_size":457965,"fw_checksum_algorithm":"SHA256","fw_checksum":"72448ed632fc5956ff3f76ab23a3d026cbe5f4dca22658c32922fcffe23673d5"}
4 网关也可以发送消息主动查询升级信息
v1/devices/me/attributes/request/${requestId}
{
"sharedKeys": "fw_version,fw_checksum_algorithm,fw_checksum,fw_size,fw_title,fw_version"
}
平台应答
v1/devices/me/attributes/response/+
{"shared":{"fw_checksum":"72448ed632fc5956ff3f76ab23a3d026cbe5f4dca22658c32922fcffe23673d5","fw_checksum_algorithm":"SHA256","fw_size":457965,"fw_title":"otatest","fw_version":"v1.2"}}
${requestId}从1开始,每次递增
5 网关升级过程中需要同步以下信息到iot平台
v1/devices/me/telemetry
{
"current_fw_title": "Initial",
"current_fw_version": "v1.1",
"fw_state": "DOWNLOADING"
}
其中fw_state状态有6种
DOWNLOADING 收到关于新固件/软件更新的通知,设备开始下载更新包
DOWNLOADED 设备已完成更新包的下载
VERIFIED 设备已验证下载包的校验和。
UPDATING 设备已启动固件/软件更新。通常在设备重新启动或服务重新启动之前发送
UPDATED 固件已成功更新到下一版本
FAILED -未验证校验和,或设备更新失败。
6 获取升级包,从以下topic发送信息
v2/fw/request/${requestId}/chunk/${chunkNum}
发送内容:1024
其中
${requestId}- 请求id从1开始,每次递增
${chunkNum}- 请求块号,必须从0开始,每次递增1。发送内容为每次接收的字节数,该值不能超过65535
平台应答:
平台应答请求包数据,长度为1024,最后一包一般少于这个数
网关取到完整升级包后就可以升级不同设备,并将升级状态同步到iot平台,如果升级失败也要发送状态。