设备固件升级

最近更新时间:2019-06-18 17:29:17

操作场景

设备固件升级又称 OTA,是物联网通信服务的重要组成部分。当物联设备有新功能或者需要修复漏洞时,设备可以通过 OTA 服务快速的进行固件升级。

实现原理

固件升级的过程中,需要设备订阅下面两个 Topic 来实现与云端的通信,如下图所示:
OTA topic
示例:

$ota/report/${productID}/${deviceName}
用于发布(上行)消息,设备上报版本号及下载、升级进度到云端
$ota/update/${productID}/${deviceName}
用于订阅(下行)消息,设备接收云端的升级消息

操作流程

以 MQTT 为例,设备的升级流程如下所示:
OTA 时序图

  1. 设备上报当前版本号。设备端通过 MQTT 协议发布一条消息到 Topic $ota/report/${productID/${deviceName},进行版本号的上报,消息为 json 格式,内容如下:
    {
     "type": "report_version",
     "report":{
         "version": "0.1"
     }
    }
    // type:消息类型
    // version:上报的版本号
  2. 然后您可以在控制台上传固件。
  3. 在控制台将指定的设备升级到指定的版本。
  4. 触发固件升级操作后,设备端会通过订阅的 Topic $ota/update/${productID}/${deviceName} 收到固件升级的消息,内容如下:
    {
     "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}不断的上报下载进度,上报的内容如下:
    {
     "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}上报一条开始升级的消息,内容如下:
    {
     "type": "report_progress",
     "report":{
         "progress":{
                "state":"burning",
                "result_code":"0",
                "result_msg":""
         },
         "version": "0.2"
     }
    }
    // type:消息类型
    // state:状态为烧制中
  7. 设备固件升级完成后,再向 Topic $ota/report/${productID}/${deviceName}上报升级成功消息,内容如下:
    {
     "type": "report_progress",
     "report":{
         "progress":{
                "state":"done",
                "result_code":"0",
                "result_msg":""
         },
         "version": "0.2"
     }
    }
    // type:消息类型
    // state:状态为已完成

注意:

在下载固件或升级固件的过程中,如果失败,则通过 Topic $ota/report/${productID}/${deviceName}上报升级失败消息,内容如下:

{
    "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:错误消息