OTA升級(jí)概述
OTA(Over-the-Air Technology)即空中下載技術(shù),基于無(wú)線(xiàn)網(wǎng)絡(luò)對(duì)設(shè)備固件、軟件或驅(qū)動(dòng)進(jìn)行更新。通過(guò)OTA升級(jí),可以對(duì)物聯(lián)網(wǎng)設(shè)備更新功能、修復(fù)漏洞、優(yōu)化性能。本文介紹如何為接入物聯(lián)網(wǎng)平臺(tái)的設(shè)備進(jìn)行OTA升級(jí)。
使用限制
使用OTA功能的設(shè)備必須使用MQTT協(xié)議接入物聯(lián)網(wǎng)平臺(tái),設(shè)備可以選擇MQTT協(xié)議或HTTPS協(xié)議下載升級(jí)包。
單個(gè)阿里云賬號(hào)最多有500個(gè)升級(jí)包,賬號(hào)下所有RAM用戶(hù)共享配額。
升級(jí)包的數(shù)量、大小、格式和地域限制。
HTTPS協(xié)議下載:可以包括一個(gè)或多個(gè)文件,單個(gè)文件最大為1,000 MB。僅支持
.bin
、.dav
、.tar
、.gz
、.zip
、.gzip
、.apk
、.tar.gz
、.tar.xz
、.pack
格式的文件。MQTT協(xié)議下載:僅包含一個(gè)文件,且文件大小不超過(guò)16 MB。目前僅支持中國(guó)華東2(上海)、華北2(北京)和華南1(深圳)地域。推薦使用物聯(lián)網(wǎng)平臺(tái)提供的C語(yǔ)言L(fǎng)ink SDK,開(kāi)發(fā)MQTT下載文件的能力。詳細(xì)內(nèi)容,請(qǐng)參見(jiàn)示例代碼說(shuō)明。
工作原理
公共實(shí)例的轉(zhuǎn)移設(shè)備僅支持發(fā)起升級(jí)方式為靜態(tài)升級(jí)的批量升級(jí)任務(wù)。
轉(zhuǎn)移設(shè)備的發(fā)起方:添加升級(jí)包、驗(yàn)證升級(jí)包。
轉(zhuǎn)移設(shè)備的接收方:查看升級(jí)包、發(fā)起升級(jí)批次。
分發(fā)的設(shè)備在被分發(fā)到目標(biāo)實(shí)例后可正常進(jìn)行OTA升級(jí)。
前提條件
使用物聯(lián)網(wǎng)卡的設(shè)備、使用C LinkSDK 2.x版本及以下的設(shè)備,需要獲取OTA升級(jí)的域名。
OTA升級(jí)服務(wù)于2023年09月01日00:00起,變更下載升級(jí)包的域名。如果您的設(shè)備(例如,使用蜂窩網(wǎng)絡(luò)的物聯(lián)網(wǎng)設(shè)備)需要針對(duì)訪(fǎng)問(wèn)域名設(shè)置白名單,本次變更有可能會(huì)造成您的設(shè)備無(wú)法正常下載新的升級(jí)包。您可以提交工單獲取OTA升級(jí)服務(wù)的最新域名列表。具體內(nèi)容,請(qǐng)參見(jiàn)【升級(jí)】【阿里云】【物聯(lián)網(wǎng)平臺(tái)】OTA升級(jí)功能服務(wù)域名調(diào)整通知。
將設(shè)備接入物聯(lián)網(wǎng)平臺(tái)。使用Link SDK的設(shè)備,請(qǐng)參見(jiàn)獲取C Link SDK、設(shè)備接入引導(dǎo)。搭載AliOS Things芯片的設(shè)備,請(qǐng)參見(jiàn)AliOS Things文檔。
OTA升級(jí)步驟
本文示例使用C語(yǔ)言L(fǎng)ink SDK,其他語(yǔ)言SDK示例請(qǐng)參見(jiàn)設(shè)備接入概述。
步驟一:設(shè)備上報(bào)版本號(hào)
配置OTA。
設(shè)備接入物聯(lián)網(wǎng)平臺(tái)。登錄物聯(lián)網(wǎng)平臺(tái)控制臺(tái),單擊對(duì)應(yīng)實(shí)例,在左側(cè)導(dǎo)航欄選擇 ,找到目標(biāo)設(shè)備,查看設(shè)備狀態(tài)。設(shè)備狀態(tài)顯示為在線(xiàn),則表示設(shè)備與物聯(lián)網(wǎng)平臺(tái)成功連接。
設(shè)備上報(bào)當(dāng)前版本號(hào)。設(shè)備需要在首次升級(jí)前上報(bào)版本號(hào),建議只在系統(tǒng)啟動(dòng)過(guò)程中上報(bào)一次,不需要周期循環(huán)上報(bào)。僅支持每次上報(bào)一個(gè)模塊及對(duì)應(yīng)的模塊版本,如果需要上報(bào)多個(gè)模塊的版本,請(qǐng)分次上報(bào)。上報(bào)的Topic和消息格式參見(jiàn)文末的消息格式。
步驟二:推送升級(jí)包信息
購(gòu)買(mǎi)和查看OTA升級(jí)次數(shù):查看當(dāng)前實(shí)例下可用的OTA升級(jí)次數(shù),如果可用OTA升級(jí)次數(shù)不足,請(qǐng)先購(gòu)買(mǎi)套餐包。
對(duì)于新版公共實(shí)例,提供免費(fèi)額度10次/自然月。
對(duì)于企業(yè)版實(shí)例,提供免費(fèi)額度1000次/自然月。
添加升級(jí)包:為產(chǎn)品添加OTA模塊和升級(jí)包。
模塊:由用戶(hù)自定義,是同產(chǎn)品下設(shè)備的不同可升級(jí)模塊,例如固件、軟件、驅(qū)動(dòng)等。默認(rèn)(default)模塊表示整個(gè)設(shè)備的固件。
整包:完整的升級(jí)文件,可以添加單個(gè)或多個(gè)升級(jí)包,如果添加多個(gè)示例包必須使用C語(yǔ)言的Link SDK。整包升級(jí)前,設(shè)備可不上報(bào)OTA模塊版本。如不上報(bào),配置批量升級(jí)時(shí)不能針對(duì)指定版本進(jìn)行升級(jí),具體說(shuō)明,請(qǐng)參見(jiàn)發(fā)起升級(jí)批次任務(wù)。
差分:僅包含新版本升級(jí)包與之前版本的差異部分,設(shè)備需要本地進(jìn)行差分還原,并還原為完整升級(jí)包進(jìn)行升級(jí),差分升級(jí)可有效降低OTA升級(jí)次數(shù)消耗和設(shè)備下載差分包的流量消耗。差分升級(jí)前,設(shè)備必須上報(bào)OTA模塊版本。
使用AliOS Things芯片的設(shè)備,阿里云提供差分包生成方法和差分還原算法,請(qǐng)參見(jiàn)OTA差分工具使用指南。
其他設(shè)備,需要您自行生成差分包并完成差分還原算法開(kāi)發(fā)。
(可選)驗(yàn)證升級(jí)包:添加升級(jí)包時(shí)選擇升級(jí)包是否需要平臺(tái)驗(yàn)證為是,則在批量升級(jí)前,需選擇部分設(shè)備用于測(cè)試。測(cè)試設(shè)備升級(jí)成功后,才能使用升級(jí)包。
可以選擇是否由App確認(rèn)升級(jí)后才能進(jìn)行OTA升級(jí),App確認(rèn)升級(jí)的流程如下:
用戶(hù)自行開(kāi)發(fā)App,平臺(tái)不會(huì)主動(dòng)推送升級(jí)消息給設(shè)備,需要App主動(dòng)查詢(xún)。
App側(cè)調(diào)用ListOTAUnfinishedTaskByDevice,查詢(xún)未完成狀態(tài)的設(shè)備升級(jí)作業(yè)。
App側(cè)調(diào)用ConfirmOTATask,確認(rèn)升級(jí)任務(wù)后,平臺(tái)才會(huì)主動(dòng)推送升級(jí)消息給設(shè)備。
發(fā)起升級(jí)批次任務(wù):物聯(lián)網(wǎng)平臺(tái)向設(shè)備批量下發(fā)升級(jí)相關(guān)信息(升級(jí)包URL、版本、大小等)。發(fā)起批量升級(jí)后,在控制臺(tái)顯示的設(shè)備狀態(tài)是待升級(jí)或待確認(rèn)。當(dāng)物聯(lián)網(wǎng)平臺(tái)接收到設(shè)備上報(bào)的升級(jí)進(jìn)度時(shí),設(shè)備升級(jí)正式開(kāi)始,在控制臺(tái)顯示的設(shè)備狀態(tài)是升級(jí)中。
步驟三:設(shè)備下載升級(jí)包
設(shè)備獲取升級(jí)包信息。設(shè)備離線(xiàn)時(shí)不能接收OTA服務(wù)端推送的升級(jí)消息,設(shè)備再次上線(xiàn)后,OTA服務(wù)端驗(yàn)證該設(shè)備是否需要升級(jí)。如果需要升級(jí),物聯(lián)網(wǎng)平臺(tái)再次推送升級(jí)消息給設(shè)備,否則不推送消息。
物聯(lián)網(wǎng)平臺(tái)推送升級(jí)包信息。設(shè)備訂閱Topic:
/ota/device/upgrade/${YourProductKey}/${YourDeviceName}
,物聯(lián)網(wǎng)平臺(tái)對(duì)設(shè)備發(fā)起OTA升級(jí)請(qǐng)求后,設(shè)備通過(guò)該Topic收到升級(jí)信息。具體有以下兩種情況:發(fā)起升級(jí)任務(wù)時(shí)設(shè)備在線(xiàn),物聯(lián)網(wǎng)平臺(tái)會(huì)直接推送升級(jí)相關(guān)信息。
發(fā)起升級(jí)任務(wù)時(shí)設(shè)備離線(xiàn),之后設(shè)備上線(xiàn),物聯(lián)網(wǎng)平臺(tái)會(huì)推送一次升級(jí)相關(guān)信息。
設(shè)備主動(dòng)拉取升級(jí)包信息。設(shè)備向Topic發(fā)布消息,物聯(lián)網(wǎng)平臺(tái)收到消息并通過(guò)另一Topic返回升級(jí)包信息。拉取升級(jí)包的Topic和消息格式參見(jiàn)文末的消息格式。
物聯(lián)網(wǎng)平臺(tái)發(fā)給設(shè)備的HTTPS協(xié)議、MQTT協(xié)議的下載消息格式參見(jiàn)文末的消息格式。
設(shè)備使用HTTPS協(xié)議或MQTT協(xié)議下載升級(jí)包。
設(shè)備上報(bào)升級(jí)進(jìn)度。上報(bào)進(jìn)度的Topic和消息格式參見(jiàn)文末的消息格式。
重要如果設(shè)備上報(bào)進(jìn)度的間隔低于3秒,在物聯(lián)網(wǎng)平臺(tái)控制臺(tái)的OTA升級(jí)包詳情的批次詳情中,可能無(wú)法查看到上報(bào)的全部進(jìn)度。
設(shè)備上報(bào)最新版本號(hào)。設(shè)備升級(jí)完成后,建議立即重啟設(shè)備,設(shè)備上線(xiàn)后,立即上報(bào)新的版本號(hào)。設(shè)備上線(xiàn)請(qǐng)求和上報(bào)版本請(qǐng)求間隔不能超過(guò)2秒。
重要如果設(shè)備上報(bào)的版本與OTA服務(wù)要求的版本一致就認(rèn)為升級(jí)成功,反之認(rèn)為失敗,這是物聯(lián)網(wǎng)平臺(tái)判斷設(shè)備升級(jí)成功的唯一條件。即使升級(jí)進(jìn)度上報(bào)為100%,如果不上報(bào)新的版本號(hào),可能因?yàn)槌^(guò)設(shè)備升級(jí)超時(shí)時(shí)間導(dǎo)致升級(jí)失敗。
Topic:
/ota/device/inform/${YourProductKey}/${YourDeviceName}
消息格式
{ "id": 1, "params": { "version": "2.0.0" } }
步驟四:查看升級(jí)結(jié)果
查看升級(jí)情況:查看目標(biāo)設(shè)備升級(jí)狀態(tài)、升級(jí)包信息等。
查看升級(jí)包版本和成功率:查看升級(jí)后的版本分布和成功率分布統(tǒng)計(jì),分析OTA升級(jí)失敗原因,進(jìn)而提升設(shè)備升級(jí)成功率。
相關(guān)文檔
設(shè)備OTA升級(jí)失敗的常見(jiàn)問(wèn)題和解決方法,請(qǐng)參見(jiàn)如何解決設(shè)備OTA升級(jí)失敗問(wèn)題。
可以在物聯(lián)網(wǎng)平臺(tái)控制臺(tái),查詢(xún)云端運(yùn)行日志。該日志包含了物聯(lián)網(wǎng)平臺(tái)、設(shè)備、您的應(yīng)用程序三者之間的交互通信記錄。
物聯(lián)網(wǎng)平臺(tái)可能返回給設(shè)備端的錯(cuò)誤碼及說(shuō)明,請(qǐng)參見(jiàn)設(shè)備端接收的錯(cuò)誤碼。
如果需要將設(shè)備上報(bào)的升級(jí)信息,通過(guò)AMQP通道推送至您的服務(wù)器,請(qǐng)參見(jiàn)配置AMQP服務(wù)端訂閱。OTA升級(jí)相關(guān)Topic數(shù)據(jù),經(jīng)過(guò)消息轉(zhuǎn)發(fā)后的數(shù)據(jù)格式,請(qǐng)參見(jiàn)數(shù)據(jù)格式。
消息格式
上報(bào)版本號(hào)
Topic:
/ota/device/inform/${YourProductKey}/${YourDeviceName}
消息格式
{ "id": 1, "params": { "version": "1.0.0", "module":"mcu" //該參數(shù)如果不填,表示默認(rèn)版本號(hào)default } }
參數(shù)
類(lèi)型
說(shuō)明
id
String
消息ID號(hào)。數(shù)字可為String或Long類(lèi)型,以設(shè)備端上報(bào)的數(shù)據(jù)類(lèi)型為準(zhǔn)。取值范圍為0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
version
String
OTA模塊版本。
module
String
OTA模塊名。上報(bào)默認(rèn)(default)模塊的版本號(hào)時(shí),可以不上報(bào)module參數(shù)。默認(rèn)(default)模塊代表整個(gè)設(shè)備的固件版本號(hào)。
主動(dòng)拉取升級(jí)包
設(shè)備發(fā)布消息到Topic:
/sys/{productKey}/{deviceName}/thing/ota/firmware/get
。消息格式
{ "id": "123", "version": "1.0", "params": { "module": "MCU" }, "method": "thing.ota.firmware.get" }
參數(shù)說(shuō)明
參數(shù)
類(lèi)型
說(shuō)明
id
String
消息ID號(hào)。String類(lèi)型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
version
String
協(xié)議版本,固定為1.0。
params
Object
請(qǐng)求參數(shù)。
module
String
升級(jí)包所屬的模塊名。不指定則表示請(qǐng)求默認(rèn)(default)模塊的升級(jí)包信息。
method
String
請(qǐng)求方法,取值thing.ota.firmware.get。
物聯(lián)網(wǎng)平臺(tái)收到請(qǐng)求后,通過(guò)響應(yīng)Topic:
/sys/{productKey}/{deviceName}/thing/ota/firmware/get_reply
,向設(shè)備端返回升級(jí)包信息。
HTTPS協(xié)議下載
單文件包下載
{
"id": "123",
"code": 200,
"data": {
"size": 93796291,
"sign": "f8d85b250d4d787a9f483d89a974***",
"version": "10.0.1.9.20171112.1432",
"isDiff": 1,
"url": "https://the_firmware_url",
"signMethod": "MD5",
"md5": "f8d85b250d4d787a9f48***",
"module": "MCU",
"extData":{
"key1":"value1",
"key2":"value2",
"_package_udi":"{\"ota_notice\":\"升級(jí)底層攝像頭驅(qū)動(dòng),解決視頻圖像模糊的問(wèn)題。\"}"
}
}
}
多文件包下載
{
"code": "1000",
"data": {
"version": "2.0.0",
"isDiff": 1,
"signMethod": "MD5",
"files":[
{
"fileSize":432944,
"fileName":"file1-name",
"fileUrl":"https://***/nop***.tar.gz?Expires=1502955804&OSSAccessKeyId=***&Signature=***XJEH0qAKU%3D&security-token=CAISuQJ***",
"fileMd5":"93230c3bde425a9d***",
"fileSign":"93230c3bde425a9d****"
},
{
"fileSize":432945,
"fileName":"file2-name",
"fileUrl":"https://***/no***.tar.gz?Expires=1502955804&OSSAccessKeyId=***&Signature=***qAKU%3D&security-token=***q6Ft5B2y***",
"fileMd5":"93230c3bde425a92***",
"fileSign":"93230c3bde425a92****"
}
],
"module": "MCU",
"extData":{
"key1":"value1",
"key2":"value2",
"_package_udi":"{\"ota_notice\":\"升級(jí)底層攝像頭驅(qū)動(dòng),解決視頻圖像模糊的問(wèn)題。\"}"
}
},
"id": 1626969597470,
"message": "success"
}
參數(shù) | 類(lèi)型 | 說(shuō)明 |
id | Long | 消息ID號(hào)。每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。 |
message | String | 結(jié)果信息。 |
code | String | 狀態(tài)碼。 |
version | String | 設(shè)備升級(jí)包的版本信息。 |
size | Long | 升級(jí)包文件大小,單位:字節(jié)。 OTA升級(jí)包中僅有一個(gè)升級(jí)包文件時(shí),包含該參數(shù)。 |
url | String | 升級(jí)包在對(duì)象存儲(chǔ)(OSS)上的存儲(chǔ)地址。 OTA升級(jí)包中僅有一個(gè)升級(jí)包文件,且下載協(xié)議為HTTPS時(shí),包含該參數(shù)。 |
dProtocol | String | 升級(jí)包下載協(xié)議。 僅升級(jí)包下載協(xié)議為MQTT時(shí),包含該參數(shù)。 |
streamId | Long | 通過(guò)MQTT協(xié)議下載OTA升級(jí)包時(shí)的唯一標(biāo)識(shí)。 僅升級(jí)包下載協(xié)議為MQTT時(shí),包含該參數(shù)。 |
streamFileId | Integer | 單個(gè)升級(jí)包文件的唯一標(biāo)識(shí)。 僅升級(jí)包下載協(xié)議為MQTT時(shí),包含該參數(shù)。 |
isDiff | Long | 僅當(dāng)升級(jí)包類(lèi)型為差分時(shí),消息包含此參數(shù)。 取值為1,表示僅包含新版本升級(jí)包與之前版本的差異部分,需要設(shè)備進(jìn)行差分還原。 |
digestsign | String | OTA升級(jí)包文件安全升級(jí)后的簽名。僅當(dāng)OTA升級(jí)包開(kāi)啟安全升級(jí)功能,才有此參數(shù)。開(kāi)啟OTA升級(jí)包安全升級(jí)功能的方法,請(qǐng)參見(jiàn)添加升級(jí)包。 |
sign | String | OTA升級(jí)包文件的簽名。 OTA升級(jí)包中僅有一個(gè)升級(jí)包文件時(shí),包含該參數(shù)。 |
signMethod | String | 簽名方法。取值:
對(duì)于Android差分升級(jí)包類(lèi)型,僅支持MD5簽名方法。 |
md5 | String | 當(dāng)簽名方法為MD5時(shí),除了會(huì)給sign賦值外還會(huì)給md5賦值。 OTA升級(jí)包中僅有一個(gè)升級(jí)包文件時(shí),包含該參數(shù)。 |
module | String | 升級(jí)包所屬的模塊名。模塊名為default時(shí),物聯(lián)網(wǎng)平臺(tái)不下發(fā)module參數(shù)。 |
extData | Object | 升級(jí)批次標(biāo)簽列表和推送給設(shè)備的自定義信息。 _package_udi表示自定義信息的字段。 單個(gè)標(biāo)簽格式: |
files | Array | 多個(gè)升級(jí)包文件的信息列表。 OTA升級(jí)包中有多個(gè)文件時(shí),包含該參數(shù)。每個(gè)升級(jí)包文件信息如下:
|
MQTT協(xié)議下載
升級(jí)包下載協(xié)議為MQTT時(shí),只支持單文件包下載。設(shè)備端獲取OTA升級(jí)包信息后,可以選擇整包下載或分片下載。
整包下載
消息格式
{ "id": "123", "code": 200, "data":{ "size":432945, "digestsign":"A4WOP***SYHJ6DDDJD9***", "version":"2.0.0", "isDiff":1, "signMethod":"MD5", "dProtocol":"mqtt", "streamId":1397345, "streamFileId":1, "md5":"93230c3bde***", "sign":"93230c3bde42***", "module":"MCU", "extData":{ "key1":"value1", "key2":"value2" } } }
參數(shù)說(shuō)明
參數(shù)
類(lèi)型
說(shuō)明
id
Long
消息ID號(hào)。每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
message
String
結(jié)果信息。
code
String
狀態(tài)碼。
version
String
設(shè)備升級(jí)包的版本信息。
size
Long
升級(jí)包文件大小,單位:字節(jié)。
OTA升級(jí)包中僅有一個(gè)升級(jí)包文件時(shí),包含該參數(shù)。
url
String
升級(jí)包在對(duì)象存儲(chǔ)(OSS)上的存儲(chǔ)地址。
OTA升級(jí)包中僅有一個(gè)升級(jí)包文件,且下載協(xié)議為HTTPS時(shí),包含該參數(shù)。
dProtocol
String
升級(jí)包下載協(xié)議。
僅升級(jí)包下載協(xié)議為MQTT時(shí),包含該參數(shù)。
streamId
Long
通過(guò)MQTT協(xié)議下載OTA升級(jí)包時(shí)的唯一標(biāo)識(shí)。
僅升級(jí)包下載協(xié)議為MQTT時(shí),包含該參數(shù)。
streamFileId
Integer
單個(gè)升級(jí)包文件的唯一標(biāo)識(shí)。
僅升級(jí)包下載協(xié)議為MQTT時(shí),包含該參數(shù)。
isDiff
Long
僅當(dāng)升級(jí)包類(lèi)型為差分時(shí),消息包含此參數(shù)。
取值為1,表示僅包含新版本升級(jí)包與之前版本的差異部分,需要設(shè)備進(jìn)行差分還原。
digestsign
String
OTA升級(jí)包文件安全升級(jí)后的簽名。僅當(dāng)OTA升級(jí)包開(kāi)啟安全升級(jí)功能,才有此參數(shù)。開(kāi)啟OTA升級(jí)包安全升級(jí)功能的方法,請(qǐng)參見(jiàn)添加升級(jí)包。
sign
String
OTA升級(jí)包文件的簽名。
OTA升級(jí)包中僅有一個(gè)升級(jí)包文件時(shí),包含該參數(shù)。
signMethod
String
簽名方法。取值:
SHA256
MD5
對(duì)于Android差分升級(jí)包類(lèi)型,僅支持MD5簽名方法。
md5
String
當(dāng)簽名方法為MD5時(shí),除了會(huì)給sign賦值外還會(huì)給md5賦值。
OTA升級(jí)包中僅有一個(gè)升級(jí)包文件時(shí),包含該參數(shù)。
module
String
升級(jí)包所屬的模塊名。模塊名為default時(shí),物聯(lián)網(wǎng)平臺(tái)不下發(fā)module參數(shù)。
extData
Object
升級(jí)批次標(biāo)簽列表和推送給設(shè)備的自定義信息。
_package_udi表示自定義信息的字段。
單個(gè)標(biāo)簽格式:
"key":"value"
。files
Array
多個(gè)升級(jí)包文件的信息列表。
OTA升級(jí)包中有多個(gè)文件時(shí),包含該參數(shù)。每個(gè)升級(jí)包文件信息如下:
fileSize:升級(jí)包文件大小。
fileName:升級(jí)包文件的名稱(chēng)。
fileUrl、fileMd5、fileSign:含義與url、md5、sign相同。
可選:分片下載。獲取上面的升級(jí)包信息后,設(shè)備通過(guò)以下Topic分片下載OTA升級(jí)包文件。
請(qǐng)求Topic:
/sys/${productKey}/${deviceName}/thing/file/download
響應(yīng)Topic:
/sys/${productKey}/${deviceName}/thing/file/download_reply
請(qǐng)求消息格式
{ "id": "123456", "version": "1.0", "params": { "fileToken":"1bb8***", "fileInfo":{ "streamId":1234565, "fileId":1 }, "fileBlock":{ "size":256, "offset":2 } } }
請(qǐng)求消息的參數(shù)說(shuō)明
參數(shù)
類(lèi)型
說(shuō)明
id
String
消息ID號(hào)。String類(lèi)型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
version
String
協(xié)議版本,固定為1.0。
params
Object
請(qǐng)求參數(shù)。
fileToken
String
文件的唯一標(biāo)識(shí)Token,非必填參數(shù)。支持?jǐn)?shù)字、英文字母、下劃線(xiàn)(_)和英文句號(hào)(.),不超過(guò)16個(gè)字符。
使用說(shuō)明:
若傳入該參數(shù),物聯(lián)網(wǎng)平臺(tái)響應(yīng)設(shè)備請(qǐng)求時(shí),會(huì)返回該參數(shù),便于您在設(shè)備端多文件下載場(chǎng)景下,從響應(yīng)消息中確認(rèn)下載的對(duì)應(yīng)文件。
若確認(rèn)設(shè)備端在下載文件的請(qǐng)求和響應(yīng)周期內(nèi),不需要對(duì)其他文件發(fā)起下載請(qǐng)求,可不設(shè)置該參數(shù)。
fileInfo
Object
OTA升級(jí)包文件信息。
streamId
Long
通過(guò)MQTT協(xié)議下載OTA升級(jí)包時(shí)的唯一標(biāo)識(shí)。
fileId
Integer
單個(gè)升級(jí)包文件的唯一標(biāo)識(shí)。
fileBlock
Object
文件分片信息。
size
Integer
請(qǐng)求下載的文件分片大小,單位字節(jié),取值范圍為256~131072。若為最后一個(gè)文件分片,取值范圍為1~131072。
offset
Integer
文件分片對(duì)應(yīng)字節(jié)的起始地址。取值范圍為0~16777216。
響應(yīng)消息的結(jié)構(gòu)
結(jié)構(gòu)項(xiàng)
說(shuō)明
JSON Bytes Length
表示響應(yīng)數(shù)據(jù)中JSON字符串對(duì)應(yīng)的字節(jié)數(shù)組長(zhǎng)度,必須占位2個(gè)字節(jié),高位字節(jié)在前,低位字節(jié)在后。
例如,響應(yīng)的JSON字符串使用UTF-8編碼轉(zhuǎn)碼成字節(jié)數(shù)組的長(zhǎng)度為十進(jìn)制的87,對(duì)應(yīng)十六進(jìn)制57,則高位字節(jié)為0x00,低位字節(jié)為0x57。
JSON String Bytes
表示響應(yīng)數(shù)據(jù)中JSON字符串對(duì)應(yīng)的字節(jié)數(shù)組,編碼格式為UTF-8。具體內(nèi)容,請(qǐng)參見(jiàn)下文的“響應(yīng)的JSON數(shù)據(jù)格式”。
File Block Bytes
表示當(dāng)前文件分片的字節(jié)數(shù)組,字節(jié)順序按照相對(duì)于文件頭的偏移量從小至大排列。
CRC16/IBM
表示文件分片的校驗(yàn)值,僅支持CRC16/IBM,占位2個(gè)字節(jié),低位字節(jié)在前,高位字節(jié)在后。
例如,文件分片的校驗(yàn)值為0x0809,則低位字節(jié)為0x09,高位字節(jié)為0x08。
響應(yīng)消息格式
{ "id": "123456", "code":200, "msg":"file size has exceeded the limit 16 MB", "data": { "fileToken":"1bb8***", "fileLength":1238848, "bSize":1491, "bOffset":2 } }
響應(yīng)消息的參數(shù)說(shuō)明
參數(shù)
類(lèi)型
說(shuō)明
id
String
消息ID號(hào)。String類(lèi)型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
此處消息ID返回的是設(shè)備請(qǐng)求中的消息ID,即請(qǐng)求Topic
/sys/${productKey}/${deviceName}/thing/file/download
數(shù)據(jù)中的id。code
Integer
狀態(tài)碼,200表示成功。
msg
String
請(qǐng)求失敗時(shí),返回的錯(cuò)誤信息。
data
Object
返回設(shè)備端的數(shù)據(jù)。
fileToken
String
文件的唯一標(biāo)識(shí)Token。若請(qǐng)求參數(shù)傳入了fileToken值,則返回該參數(shù)。
fileLength
Integer
文件的總大小,單位字節(jié)。
bSize
Integer
當(dāng)前文件分片的大小,單位字節(jié)。
bOffset
Integer
當(dāng)前文件分片對(duì)應(yīng)字節(jié)的起始地址,與請(qǐng)求數(shù)據(jù)中的offset值相同。單位字節(jié)。
上報(bào)升級(jí)進(jìn)度
設(shè)備發(fā)布消息到Topic:
/ota/device/progress/${YourProductKey}/${YourDeviceName}
。消息格式
{ "id": "123", "params": { "step": "-1", "desc": "OTA升級(jí)失敗,請(qǐng)求不到升級(jí)包信息。", "module": "MCU" } }
格式說(shuō)明
參數(shù)
類(lèi)型
說(shuō)明
id
String
消息ID號(hào)。String類(lèi)型的數(shù)字,取值范圍0~4294967295,且每個(gè)消息ID在當(dāng)前設(shè)備中具有唯一性。
step
String
OTA升級(jí)進(jìn)度。設(shè)備上報(bào)的進(jìn)度值及其描述信息,可根據(jù)設(shè)備實(shí)際升級(jí)場(chǎng)景在設(shè)備端配置。設(shè)備端配置方法,請(qǐng)參見(jiàn)示例代碼說(shuō)明。
1~100的整數(shù):升級(jí)進(jìn)度百分比。
-1
:升級(jí)失敗。-2
:下載失敗。-3
:校驗(yàn)失敗。-4
:燒寫(xiě)失敗。
desc
String
當(dāng)前步驟的描述信息,長(zhǎng)度不超過(guò)128個(gè)字符。如果發(fā)生異常,此字段可承載錯(cuò)誤信息。
module
String
升級(jí)包所屬的模塊名。模塊的更多信息,請(qǐng)參見(jiàn)添加升級(jí)包。
上報(bào)默認(rèn)(default)模塊的OTA升級(jí)進(jìn)度時(shí),可以不上報(bào)module參數(shù)。