物联网设备 OTA 固件升级实践
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 设备版本信息
为了实现固件升级功能,首先设备要正确上报当前固件版本,我们在设备详情可以查看到。
image.png
3.2 固件版本分布
当每个设备都准确上报固件版本时,我们可以在控制台查看到全量设备的版本发布情况。
image.png
3.3 上传新版固件
当我们需要做设备固件升级时,首先要上传新版本固件到 IoT 物联网平台,标记新版本号。
image.png
3.4 验证固件
新固件上传后,我们需要筛选测试设备,来验证固件是否正常,避免新固件导致设备业务异常。
image.png
验证通过后,会看到批量升级功能变为可用状态。
image.png
3.5 批量升级
点击批量升级菜单,进入升级配置页面。我们可以从多个维度筛选待升级的设备,配置升级策略。
image.png
3.6 升级过程
启动固件升级任务后,我们会看到一个升级批次。点击进入详情,可以看到待升级设备列表。
image.png
正在升级 Tab 会展示升级中的设备列表和升级进度。
image.png
升级成功 Tab 会展示已经完成固件升级的设备列表。包括当前固件版本,更新时间,状态。
image.png
升级失败 Tab 会展示已经升级失败的设备列表。包括当前固件版本,更新时间,失败原因
image.png
附录
IoT 物联网平台推送到设备端的升级消息 Payload 示例
{
"code":"1000",
"data":{
"size":11472299,
"sign":"83254ac96e141affb8aa42cbfec93723",
"version":"2-45-345b",
"url":"https://iotx-ota.oss-cn-shanghai.aliyuncs.com/ota/dbab6f742ae389b40db88fc2500b08d0/ck0q5lyav00003i7hezxe0cbg.zip?Expires=1568951190&OSSAccessKeyId=cS8uRRy54RszYWna&Signature=nk0sogaxtyp7dYvKZnjNQ%2BZ8Q9w%3D",
"signMethod":"Md5",
"md5":"83254ac96e141affb8aa42cbfec93723"
},
"id":1568864790381,
"message":"success"
}
复制代码
设备固件升级模拟代码
/**
* node aliyun-iot-device.js
*/
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);
}
复制代码
物联网平台产品介绍详情:https://www.aliyun.com/product/iot/iot_instc_public_cn
阿里云物联网平台客户交流群
评论