
# MQTT协议设备OTA固件升级
#### 场景说明
MQTT（Message Queuing Telemetry Transport）是一个基于客户端-服务器的消息发布/订阅传输协议，主要应用于计算能力有限，且工作在低带宽、不可靠的网络的远程传感器和控制设备，适合长连接的场景，如智能路灯等。固件升级功能是网络设备所必须支持的基础服务。在设备固件出现安全漏洞、软件bug维护、自身功能优化、以及设备性能改良等需更新固件时，在线升级功能就尤为重要。本文档通过MQTT.fx模拟固件设备，使用华为云平台对该固件进行设备升级。
![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
软件升级流程和固件升级流程一样，只是在设备上报版本号时对应参数字段不一样。固件升级上报版本号对应参数字段为fw_version，软件升级上报版本号对应参数字段为sw_version,请参考[设备上报版本号](https://support.huaweicloud.com/api-iothub/iot_06_v5_3029.html)
#### 整体流程
图1升级实践流程   
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001156995773.png "点击放大")
图2MQTT设备升级流程   
![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001110675822.png "点击放大")
#### 开发环境
- 软件：华为云（已开通[设备接入服务](https://www.huaweicloud.com/product/iothub.html)）、win7及以上版本的64位操作系统（本文以windows 10 64-bit系统调试）、[MQTT.fx](https://iotda-document.obs.cn-north-4.myhuaweicloud.com/mqttfx-1.7.1-windows-x64.exe)模拟器。
 
#### 前提条件
- 已注册华为云官方账号。未注册可单击[注册页面](https://reg.huaweicloud.com/registerui/public/custom/register.html#/register)完成注册。
- 已完成实名制认证。未完成可在华为云上单击[实名认证](https://account.huaweicloud.com/usercenter/#/accountindex/realNameAuth)，否则无法使用设备接入功能。
- 已开通设备接入服务。未开通则访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"立即使用"后开通该服务。
 
#### 前期准备
- 下载并安装MQTT.fx(应使用1.7.1及以上版本)MQTT.fx安装请参考[使用MQTT.fx调测](https://support.huaweicloud.com/devg-iothub/iot_01_2127.html)。
- 升级包文件准备。固件升级包及其版本号需向模组厂家获取。本次演示使用临时文件代替。
- [创建产品](https://support.huaweicloud.com/usermanual-iothub/iot_01_0054.html#section0)，创建MQTT协议产品（如果有MQTT协议产品可直接使用）。
- [注册单个设备](https://support.huaweicloud.com/usermanual-iothub/iot_01_0031.html#section0)。
- [设备群组](https://support.huaweicloud.com/usermanual-iothub/iot_01_0020.html)，将注册的设备加入一个设备群组(创建升级任务时会用到)。
 
#### 上传升级包
1. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"立即使用"进入设备接入控制台。选择您的实例，单击实例卡片进入。
2. 在左侧导航栏选择"设备 \> 软固件升级"。
3. 选择"资源包管理"页签，选择"固件列表"。
4. 单击"上传固件"，在弹出的页面中有两种上传方式，OBS文件上传和本地文件上传。 
   图3上传升级包-OBS文件   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981577941.png "点击放大")
   图4上传升级包-本地文件   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950378364.png "点击放大")
   
   
5. 上传升级包后，填写升级包参数信息，单击"确定"完成升级包上传。 
   图5上传升级包-OBS文件参数   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981497793.png "点击放大")
   图6上传升级包-本地文件参数   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981577953.png "点击放大")
   
   
6. 升级包上传完成后会在"固件列表"中显示出来。 
   图7软固件升级-固件列表   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950378372.png "点击放大")
   
   
7. 选择"升级任务"，在"固件升级"页签，单击"新建任务"按钮，填写参数信息，选择升级包，选择需要升级的设备，单击"立刻创建任务"。 
   图8新建固件升级任务-Test_upgrade_1   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981497801.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   创建升级任务时，可以选择多个升级包（最多10个），选择的升级包必须满足支持的源版本没有重复。如果某个升级包没有指定支持源版本，则默认该升级包支持所有源版本设备升级。
   
   
8. 任务创建成功后可以在任务列表中查询到该任务，单击详情可以查看当前任务详情。在任务详情页面可以批量停止（一次最多100个设备）或单个停止正在执行中的设备升级，也可以批量重试（一次最多100个设备）或单个重试失败的设备升级。单击"全部重试"可以重试该批量升级任务中所有失败的设备升级。 
   图9任务详情-Test_upgrade_1   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981577961.png "点击放大")
   
   
 
#### 业务实现
1. 使用MQTT.fx模拟设备接入平台，详情请参考[连接鉴权](https://support.huaweicloud.com/devg-iothub/iot_01_2127.html#section3)。
2. 用MQTT.fx订阅平台下行信息Topic，MQTT.fx会收到平台服务端下发的查询版本命令。 
   **Topic**
   下行: $oc/devices/{device_id}/sys/events/down
   **参数说明**
   请参考[平台下发获取版本信息通知](https://support.huaweicloud.com/api-iothub/iot_06_v5_3028.html)
   图10订阅通知   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001956231820.png "点击放大")
   
   
3. 通过MQTT.fx上报软固件版本信息。 
   **Topic**
   上行: $oc/devices/{device_id}/sys/events/up
   **参数说明**
   请参考[设备上报软固件版本](https://support.huaweicloud.com/api-iothub/iot_06_v5_3029.html)
   **示例**
   ```
   Topic: $oc/devices/{device_id}/sys/events/up   
   数据格式：  {
         "object_device_id": "{object_device_id}",
         "services": [{
             "service_id": "$ota",
             "event_type": "version_report",
             "event_time": "20151212T121212Z",
             "paras": {
                 "sw_version": "v1.0",
                 "fw_version": "v1.0"
             }
         }]
     }
   ```
   图11上报版本号   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001105685288.png "点击放大")
   
   
4. 上报完版本号后，模拟器会接收到平台下发的升级通知，通知信息如下： 
   **Topic**
   上行: $oc/devices/{device_id}/sys/events/down
   **参数说明**
   请参考[平台下发升级通知](https://support.huaweicloud.com/api-iothub/iot_06_v5_3030.html)
   图12获取升级通知
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001993232861.png "点击放大")
   
   
5. 设备收到升级通知后，可通过Http请求下载升级包。 
   本次演示使用Curl命令代替。
   图13下载升级包
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001993233173.png "点击放大")
   示例
   ```
   curl -X GET -H "Authorization:Bearer ****************************" "https://**.**.**.**:8943/iodm/dev/v2.0/upgradefile/applications/********/devices/********/packages/********" -v -k
   ```
   ![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
   - 应在http附加请求消息头（header）字段附加Authorization信息，其值为"Bearer {access_token}"，其中{access_token}为收到的升级通知中的access_token。Bearer和{access_token}之间有一个空格。
   
   
   
   - 如果event_type为firmware_upgrade_v2、software_upgrade_v2，则在请求下载软固件包时不需要携带请求头。请求示例如下： GET https://\*\*\*\*\*\*.obs.cn-north-4.myhuaweicloud.com:443/test.bin?AccessKeyId=DX5G7W\*\*\*\*\*\*\*\*\*
     
    
   
   
6. 设备上报升级状态 
   **Topic**
   上行: $oc/devices/{device_id}/sys/events/up
   **参数说明**
   请参考[设备上报升级状态](https://support.huaweicloud.com/api-iothub/iot_06_v5_3031.html)
   **示例**
   ```
   Topic: $oc/devices/{device_id}/sys/events/up
   数据格式：
     {     "object_device_id": "{object_device_id}",
        "services": [{
            "service_id": "$ota",
            "event_type": "upgrade_progress_report",
            "event_time": "20151212T121212Z",
            "paras": {
                "result_code": 0,
                "progress": 50,
                "version": "V1.0",
                "description": "upgrade processing"
            }
        }] }
   ```
   如下图所示上报升级进度为50%，可以在平台查询到升级进度为50%。
   图14上报升级进度50%
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001993114461.png "点击放大")
   图15任务详情-Test_upgrade_1-升级进度   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001950378380.png "点击放大")
   
   
7. 完成升级 
   上报升级进度为100%，且当前版本为升级的目标版本，可以在平台查询到升级完成。
   图16上报升级进度100%
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001993116565.png "点击放大")
   图17软固件升级-固件升级   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981497825.png "点击放大")
   
   
 
