設備影子數據通過Topic進行流轉,主要包括設備上報狀態到設備影子、應用程序更改設備狀態、設備離線再上線后主動獲取設備影子信息,和設備端請求刪除設備影子中的屬性信息。本文介紹設備影子Topic及其數據格式。
設備影子Topic
物聯網平臺已為每個設備預定義了兩個Topic,用于實現設備影子數據流轉。
/shadow/update/${YourProductKey}/${YourDeviceName}
設備和應用程序發布消息到此Topic。物聯網平臺收到該Topic的消息后,將消息中的狀態更新到設備影子中。
/shadow/get/${YourProductKey}/${YourDeviceName}
設備影子更新狀態到該Topic,設備訂閱此Topic獲取最新消息。
使用示例
本文以燈泡設備為例,說明設備、設備影子以及應用程序之間的通信,主要介紹設備主動上報狀態、應用程序改變設備狀態、設備主動獲取影子內容,和設備主動刪除影子屬性。
示例中,產品的ProductKey是a1PbRCF****;設備名稱DeviceName是lightbulb。設備以QoS=1發布消息和訂閱兩個設備影子Topic。
設備端開發設備影子能力的方法,請參見設備影子。
設備主動上報狀態
設備在線時,主動上報設備狀態到影子,應用程序主動獲取設備影子狀態。
數據流轉過程如下圖所示。
- 當燈泡lightbulb上線時,使用Topic
/shadow/update/a1PbRCF****/lightbulb
上報最新狀態到影子。發送的JSON消息格式:{ "method": "update", "state": { "reported": { "color": "red" } }, "version": 1 }
表 1. 上報參數說明 參數 說明 method 表示設備或者應用程序請求設備影子時的操作類型。 當執行更新操作時,method為必填字段,設置為update。
state 表示設備發送給設備影子的狀態信息。 reported為必填字段,狀態信息會同步更新到設備影子的reported部分。
version 表示設備影子檢查請求中的版本信息。 只有當新版本大于當前版本時,設備影子才會接收設備端的請求,并更新設備影子版本。
如果version設置為
-1
時,表示清空設備影子數據,設備影子會接收設備端的請求,并將設備影子版本更新為0
。 - 設備影子接收到燈泡上報的狀態數據后,更新影子文檔。
{ "state": { "reported": { "color": "red" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } } }, "timestamp": 1469564492, "version": 1 }
- 影子文件更新后,設備影子會返回結果給設備(燈泡),即發送消息到設備訂閱的Topic
/shadow/get/a1PbRCF****/lightbulb
中。- 若更新成功,發送到該Topic中的消息為:
{ "method": "reply", "payload": { "status": "success", "version": 1 }, "timestamp": 1469564576 }
- 若更新失敗,發送到該Topic中的消息為:
{ "method": "reply", "payload": { "status": "error", "content": { "errorcode": "${errorcode}", "errormessage": "${errormessage}" } }, "timestamp": 1469564576 }
表 2. 錯誤碼說明 errorCode errorMessage 400 不正確的JSON格式。 401 影子數據缺少method信息。 402 影子數據缺少state字段。 403 影子數據中version值不是數字。 404 影子數據缺少reported字段。 405 影子數據中 reported屬性字段為空。 406 影子數據中 method是無效的方法。 407 影子內容為空。 408 影子數據中reported屬性個數超過128個。 409 影子版本沖突。 500 服務端處理異常。
- 若更新成功,發送到該Topic中的消息為:
應用程序改變設備狀態
應用程序通過調用云端API UpdateDeviceShadow下發期望狀態給設備影子,設備影子再將文件下發給設備端。設備根據影子更新狀態,并上報最新狀態至影子。
數據流轉流程如下圖所示。
- 應用程序調用云端API UpdateDeviceShadow,下發消息更改燈泡狀態,例如需將燈泡的color屬性值改為green。
調用API時,參數ShadowMessage的值為:
{ "method": "update", "state": { "desired": { "color": "green" } }, "version": 2 }
- 設備影子接收到更新請求,更新其影子文檔為:
{ "state": { "reported": { "color": "red" }, "desired": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } }, "desired": { "color": { "timestamp": 1469564576 } } }, "timestamp": 1469564576, "version": 2 }
- 設備影子更新完成后,發送返回結果到Topic
/shadow/get/a1PbRCF****/lightbulb
中。返回結果信息構成由設備影子決定。{ "method": "control", "payload": { "state": { "reported": { "color": "red" }, "desired": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } }, "desired": { "color": { "timestamp": 1469564576 } } } }, "version": 2, "timestamp": 1469564576 }
- 如果設備燈泡在線,并且訂閱了Topic
/shadow/get/a1PbRCF****/lightbulb
,則會立即收到消息。收到消息后,根據請求文檔中desired的值,將燈泡顏色變成綠色。
燈泡更新完狀態后,上報最新狀態到物聯網平臺。
{ "method": "update", "state": { "reported": { "color": "green" } }, "version": 3 }
說明 如果有時間戳判斷指令過期,也可以選擇不更新。 - 設備影子會返回響應結果給設備,發送消息到設備訂閱的Topic
/shadow/get/a1PbRCF****/lightbulb
中。詳細說明,請參見設備上報狀態的步驟3。 - 最新狀態上報成功后, 設備端和設備影子進行以下操作。
- 設備端發消息到Topic
/shadow/update/a1PbRCF****/lightbulb
中清空desired屬性。消息如下:{ "method": "update", "state": { "desired": "null" }, "version": 4 }
- 設備影子會同步更新影子文檔,此時的影子文檔如下:
{ "state": { "reported": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564577 } }, "desired": { "timestamp": 1469564576 } }, "version": 4 }
- 設備端發消息到Topic
設備主動獲取影子內容
若應用程序發送指令時,設備離線。設備再次上線后,將主動獲取設備影子內容。
數據流轉過程如下圖所示。
- 燈泡主動發送以下消息到Topic
/shadow/update/a1PbRCF****/lightbulb
中,請求獲取設備影子中保存的最新狀態。{ "method": "get" }
- 當設備影子收到這條消息后,發送最新狀態到Topic
/shadow/get/a1PbRCF****/lightbulb
。燈泡通過訂閱該Topic獲取最新狀態。消息內容如下:{ "method": "reply", "payload": { "status": "success", "state": { "reported": { "color": "red" }, "desired": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } }, "desired": { "color": { "timestamp": 1469564492 } } } }, "version": 2, "timestamp": 1469564576 }
設備主動刪除影子屬性
若設備端已經是最新狀態,設備端可以主動發送指令,刪除設備影子中保存的某條屬性狀態。
數據流轉過程如下圖所示。
設備發送以下內容到Topic/shadow/update/a1PbRCF****/lightbulb
中。
其中,method為delete,屬性的值為null。
- 刪除影子中某一屬性。
{ "method": "delete", "state": { "reported": { "color": "null", "temperature": "null" } }, "version": 1 }
- 刪除影子全部屬性。
{ "method": "delete", "state": { "reported": "null" }, "version": 1 }