设备接入 IoTDA设备接入 IoTDA

文档首页> 设备接入 IoTDA> 最佳实践> 设备接入> MQTT协议设备固件升级实践
更新时间:2021/07/08 GMT+08:00
分享

MQTT协议设备固件升级实践

场景说明

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

整体流程

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

开发环境

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

前提条件

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

前期准备

1、下载并安装MQTT.fx(应使用1.7.1及以上版本)MQTT.fx安装请参考使用MQTT.fx调测

2、升级包文件准备。固件升级包及其版本号需向模组厂家获取。本次演示使用临时文件代替。

业务流程

  1. 创建产品,创建MQTT协议产品(如果有MQTT协议产品可直接使用)。
  2. 注册单个设备
  3. 设备群组,将注册的设备加入一个设备群组(创建升级任务时会用到)。

上传升级包

  1. 访问设备接入服务,单击“立即使用”进入设备接入控制台。
  2. 在左侧导航栏选择设备 > 软固件升级
  3. 选择"资源包管理"页签,选择"固件列表"。
  4. 单击“上传固件”,在弹出的页面中填写参数后,单击““确认””,完成升级包的上传。

    图3 上传固件

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

    图4 固件列表

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

    图5 新建固件升级任务

  7. 任务创建成功后可以在任务列表中查询到该任务。

    图6 查看升级任务

业务实现

1、使用MQTT.fx模拟设备接入平台,详情请参考连接鉴权

2、用MQTT.fx订阅平台下行信息Topic,MQTT.fx会收到平台服务端下发的查询版本命令。

Topic

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

图7 订阅通知

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

Topic

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

参数说明

字段名

必选/可选

类型

参数描述

object_device_id

可选

String

事件对应的最终目标设备,没有携带则表示目标设备即topic中指定的设备

services

可选

List<ServiceEvent>

事件服务列表。

ServiceEvent定义表

字段名

必选/可选

类型

参数描述

service_id

必选

String

$ota。

event_type

必选

String

version_report。

event_time

可选

String

事件时间。

paras

必选

Object

事件参数JSON对象。

paras参数列表

字段名

必选/可选

类型

参数描述

sw_version

可选

String

软件版本。

fw_version

可选

String

固件版本。

示例

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"
          }
      }]
  } 
图8 上报版本号

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

参数说明

字段名

必选/可选

类型

参数描述

object_device_id

可选

String

事件对应的最终目标设备,没有携带则表示目标设备即topic中指定的设备。

services

可选

List<ServiceEvent>

事件服务列表。

ServiceEvent定义表

字段名

必选/可选

类型

参数描述

service_id

必选

String

$ota。

event_type

必选

String

固件升级:firmware_upgrade。

软件升级:software_upgrade。

event_time

可选

String

事件时间。

paras

必选

Object

事件参数JSON对象。

paras参数列表

字段名

必选/可选

类型

参数描述

version

必选

String

软固件包版本号。

url

必选

String

软固件包下载地址。

file_size

必选

Integer

软固件包文件大小。

access_token

可选

String

软固件包url下载地址的临时token。

expires

可选

Integer

access_token的超期时间。

sign

必选

String

软固件包MD5值。

图9 获取升级通知

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

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

图10 下载升级包

示例

curl -X GET -H "Authorization:Bearer ****************************" "https://100.93.28.202:8943/iodm/dev/v2.0/upgradefile/applications/ddecccc223574aee9466fe8f7e16a205/devices/6079042873515a02c16ffd82_123456789/packages/4f201f38c281ca5d40794a3f" -v -k

应在http附加请求消息头(header)字段附加Authorization信息,其值为“Bearer {access_token}”,其中{access_token}为收到的升级通知中的access_token。Bearer和{access_token}之间有一个空格。

6、设备上报升级状态

Topic

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

参数说明

字段名

必选/可选

类型

参数描述

object_device_id

可选

String

事件对应的最终目标设备,没有携带则表示目标设备即topic中指定的设备。

services

可选

List<ServiceEvent>

事件服务列表。

ServiceEvent定义表

字段名

必选/可选

类型

参数描述

service_id

必选

String

$ota。

event_type

必选

String

upgrade_progress_report。

event_time

可选

String

事件时间。

paras

必选

Object

事件参数JSON对象。

paras参数列表

字段名

必选/可选

类型

参数描述

result_code

必选

Integer

设备的升级状态,结果码定义如下:

  • 0:处理成功
  • 1:设备使用中
  • 2:信号质量差
  • 3:已经是最新版本
  • 4:电量不足
  • 5:剩余空间不足
  • 6:下载超时
  • 7:升级包校验失败
  • 8:升级包类型不支持
  • 9:内存不足
  • 10:安装升级包失败
  • 255: 内部异常

progress

可选

Integer

设备的升级进度,范围:0到100。

version

必选

String

设备当前版本号。

description

可选

String

升级状态描述信息,可以返回具体升级失败原因。

示例

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%。

图11 上报升级进度50%
图12 查询升级进度

7、完成升级

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

图13 上报升级进度100%
图14 查询升级状态

----结束

分享:

    相关文档

    相关产品