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); }