設備影子是一個JSON文檔,用于存儲設備上報的狀態(tài)、應用程序期望狀態(tài)信息。
功能介紹
-
每個設備有且只有一個設備影子,設備可以通過MQTT獲取和設置設備影子來同步設備與物聯(lián)網(wǎng)平臺上存儲的數(shù)據(jù),該同步可以是云端的影子同步給設備,也可以是設備同步給云端的影子。
-
應用程序通過物聯(lián)網(wǎng)平臺的SDK獲取和設置設備影子,獲取設備最新狀態(tài)或者下發(fā)期望狀態(tài)給設備。
具體影子的詳細介紹見物聯(lián)網(wǎng)平臺的設備影子章節(jié)。
SDK使用
監(jiān)聽影子變更
API原型 | iot.device#onShadow(callback) |
---|---|
功能說明 | 監(jiān)聽設備影子的變化,不論是設備端主動更新影子、設備端獲取影子都會被調(diào)用 |
參數(shù)說明 | - callback:回調(diào)函數(shù) |
代碼示例:
device.onShadow((res) => {
console.log('獲取最新設備影子,%o', res);
})
用戶需要分析返回的內(nèi)容判斷是更新成功、失敗、還是云端主動向設備推送設備影子等情況,下面將會分情況進行說明。
設備端更新云端影子
API原型 | iot.device#postShadow(params) |
---|---|
功能說明 | 更新設備影子 |
參數(shù)說明 | - params:影子的內(nèi)容,為一個JSON對象 |
代碼示例:
device.postShadow({
"a": "value"
});
設備調(diào)用postShadow()
之后,device.onShadow()
將會被調(diào)用,若影子更新成功傳遞給onShadow()
的res內(nèi)容如下所示:
{
"method": "reply",
"payload": {
"status": "success",
"version": 1
},
"timestamp": 1469564576
}
用戶可以根據(jù)method的數(shù)值“reply”得知res的數(shù)值是云端對更新的響應,根據(jù)“status”為“success”得知影子更新成功;若影子更新失敗,則傳遞給onShadow()
的res內(nèi)容如下所示:
{
"method": "reply",
"payload": {
"status": "error",
"content": {
"errorcode": "${errorcode}",
"errormessage": "${errormessage}"
}
},
"timestamp": 1469564576
}
用戶可以根據(jù)“status”的值“error”得知更新影子失敗,errorcode的數(shù)值定義如下:
errorCode | errorMessage |
---|---|
400 | 不正確的JSON格式 |
401 | 影子JSON缺少method信息 |
402 | 影子JSON缺少state字段 |
403 | 影子JSON version不是數(shù)字 |
404 | 影子JSON缺少reported字段 |
405 | 影子JSON reported屬性字段為空 |
406 | 影子JSON method是無效的方法 |
407 | 影子內(nèi)容為空 |
408 | 影子reported屬性個數(shù)超過128個 |
409 | 影子版本沖突 |
500 | 服務端處理異常 |
查詢云端影子數(shù)據(jù)
API原型 | iot.device#getShadow() |
---|---|
功能說明 | 從物聯(lián)網(wǎng)平臺獲取最新的影子數(shù)據(jù) |
參數(shù)說明 | 無 |
代碼示例:
// 設備主動獲取影子,回調(diào)函數(shù)會觸發(fā)onShadow方法,返回設備影子信息
device.getShadow();
該函數(shù)調(diào)用之后將會觸發(fā)物聯(lián)網(wǎng)平臺將影子發(fā)送給設備,在onShadow()
中收到的數(shù)據(jù)格式示例如下:
{
"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
}
用戶可以解析"payload"->"state"中的"reported"得知設備以前上報的影子,分析"desired"得知云端主動修改的影子的數(shù)值。
云端修改影子數(shù)值
物聯(lián)網(wǎng)平臺上的應用程序可能修改影子的數(shù)值,在這種情況下云端會將影子數(shù)據(jù)發(fā)送給設備,onShadow()
中的res數(shù)據(jù)格式示例如下:
{
"method": "control",
"payload": {
"status": "success",
"state": {
"reported": {
"color": "red"
},
"desired": {
"color": "green"
}
},
"metadata": {
"reported": {
"color": {
"timestamp": 1469564492
}
},
"desired": {
"color": {
"timestamp": 1469564576
}
}
}
},
"version": 2,
"timestamp": 1469564576
}
用戶可以通過“method”的數(shù)值為“control”得知這時云端更新了影子。同時通過"state"->"desired"得知修改的內(nèi)容。
刪除影子
API原型 | iot.device#deleteShadow(keys) |
---|---|
功能說明 | 刪除設備影子 |
參數(shù)說明 | - keys:需要刪除的設備影子的屬性的數(shù)組 |
代碼示例:
// 刪除影子的單個屬性
device.deleteShadow("a");
// 刪除影子的多個屬性
device.deleteShadow(["a","b"]);
// 刪除影子的所有屬性
device.deleteShadow()
示例代碼
Github提供了代碼示例供開發(fā)者參考。