130 lines
4.9 KiB
Markdown
130 lines
4.9 KiB
Markdown
|
## 操作场景
|
|||
|
设备固件升级又称 OTA,是物联网通信服务的重要组成部分。当物联设备有新功能或者需要修复漏洞时,设备可以通过 OTA 服务快速的进行固件升级。
|
|||
|
|
|||
|
|
|||
|
## 实现原理
|
|||
|
固件升级的过程中,需要设备订阅下面两个 Topic 来实现与云端的通信,如下图所示:
|
|||
|
![OTA topic](https://main.qcloudimg.com/raw/0046e2a294c541e109fc0b6829d180cc.jpg)
|
|||
|
示例:
|
|||
|
```php
|
|||
|
$ota/report/${productID}/${deviceName}
|
|||
|
用于发布(上行)消息,设备上报版本号及下载、升级进度到云端
|
|||
|
$ota/update/${productID}/${deviceName}
|
|||
|
用于订阅(下行)消息,设备接收云端的升级消息
|
|||
|
```
|
|||
|
|
|||
|
|
|||
|
## 操作流程
|
|||
|
设备的升级流程如下所示:
|
|||
|
![OTA 时序图](https://main.qcloudimg.com/raw/a2f10ab90959a23b1675201b1e2311e0.jpg)
|
|||
|
1. 设备上报当前版本号。设备端通过 MQTT 协议发布一条消息到 Topic `$ota/report/${productID/${deviceName}`,进行版本号的上报,消息为 json 格式,内容如下:
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "report_version",
|
|||
|
"report":{
|
|||
|
"version": "0.1"
|
|||
|
}
|
|||
|
}
|
|||
|
// type:消息类型
|
|||
|
// version:上报的版本号
|
|||
|
```
|
|||
|
2. 然后您可以在控制台上传固件。
|
|||
|
3. 在控制台将指定的设备升级到指定的版本。
|
|||
|
4. 触发固件升级操作后,设备端会通过订阅的 Topic `$ota/update/${productID}/${deviceName}` 收到固件升级的消息,内容如下:
|
|||
|
``` json
|
|||
|
{
|
|||
|
"file_size": 708482,
|
|||
|
"md5sum": "36eb5951179db14a631463a37a9322a2",
|
|||
|
"type": "update_firmware",
|
|||
|
"url": "https://ota-1255858890.cos.ap-guangzhou.myqcloud.com",
|
|||
|
"version": "0.2"
|
|||
|
}
|
|||
|
// type:消息类型为update_firmware
|
|||
|
// version:升级版本
|
|||
|
// url:下载固件的url
|
|||
|
// md5asum:固件的MD5值
|
|||
|
// file_size:固件大小,单位为字节
|
|||
|
```
|
|||
|
5. 设备在收到固件升级的消息后,根据 URL 下载固件,下载的过程中设备 SDK 会通过 Topic `$ota/report/${productID}/${deviceName}`不断的上报下载进度,上报的内容如下:
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "report_progress",
|
|||
|
"report":{
|
|||
|
"progress":{
|
|||
|
"state":"downloading",
|
|||
|
"percent":"10",
|
|||
|
"result_code":"0",
|
|||
|
"result_msg":""
|
|||
|
},
|
|||
|
"version": "0.2"
|
|||
|
}
|
|||
|
}
|
|||
|
// type:消息类型
|
|||
|
// state:状态为正在下载中
|
|||
|
// percent:当前下载进度,百分比
|
|||
|
```
|
|||
|
6. 当设备下载完固件,设备需要通过 Topic `$ota/report/${productID}/${deviceName}`上报一条开始升级的消息,内容如下:
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "report_progress",
|
|||
|
"report":{
|
|||
|
"progress":{
|
|||
|
"state":"burning",
|
|||
|
"result_code":"0",
|
|||
|
"result_msg":""
|
|||
|
},
|
|||
|
"version": "0.2"
|
|||
|
}
|
|||
|
}
|
|||
|
// type:消息类型
|
|||
|
// state:状态为烧制中
|
|||
|
```
|
|||
|
7. 设备固件升级完成后,再向 Topic `$ota/report/${productID}/${deviceName}`上报升级成功消息,内容如下:
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "report_progress",
|
|||
|
"report":{
|
|||
|
"progress":{
|
|||
|
"state":"done",
|
|||
|
"result_code":"0",
|
|||
|
"result_msg":""
|
|||
|
},
|
|||
|
"version": "0.2"
|
|||
|
}
|
|||
|
}
|
|||
|
// type:消息类型
|
|||
|
// state:状态为已完成
|
|||
|
```
|
|||
|
|
|||
|
>!在下载固件或升级固件的过程中,如果失败,则通过 Topic `$ota/report/${productID}/${deviceName}`上报升级失败消息,内容如下:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"type": "report_progress",
|
|||
|
"report":{
|
|||
|
"progress":{
|
|||
|
"state":"fail",
|
|||
|
"result_code":"-1",
|
|||
|
"result_msg":"time_out"
|
|||
|
},
|
|||
|
"version": "0.2"
|
|||
|
}
|
|||
|
}
|
|||
|
// state:状态为失败
|
|||
|
// result_code:错误码,-1:下载超时;-2:文件不存在;-3:签名过期;-4:MD5不匹配;-5:更新固件失败
|
|||
|
// result_msg:错误消息
|
|||
|
```
|
|||
|
|
|||
|
## OTA断点续传
|
|||
|
物联网设备有部分场景处于弱网环境,在这个场景下连接会不稳定,固件下载会中断的情况出现。如果每次都从0偏移开始下载固件,则弱网环境有可能一直无法完成全部固件下载,因此固件的断点续传功能特别必要。
|
|||
|
|
|||
|
断点续传就是从文件上次中断的地方开始重新下载或上传,要实现断点续传的功能,需要设备端记录固件下载的中断位置,同时记录下载固件的md5、文件大小、版本信息。
|
|||
|
|
|||
|
平台针对OTA中断的场景,设备侧report设备的版本,如果上报的版本号与要升级的目标版本号不一致,则平台会再次下发固件升级消息,设备获取到升级的目标固件的信息与本地记录的中断的固件信息比较,确定为同一固件后,基于断点继续下载。
|
|||
|
|
|||
|
SDK提供的OTA sample示例了断点续传的断点记录及续传实现,示例是基于json文件实现记录描述,对于没有文件系统的修改这部分实现即可。
|
|||
|
|
|||
|
带断点续传的OTA升级流程如下,弱网环境下第3步到第6步有可能会多次执行,没有执行第7步,执行第3步,设备端都会收到第4步的消息。
|
|||
|
|
|||
|
![OTA 断点续传时序图](https://main.qcloudimg.com/raw/5d17e84352b59ea448fb95824ea53e6d.jpg)
|