1.什么是固件升级
固件升级OTA(Over-the-Air Technology)即空中下载技术,是IoT物联网平台必备的一项基础功能。通过OTA方式,我们可以对分布在全球各地的IoT设备进行设备固件升级,而不必让运维人员各地奔波。本文以MQTT协议下的固件升级为例,介绍OTA固件升级流程、数据流转使用的Topic和数据格式。
2.固件升级OTA流程
MQTT协议下固件升级流程如下图所示
固件升级过程使用的Topic如下列表
1.设备端通过以下Topic上报固件版本给物联网平台 。
/ota/device/inform/${YourProductKey}/${YourDeviceName}
2.设备端订阅以下Topic接收物联网平台的固件升级通知 。
/ota/device/upgrade/${YourProductKey}/${YourDeviceName}
3.设备端通过以下Topic上报固件升级进度 。
/ota/device/progress/${YourProductKey}/${YourDeviceName}
3.固件升级实战
3.1 设备版本信息
为了实现固件升级功能,首先设备要正确上报当前固件版本,我们在设备详情可以查看到。
3.2 固件版本分布
当每个设备都准确上报固件版本时,我们可以在控制台查看到全量设备的版本发布情况。
3.3 上传新版固件
当我们需要做设备固件升级时,首先要上传新版本固件到IoT物联网平台,标记新版本号。
3.4 验证固件
新固件上传后,我们需要筛选测试设备,来验证固件是否正常,避免新固件导致设备业务异常。
验证通过后,会看到批量升级功能变为可用状态。
3.5 批量升级
点击批量升级菜单,进入升级配置页面。我们可以从多个维度筛选待升级的设备,配置升级策略。
3.6 升级过程
启动固件升级任务后,我们会看到一个升级批次。点击进入详情,可以看到待升级设备列表。
在升级批次详情页面,可以查看所有状态的设备情况,包括:待推送,已推送,升级中,升级成功,升级失败,已取消。
附录
IoT物联网平台推送到设备端的升级消息Payload示例
{ "code":"1000", "data":{ "size":2233916, "extData":{ "info":"双11语料包更新" }, "module":"resource", "sign":"5a1a416f357f17bfa89823d2fd49ef8b", "version":"res-1.2.5", "url":"更新包下载的url地址", "signMethod":"Md5", "md5":"5a1a416f357f17bfa89823d2fd49ef8b" }, "id":1617773607348, "message":"success" }
设备固件升级模拟代码
const fs = require('fs'); const path = require('path'); const mqtt = require('aliyun-iot-mqtt'); //设备身份三元组+区域 const options = { productKey: "替换pk", deviceName: "替换dn", deviceSecret: "替换ds", regionId: "cn-shanghai" } //建立连接 const client = mqtt.getAliyunIotMqttClient(options); //订阅ota消息的Topic const deviceUpgrade = `/ota/device/upgrade/${options.productKey}/${options.deviceName}` client.subscribe(deviceUpgrade) //每次连接后,上报当前固件版本 const deviceInform = `/ota/device/inform/${options.productKey}/${options.deviceName}` client.publish(deviceInform, getFirmwareVersion("1-45-345a")) //OTA过程中,上报进度 const deviceProgress = `/ota/device/progress/${options.productKey}/${options.deviceName}` // 消息处理 client.on('message', function(topic, message) { if (topic == deviceUpgrade) { //收到ota消息,开始升级过程 doUpgrade(message) } }) // 本地更新 function doUpgrade(message) { message = JSON.parse(message) // 1.从url下载固件包,更新下载进度... client.publish(deviceProgress, getOTAUpgradeData(23)) // 2.根据signMethod验证文件签名是否和sign值一致 // verifyFirmware() // 3.重启设备,升级固件 // burn & reboot() } // 更新升级进度 function getOTAUpgradeData(step) { const payloadJson = { "id": 1, "params": { "step": step, "desc": " xxxxxxxx " } } console.log(payloadJson) return JSON.stringify(payloadJson); } // 设备当前固件版本 function getFirmwareVersion(version) { const payloadJson = { "id": 1, "params": { "version": version } } console.log(payloadJson) return JSON.stringify(payloadJson); }