MQTT协议设备OTA固件升级
场景说明
MQTT(Message Queuing Telemetry Transport)是一个基于客户端-服务器的消息发布/订阅传输协议,主要应用于计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备,适合长连接的场景,如智能路灯等。固件升级功能是网络设备所必须支持的基础服务。在设备固件出现安全漏洞、软件bug维护、自身功能优化、以及设备性能改良等需更新固件时,在线升级功能就尤为重要。本文档通过MQTT.fx模拟固件设备,使用华为云平台对该固件进行设备升级。
软件升级流程和固件升级流程一样,只是在设备上报版本号时对应参数字段不一样。固件升级上报版本号对应参数字段为fw_version,软件升级上报版本号对应参数字段为sw_version,请参考设备上报版本号
整体流程
前提条件
前期准备
- 下载并安装MQTT.fx(应使用1.7.1及以上版本)MQTT.fx安装请参考使用MQTT.fx调测。
- 升级包文件准备。固件升级包及其版本号需向模组厂家获取。本次演示使用临时文件代替。
- 创建产品,创建MQTT协议产品(如果有MQTT协议产品可直接使用)。
- 注册单个设备。
- 设备群组,将注册的设备加入一个设备群组(创建升级任务时会用到)。
上传升级包
- 访问设备接入服务,单击“立即使用”进入设备接入控制台。选择您的实例,单击实例卡片进入。
- 在左侧导航栏选择 。
- 选择"资源包管理"页签,选择"固件列表"。
- 单击“上传固件”,在弹出的页面中有两种上传方式,OBS文件上传和本地文件上传。
图3 上传升级包-OBS文件
图4 上传升级包-本地文件
- 上传升级包后,填写升级包参数信息,单击“确定”完成升级包上传。
图5 上传升级包-OBS文件参数
图6 上传升级包-本地文件参数
- 升级包上传完成后会在"固件列表"中显示出来。
图7 软固件升级-固件列表
- 选择"升级任务",在“固件升级”页签,单击“新建任务”按钮,填写参数信息,选择升级包,选择需要升级的设备,单击"立刻创建任务"。
图8 新建固件升级任务-Test_upgrade_1
创建升级任务时,可以选择多个升级包(最多10个),选择的升级包必须满足支持的源版本没有重复。如果某个升级包没有指定支持源版本,则默认该升级包支持所有源版本设备升级。
- 任务创建成功后可以在任务列表中查询到该任务,单击详情可以查看当前任务详情。在任务详情页面可以批量停止(一次最多100个设备)或单个停止正在执行中的设备升级,也可以批量重试(一次最多100个设备)或单个重试失败的设备升级。单击“全部重试”可以重试该批量升级任务中所有失败的设备升级。
图9 任务详情-Test_upgrade_1
业务实现
- 使用MQTT.fx模拟设备接入平台,详情请参考连接鉴权。
- 用MQTT.fx订阅平台下行信息Topic,MQTT.fx会收到平台服务端下发的查询版本命令。
Topic
下行: $oc/devices/{device_id}/sys/events/down
参数说明
请参考平台下发获取版本信息通知
图10 订阅通知
- 通过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 上报版本号
- 上报完版本号后,模拟器会接收到平台下发的升级通知,通知信息如下:
Topic
上行: $oc/devices/{device_id}/sys/events/down
参数说明
请参考平台下发升级通知
图12 获取升级通知 - 设备收到升级通知后,可通过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*********
- 设备上报升级状态
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-升级进度
- 完成升级
上报升级进度为100%,且当前版本为升级的目标版本,可以在平台查询到升级完成。
图16 上报升级进度100%图17 软固件升级-固件升级