開發與維運

IoT物聯網設備「固件升級」OTA,「資源包更新」最佳實踐

1.什麼是固件升級

固件升級OTA(Over-the-Air Technology)即空中下載技術,是IoT物聯網平臺必備的一項基礎功能。通過OTA方式,我們可以對分佈在全球各地的IoT設備進行設備固件升級,而不必讓運維人員各地奔波。本文以MQTT協議下的固件升級為例,介紹OTA固件升級流程、數據流轉使用的Topic和數據格式。

2.固件升級OTA流程

MQTT協議下固件升級流程如下圖所示

image

固件升級過程使用的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

image.png

3.6 升級過程

啟動固件升級任務後,我們會看到一個升級批次。點擊進入詳情,可以看到待升級設備列表。

image.png

在升級批次詳情頁面,可以查看所有狀態的設備情況,包括:待推送,已推送,升級中,升級成功,升級失敗,已取消。

image.png

附錄

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


image.png

Leave a Reply

Your email address will not be published. Required fields are marked *