MQTT设备升级
本节主要描述MQTT类型设备OTA升级相关指令的消息体格式,以及这些指令需要注意的事项。
固件下载的详细流程见固件下载流程
定期上报固件版本号
智能设备需定期上报固件版本号(如48小时一次),除此之外,在首次上电运行并成功请求入网后,以及平台下发固件版本号查询指令时,必须上报一次固件版本号。
此上报的Command为8
平台对此上报的回复的Command也为8
帧格式
智能设备上报Topic:/sys/${openId}/${productId}/${deviceId}/firmware_report
定期上报固件版本号的数据帧格式和内容如下所示:
{
"HeaderCtrl":8, //命令码
"MessageId": 1231, //消息id
"Payload":{
"HardVer":"v1.0.1", //硬件版本
"SoftVer":"v2.1.3", //软件版本
"Type": 2, //升级方式:2-http
"Module":"module1" // 模块标识,默认“default”模块可以不上报此参数;默认“default”模块代表整个设备的主版本号
},
"Version":"2.0"
}
Payload域中包含的内容及说明如下所示:
Payload | 说明 |
---|---|
HardVer | 智能设备的硬件版本号,格式为字符串。 |
SoftVer | 智能设备的固件版本号,格式为字符串。 |
Type | 智能设备下载固件的方式,目前MQTT设备支持HTTP方式下载固件。Type为2 表示智能设备采用HTTP方式下载固件。 |
Module | 模块标识,默认“default”模块可以不上报此参数;默认“default”模块代表整个设备的主版本号。 |
回复帧格式
平台下发Topic:/sys/{openId}/{productId}/{deviceId}/firmware_report_ack
平台回复的数据帧格式和内容如下所示:
{
"MessageId": 1231, //消息id
"HeaderCtrl":8, //命令码
"Payload":{
"Code":"200",
"Msg":"SUCCESS",
"Data": {} // 如果有输出参数,则对应 Data 字段, 若无,该字段不返回。
},
"Version":"2.0"
}
注意事项
在上报固件版本号的过程中,可能会由于网络原因没有上报到平台或者平台的响应没有到达设备端;此情况下,智能设备应该重新上报,至少尝试重发1次,建议重发2~3次,重发的时间间隔由设备根据自己的实际情况决定。
上报版本号后,检查当前是否有未完成的OTA升级任务,如果有的话将收到版本与之前版本比对,如果相同则上报升级成功消息到应用服务器,如果不同,则上报升级失败消息到应用服务器。
固件版本号查询指令
平台会主动向设备下发此指令以查询设备的固件版本,设备收到后需要上报一包固件版本号
此指令的Command为13
设备对此指令的回复的Command为8
帧格式
查询智能设备的固件版本号Topic:/sys/{openId}/{productId}/{deviceId}/ask_firmware
固件版本号查询指令的数据帧格式和内容如下所示:
{
"HeaderCtrl":13, //命令码
"MessageId": 1231, //消息id
"Payload":{},
"Version":"2.0"
}
回复帧格式
设备对此指令的回复的数据帧格式与内容与定期上报固件版本号相同
OTA升级指令
平台创建升级任务后,会给设备下发OTA升级指令,设备收到后,需要在第一时间向平台回复确认数据帧,然后再按照指定的流程下载固件。
此指令的Command为9
设备对此指令的回复的Command也为9
帧格式
向智能设备推送固件更新消息 Topic:/sys/{openId}/{productId}/{deviceId}/ota_notify
推送的消息数据帧格式和内容如下所示:
{
"HeaderCtrl":9, //命令码
"MessageId": 1231, //消息id
"Payload":{
"Type": 2, //升级方式:2-http
... //具体Payload的内容和格式见后一小节——HTTP方式升级的Payload域
}
}
推送的数据帧中包含了HeaderOpts域,携带具体更新固件以及升级服务器等信息。
IoT平台会根据智能设备上报固件版本号时所设置的OTA升级方式(Type)字段来向智能设备推送具体信息。具体Payload内容和格式
HTTP方式升级的Payload域
当智能设备上报固件版本号时所设置的Type为02,即设备使用HTTP方式升级固件,IoT平台会向智能设备推送固件信息和HTTP固件下载链接的信息,推送的数据帧中Payload的格式和内容如下所示:
"Payload":{
"Type": 2, //升级方式:2-http
"Url":"http://ota.iot.senthink.com/02022117",
"SoftVer":"v2.1.4",
"SoftSize":123345435, //固件大小
"MD5":232435456, //MD5校验值
"DownID":"E0C040B1",
"Module":"module1" // 模块标识,模块为默认模块“defalut”时,平台不下发Module参数
}
Payload域中包含的内容及说明如下所示:
Payload | 说明 |
---|---|
Type | 这里的Type对应智能设备上报固件版本号时所设置的Type。 |
Url | IoT平台上可用于更新的固件的HTTP下载链接:格式为字符串。 例如:HTTP下载固件的链接为http://ota.iot.senthink.com/02022117 |
SoftVer | IoT平台上可用于更新的固件版本号,格式为字符串。 |
SoftSize | IoT平台上可用于更新的固件文件的大小,单位为字节。 |
MD5 | IoT平台上可用于更新的固件文件的MD5校验值。 |
DownID | 可用更新的固件的下载ID(DownID):智能设备使用HTTP方式下载固件文件的时候,需要带上DownID (HTTP方式下载固件的流程会介绍)。 |
Module | 升级的模块标识,模块为默认模块“default”时,平台不下发Module参数。 |
回复帧格式
智能设备回复OTA指令Topic:/sys/{openId}/{productId}/{deviceId}/ota_notify_ack
设备在收到IoT平台推送的固件更新消息后,需要首先使用同样的Command(9)向平台回复确认数据帧。回复的确认数据帧格式和内容如下所示:
{
"HeaderCtrl":9, //命令码
"MessageId": 1231, //消息id
"Payload":{
"DownID": "33367341"
},
"Version":"2.0"
}
在回复平台的确认数据帧中需要带上IoT平台推送的DownID。
特别注意: 在成功向平台回复确认数据帧后,智能设备需要将自己实际的固件版本号与平台推送的固件版本号进行对比(ASCII字符串对比),如果一样则不需要对目标固件进行下载更新,不一样则需要下载并更新。
固件下载流程
设备在回复完平台升级指令后,需根据升级方式采取不同的固件下载流程。
HTTP方式下载固件的流程
智能设备收到平台的固件更新推送,在将目标固件版本号与本地固件版本号对比确认需要更新目标版本的固件后,则设备可以断开与IoT平台的TCP连接,并使用平台推送的HTTP下载链接进行固件下载。
智能设备需要将平台推送的下载链接Url与DownID进行拼接处理后再使用HTTP GET方式打开。拼接规则如下说明:
拼接规则:Url +“/”+ DownID
例如:
返回的Url为:http://ota.iot.senthink.com/02022117
DownID为:33367341
则拼接后的结果为:http://ota.iot.senthink.com/02022117/33367341
设备请求固件文件,应该使用HTTP GET方式直接打开拼接后的链接:
http://ota.iot.senthink.com/02022117/33367341
特别注意:HTTP下载固件的链接具有时效性,服务器设定该HTTP下载链接在24小时内有效。智能设备超过24小时未请求该链接则该链接会失效,失效后将无法使用该链接进行固件文件的下载。
注意事项
固件文件下载完毕后(无论哪种方式),必须校验MD5值。方式:智能设备计算所下载固件文件的MD5值,并将自己计算的MD5值与OTA升级指令数据帧HeaderOpts域中的MD5值进行对比,相同才可认为新固件被完整地下载,可以对所下载的固件进行更新应用,否则认为固件下载失败。
OTA升级完毕(设备下载完固件文件)后,需要主动断开与HTTP升级服务器的连接,然后应用新固件。新固件应用完毕则重新与IoT平台建立TCP连接,进入正常的应用数据交互流程。
终止OTA升级指令
目前HTTP方式升级OTA不支持终止操作,而Mqtt设备仅支持HTTP方式升级,因此MQTT设备无此指令。