最近在整理thingsboard课程,基于最新thingsboard版本3.9.1/4.0,欢迎大家收藏、关注我,提问,在评论区留言,我争取把最新、最准、最好的课程,呈现在各位亦师亦友的csdn广大读者面前。
目录
1 OTA升级
1.1 基础功能
OTA升级功能概述
其核心功能包括:
1、固件管理 :上传、存储和管理设备的文件,支持固件(Firmware)和软件(Software)。
2、设备兼容性:每个升级包都必须与特定的设备配置文件绑定,保证同类兼容性设备才会收到更新通知。
3、升级任务分配 :将固件升级任务分配给指定设备或设备组。
4、状态监控 :实时监控设备的升级进度和状态,包括下载、验证、更新等阶段,并可以通过仪表板可视化展示。
5、日志记录 :记录升级过程中的关键事件,便于故障排查。
6、安全性 :支持安全协议(如 HTTPS 和 MQTT),确保升级文件传输的安全性。
注意:
一个完整的OTA升级,需要平台和设备配合起来,才能完成。
平台:管理升级包。
设备:定期轮询是否可升级,下载升级包,上报升级状态/升级结果。
1.2 平台发起升级
1.2.1流程说明
OTA升级流程分步说明
1、准备阶段
用户上传固件文件到 ThingsBoard 平台。
配置固件信息,例如版本号、描述等。
2、任务分配
创建一个OTA升级任务,选择目标设备或设备组。
设置升级参数,例如升级优先级、超时时间等。
3、设备端处理
设备定期向平台查询是否有新的固件更新。
如果有更新,设备会下载固件文件并执行升级操作。
4、状态反馈
设备在升级过程中会向平台发送状态更新,例如“下载中”、“安装中”、“完成”或“失败”。平台会记录这些状态并提供可视化界面供管理员查看。
5、日志与监控
升级完成后,管理员可以通过日志查看整个升级过程的详细信息。
如果升级失败,可以根据日志进行问题排查。
参见图Diag-05-12。
1.2.2操作步骤分解
在服务端,导航菜单“高级功能"-->“OTA升级”,如下:
igw111.bin的内容是123456。
igw111.bin的文件大小6个字节。
说明:
标题* - 升级包的名称。可以对生产和调试固件/软件使用不同的名称。
版本* - 升级包的版本。标题和版本的组合在租户范围内必须是唯一的。
设备配置* - 每个软件包都与一个设备配置文件兼容。
包类型* - 可以是固件或软件。
上传包文件:二进制文件或外部URL。
是否自动生成校验和。
添加完成之后,升级包列表,如下:
升级包上传完成之后,查看详情,如下:
步骤A-将升级包分配给设备,如下:
或者
步骤B-将升级包分配给设备配置,如下:
注意:以上的步骤A或步骤B的操作,会触发后台OTA升级更新动作,平台自动跟踪更新进度并将其保存到设备共享属性中。共享属性如下:
fw(sf)_title - 固件(软件)的名称。
fw(sf)_version - 固件(软件)的版本。
fw(sf)_size - 固件(软件)文件的大小(以字节为单位)。
fw(sf)_checksum - 用于验证接收到的文件的完整性的属性。
fw(sf)_checksum_algorithm - 用于计算文件校验和的算法。
比如步骤A,触发共享属性更新:
平台发送v1/devices/me/attributes
因为设备订阅了v1/devices/me/attributes
所以设备收到v1/devices/me/attributes
内容如下:
{
"fw_title": "igwPackage",
"fw_version": "v1.1.1",
"fw_tag": "igwPackage v1.1.1",
"fw_size": 6,
"fw_checksum_algorithm": "SHA256",
"fw_checksum": "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92"
}
{
"deleted": [
"fw_url"
]
}
在设备端,设备收到订阅消息如下:
设备的共享属性(创建)更新如下:(fw_size = 6)
设备的最新遥测数据(创建)更新如下:(fw_state = INITIAED)
设备开始下载固件,如下:[标记]Mark-20250404-1
(1)设备发送消息给平台请求下载
设备发送v2/fw/request/${requestId}/chunk/${chunkNum}
平台接收v2/fw/request/${requestId}/chunk/${chunkNum}
${requestId}- 请求id从1开始
${chunkNum}- 请求块号,必须从0开始,每次递增1。发送内容为每次接收的字节数,该值不能超过65535,块号递增次数=文件总字节数/每次接收字节数 然后再向上取整,保证安装包文件的能够取完整。
实际消息:(requestId=1/2/3, chunkNum=0/1/2)
v2/fw/request/1/chunk/0
v2/fw/request/2/chunk/1
v2/fw/request/3/chunk/2
payload内容:{2}
(2)平台返回给设备文件内容
平台发送 v2/fw/response/${requestId}/chunk/${chunkNum}
设备接收v2/fw/response/${requestId}/chunk/${chunkNum}
payload内容:{x}
x是升级包文件的字节数据。
实际消息:
v2/fw/response/1/chunk/0
v2/fw/response/2/chunk/1
v2/fw/response/3/chunk/2
(3)升级过程中,下载状态,升级结果,用遥测数据发送给平台
设备发送 v1/devices/me/telemetry
平台接收v1/devices/me/telemetry
{
"fw_state": "UPDATED"
}
“设备开始下载固件”的操作日志截图,如下:
1.2.3总结
设备端需要指令配置和操作总结
预先准备工作:
设备订阅topic,如下:
v1/devices/me/attributes
v1/devices/me/attributes/response/+
v1/devices/me/rpc/request/+
v1/devices/me/rpc/response/+
v2/fw/response/+/chunk/+
设备发送遥测数据给平台,如下:
DOWNLOADING 收到关于新固件/软件更新的通知,设备开始下载更新包
DOWNLOADED 设备已完成更新包的下载
VERIFIED 设备已验证下载包的校验和。
UPDATING 设备已启动固件/软件更新。通常在设备重新启动或服务重新启动之前发送
UPDATED 固件已成功更新到下一版本
FAILED -未验证校验和,或设备更新失败。
设备端升级的流程:
1、查询升级指令
使用MQTT或 HTTP协议,设备定期向平台查询是否有新的固件更新。
查询主题通常为 /v1/devices/me/attributes 或 /v1/devices/me/rpc/request/。
2、下载固件文件
如果收到升级指令,设备从平台下载固件文件。
固件文件的URL通常通过RPC调用或属性更新获取。
3、执行升级
下载完成后,设备验证固件文件的完整性(例如校验MD5或SHA256哈希值)。
执行固件更新操作(例如烧录到Flash存储)。
4、反馈状态
设备在升级过程中向TB发送状态更新。
状态更新通常通过发布消息到/v1/devices/me/attributes主题。
1.3 设备发起升级
(1)设备上报当前版本信息(必须步骤)
设备发送 v1/devices/me/telemetry
平台接收 v1/devices/me/telemetry 。--平台判断是否需要升级。
payload内容:
{"current_fw_title":"MyFirmware", "current_fw_version":"v1.0.0"}
(2)设备主动发起更新检查,以查看平台上升级包的版本。
(升级包版本信息一般保存在设备的共享属性中,共享属性可以人工方式更新)
(2-1)设备发送检查更新消息到平台:
v1/devices/me/attributes/request/${requestId}
${requestId} - 请求id,从1开始递增
payload内容:
{
"sharedKeys": "fw_version,fw_checksum_algorithm,fw_checksum,fw_size,fw_title,fw_version"
}
(2-2)平台返回给设备的检查更新消息的响应消息:
v1/devices/me/attributes/response/1
payload内容:(比如)
{"shared":{"fw_checksum":"17ae291d08837890026d562e5b666f88d6389fe71d1183d6ed7eeee7505cc209","fw_size":421320,"fw_title":"igwPackage","fw_checksum_algorithm":"SHA256","fw_version":"1.1.1"}}
以上步骤(2)使用的是attributs方式,也可以用rpc方式。
比如 设备发送v1/devices/me/rpc/request/$REQUEST_ID
平台接收v1/devices/me/rpc/request/$REQUEST_ID
payload内容:
{
"method": "checkFirmwareUpdates",
"params": {}
}
平台发送 v1/devices/me/rpc/response/$REQUEST_ID
设备接收 v1/devices/me/rpc/response/$REQUEST_ID
payload内容:
{
"fw_title": "MyFirmware",
"fw_version": "v1.1",
"fw_size": 1024,
"fw_checksum": "sha256:abcd1234...",
"fw_checksum_algorithm": "SHA256"
}
(3)如果查询到平台有升级包则设备开始下载
具体步骤参见Mark-20250404-1。