設備影子是一個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ā)者參考。