文档首页/ 设备接入 IoTDA/ 最佳实践/ 设备管理/ MQTT协议设备OTA固件升级
更新时间:2024-08-21 GMT+08:00

MQTT协议设备OTA固件升级

场景说明

MQTT(Message Queuing Telemetry Transport)是一个基于客户端-服务器的消息发布/订阅传输协议,主要应用于计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备,适合长连接的场景,如智能路灯等。固件升级功能是网络设备所必须支持的基础服务。在设备固件出现安全漏洞、软件bug维护、自身功能优化、以及设备性能改良等需更新固件时,在线升级功能就尤为重要。本文档通过MQTT.fx模拟固件设备,使用华为云平台对该固件进行设备升级。

软件升级流程和固件升级流程一样,只是在设备上报版本号时对应参数字段不一样。固件升级上报版本号对应参数字段为fw_version,软件升级上报版本号对应参数字段为sw_version,请参考设备上报版本号

整体流程

图1 升级实践流程
图2 MQTT设备升级流程

开发环境

  • 软件:华为云(已开通设备接入服务)、win7及以上版本的64位操作系统(本文以windows 10 64-bit系统调试)、MQTT.fx模拟器。

前提条件

  • 已注册华为云官方账号。未注册可单击注册页面完成注册。
  • 已完成实名制认证。未完成可在华为云上单击完成认证,否则无法使用设备接入功能。
  • 已开通设备接入服务。未开通则访问设备接入服务,单击“立即使用”后开通该服务。

前期准备

  • 下载并安装MQTT.fx(应使用1.7.1及以上版本)。
  • 升级包文件准备。固件升级包及其版本号需向模组厂家获取。本次演示使用临时文件代替。
  • 创建产品,创建MQTT协议产品(如果有MQTT协议产品可直接使用)。
  • 注册单个设备
  • 设备群组,将注册的设备加入一个设备群组(创建升级任务时会用到)。

上传升级包

  1. 访问设备接入服务,单击“立即使用”进入设备接入控制台。选择您的实例,单击实例卡片进入。
  2. 在左侧导航栏选择设备 > 软固件升级
  3. 选择"资源包管理"页签,选择"固件列表"。
  4. 单击“上传固件”,在弹出的页面中有两种上传方式,OBS文件上传和本地文件上传。

    图3 上传升级包-OBS文件
    图4 上传升级包-本地文件

  5. 上传升级包后,填写升级包参数信息,单击“确定”完成升级包上传。

    图5 上传升级包-OBS文件参数
    图6 上传升级包-本地文件参数

  6. 升级包上传完成后会在"固件列表"中显示出来。

    图7 软固件升级-固件列表

  7. 选择"升级任务",在“固件升级”页签,单击“新建任务”按钮,填写参数信息,选择升级包,选择需要升级的设备,单击"立刻创建任务"。

    图8 新建固件升级任务-Test_upgrade_1

    创建升级任务时,可以选择多个升级包(最多10个),选择的升级包必须满足支持的源版本没有重复。如果某个升级包没有指定支持源版本,则默认该升级包支持所有源版本设备升级。

  8. 任务创建成功后可以在任务列表中查询到该任务,单击详情可以查看当前任务详情。在任务详情页面可以批量停止(一次最多100个设备)或单个停止正在执行中的设备升级,也可以批量重试(一次最多100个设备)或单个重试失败的设备升级。单击“全部重试”可以重试该批量升级任务中所有失败的设备升级。

    图9 任务详情-Test_upgrade_1

业务实现

  1. 使用MQTT.fx模拟设备接入平台,详情请参考连接鉴权。
  2. 用MQTT.fx订阅平台下行信息Topic,MQTT.fx会收到平台服务端下发的查询版本命令。

    Topic

    下行: $oc/devices/{device_id}/sys/events/down

    参数说明

    请参考平台下发获取版本信息通知

    图10 订阅通知

  3. 通过MQTT.fx上报软固件版本信息。

    Topic

    上行: $oc/devices/{device_id}/sys/events/up

    参数说明

    请参考设备上报软固件版本

    示例

    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 上报版本号

  4. 上报完版本号后,模拟器会接收到平台下发的升级通知,通知信息如下:

    Topic

    上行: $oc/devices/{device_id}/sys/events/down

    参数说明

    请参考平台下发升级通知

    图12 获取升级通知

  5. 设备收到升级通知后,可通过Http请求下载升级包。

    本次演示使用Curl命令代替。

    图13 下载升级包

    示例

    curl -X GET -H "Authorization:Bearer ****************************" "https://**.**.**.**:8943/iodm/dev/v2.0/upgradefile/applications/********/devices/********/packages/********" -v -k
    • 应在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

    参数说明

    请参考设备上报升级状态

    示例

    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%

    图15 任务详情-Test_upgrade_1-升级进度

  7. 完成升级

    上报升级进度为100%,且当前版本为升级的目标版本,可以在平台查询到升级完成。

    图16 上报升级进度100%

    图17 软固件升级-固件升级