写点什么

IoT 物联网设备 OTA 固件升级开发实践——实践类

作者:阿里云AIoT
  • 2023-03-08
    浙江
  • 本文字数:1970 字

    阅读完需:约 6 分钟

物联网设备 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消息的Topicconst 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


阿里云物联网平台客户交流群

用户头像

阿里云AIoT

关注

物联网内容搬运者 2022-04-22 加入

还未添加个人简介

评论

发布
暂无评论
IoT物联网设备OTA固件升级开发实践——实践类_物联网_阿里云AIoT_InfoQ写作社区