設備影子數據通過Topic進行流轉,主要包括設備上報狀態到設備影子、應用程序更改設備狀態、設備離線再上線后主動獲取設備影子信息,和設備端請求刪除設備影子中的屬性信息。本文介紹設備影子Topic及其數據格式。

設備影子Topic

物聯網平臺已為每個設備預定義了兩個Topic,用于實現設備影子數據流轉。

  • /shadow/update/${YourProductKey}/${YourDeviceName}

    設備和應用程序發布消息到此Topic。物聯網平臺收到該Topic的消息后,將消息中的狀態更新到設備影子中。

  • /shadow/get/${YourProductKey}/${YourDeviceName}

    設備影子更新狀態到該Topic,設備訂閱此Topic獲取最新消息。

使用示例

本文以燈泡設備為例,說明設備、設備影子以及應用程序之間的通信,主要介紹設備主動上報狀態、應用程序改變設備狀態、設備主動獲取影子內容,和設備主動刪除影子屬性。

示例中,產品的ProductKeya1PbRCF****;設備名稱DeviceNamelightbulb。設備以QoS=1發布消息和訂閱兩個設備影子Topic。

設備端開發設備影子能力的方法,請參見設備影子

設備主動上報狀態

設備在線時,主動上報設備狀態到影子,應用程序主動獲取設備影子狀態。

數據流轉過程如下圖所示。

設備主動上報狀態
  1. 當燈泡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

  2. 設備影子接收到燈泡上報的狀態數據后,更新影子文檔。
    {
        "state": {
            "reported": {
                "color": "red"
            }
        }, 
        "metadata": {
            "reported": {
                "color": {
                    "timestamp": 1469564492
                }
            }
        }, 
        "timestamp": 1469564492, 
        "version": 1
    }
  3. 影子文件更新后,設備影子會返回結果給設備(燈泡),即發送消息到設備訂閱的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. 錯誤碼說明
      errorCodeerrorMessage
      400不正確的JSON格式。
      401影子數據缺少method信息。
      402影子數據缺少state字段。
      403影子數據中version值不是數字。
      404影子數據缺少reported字段。
      405影子數據中 reported屬性字段為空。
      406影子數據中 method是無效的方法。
      407影子內容為空。
      408影子數據中reported屬性個數超過128個。
      409影子版本沖突。
      500服務端處理異常。

應用程序改變設備狀態

應用程序通過調用云端API UpdateDeviceShadow下發期望狀態給設備影子,設備影子再將文件下發給設備端。設備根據影子更新狀態,并上報最新狀態至影子。

數據流轉流程如下圖所示。

應用程序改變設備狀態
  1. 應用程序調用云端API UpdateDeviceShadow,下發消息更改燈泡狀態,例如需將燈泡的color屬性值改為green

    調用API時,參數ShadowMessage的值為:

    {
        "method": "update", 
        "state": {
            "desired": {
                "color": "green"
            }
        }, 
        "version": 2
    }
  2. 設備影子接收到更新請求,更新其影子文檔為:
    {
        "state": {
            "reported": {
                "color": "red"
            }, 
            "desired": {
                "color": "green"
            }
        }, 
        "metadata": {
            "reported": {
                "color": {
                    "timestamp": 1469564492
                }
            }, 
            "desired": {
                "color": {
                    "timestamp": 1469564576
                }
            }
        }, 
        "timestamp": 1469564576, 
        "version": 2
    }
  3. 設備影子更新完成后,發送返回結果到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
    }
  4. 如果設備燈泡在線,并且訂閱了Topic/shadow/get/a1PbRCF****/lightbulb,則會立即收到消息。

    收到消息后,根據請求文檔中desired的值,將燈泡顏色變成綠色。

    燈泡更新完狀態后,上報最新狀態到物聯網平臺。

    {
        "method": "update", 
        "state": {
            "reported": {
                "color": "green"
            }
        }, 
        "version": 3
    }
    說明 如果有時間戳判斷指令過期,也可以選擇不更新。
  5. 設備影子會返回響應結果給設備,發送消息到設備訂閱的Topic /shadow/get/a1PbRCF****/lightbulb中。詳細說明,請參見設備上報狀態的步驟3
  6. 最新狀態上報成功后, 設備端和設備影子進行以下操作。
    • 設備端發消息到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
      }

設備主動獲取影子內容

若應用程序發送指令時,設備離線。設備再次上線后,將主動獲取設備影子內容。

數據流轉過程如下圖所示。

設備主動獲取影子內容
  1. 燈泡主動發送以下消息到Topic/shadow/update/a1PbRCF****/lightbulb中,請求獲取設備影子中保存的最新狀態。
    {
        "method": "get"
    }
  2. 當設備影子收到這條消息后,發送最新狀態到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中。

其中,methoddelete,屬性的值為null

  • 刪除影子中某一屬性。
    {
        "method": "delete", 
        "state": {
            "reported": {
                "color": "null", 
                "temperature": "null"
            }
        }, 
        "version": 1
    }
  • 刪除影子全部屬性。
    {
        "method": "delete", 
        "state": {
            "reported": "null"
        }, 
        "version": 1
    }