本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
模擬 Device Shadow 服務通訊
本主題示範如何將 Device Shadow 服務如何作為中繼點,並允許裝置和應用程式使用影子來更新、儲存和擷取裝置的狀態。
若要示範本主題中描述的互動,並進一步探索,您將需要 AWS 帳戶 和 系統,以便在其中執行 AWS CLI。如果您沒有這些項目,您仍然可以在程式碼範例中看到互動。
在此範例中, AWS IoT 主控台代表裝置。 AWS CLI 代表透過影子存取裝置的應用程式或服務。 AWS CLI 介面與應用程式可能用來與 通訊API的 非常相似 AWS IoT。此範例中的裝置是智慧型燈泡,應用程式會顯示燈泡的狀態,而且可以變更燈泡的狀態。
準備模擬
以下程序會開啟模擬裝置的 AWS IoT 主控台
準備模擬環境的步驟
-
您需要 自行 AWS 帳戶 執行此主題的範例。如果您沒有 AWS 帳戶,請建立 ,如 中所述設定 AWS 帳戶。
-
開啟AWS IoT 主控台
,然後在左側選單中,選擇測試以開啟MQTT用戶端 。 -
在另一個視窗中,在已安裝 AWS CLI 的系統上開啟終端機視窗。
您應該開啟兩個視窗:一個在測試頁面上具有 AWS IoT 主控台,另一個在命令列提示字元。
初始化裝置
在此模擬中,我們將使用名為 的物件mySimulatedThing,及其名為 simShadow1 的影子。
建立物件及其 IoT 政策
如要建立物件物件,請於 AWS IoT 主控台中:
-
選擇 Manage (管理),然後選擇 Things (物件)。
-
如果列出物件,請按一下建立按鈕,否則請按一下註冊單一物件以建立單一 AWS IoT 物件。
-
輸入名稱
mySimulatedThing
,將其他設定保留為預設值,然後按一下Next (下一步)。 -
使用單鍵憑證建立來產生憑證,其會驗證裝置到 AWS IoT的連線。按一下 Activate (啟用),啟用憑證。
-
您可以連接政策,
My_IoT_Policy
該政策會授予裝置發佈和訂閱MQTT預留主題的許可。如需如何建立 AWS IoT 物件以及如何建立此政策的更詳細步驟,請參閱 建立物件。
為物件建立已命名的影子
您可以向主題 $aws/things/mySimulatedThing/shadow/name/simShadow1/update
發佈更新請求來為物件建立已命名的影子,如下方所述。
或者,若要建立具名影子:
-
在 AWS IoT Console (主控台) 中,在顯示的物件清單中選擇您的物件,然後選擇 Shadows (影子)。
-
選擇 Add a shadow (新增影子),輸入名稱
simShadow1
,接著選擇 Create (建立),以新增命名的影子。
訂閱並發佈至預留MQTT主題
在 主控台中,訂閱預留MQTT陰影主題。這些主題是對 get
、update
和 delete
動作的回應,以便您的裝置在發佈動作之後就可以接收回應。
在MQTT用戶端中訂閱MQTT主題
-
在MQTT用戶端 中,選擇訂閱主題 。
-
輸入
get
、update
和delete
主題以進行訂閱。從下方清單一次複製一個主題,將其貼到Topic filter (主題篩選條件) 欄位,再按一下 Subscribe (訂閱)。您應會看到顯示於 Subscriptions (訂閱) 之下的主題。-
$aws/things/mySimulatedThing/shadow/name/simShadow1/delete/accepted
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/delete/rejected
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/update/documents
此時,您的模擬裝置已準備好接收由 AWS IoT發佈的主題。
-
若要發佈至MQTT用戶端中的MQTT主題
在裝置自行初始化並訂閱回應主題之後,它會查詢所支援的影子。此模擬僅支援一個影子,該影子支援名為 、mySimulatedThing名為 、simShadow1 的物件。
從MQTT用戶端取得目前的影子狀態
-
在MQTT用戶端 中,選擇發佈至主題 。
-
在 Publish (發佈) 之下,輸入下列主題,然後刪除下方主題訊息內文視窗的任何內容,您可在其中輸入要取得的主題。接著,您可選擇 Publish to topic (發佈至主題),發佈請求。
$aws/things/mySimulatedThing/shadow/name/simShadow1/get
。若您尚未建立命名的影子
simShadow1
, 您收到了$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected
主題中的一則訊息,且code
為404
,(如此範例中所示),則系統尚未建立該影子,因此我們接下來將其建立。{ "code": 404, "message": "No shadow exists with name: 'simShadow1'" }
建立具有裝置目前狀態的影子
-
在MQTT用戶端 中,選擇發佈至主題並輸入此主題:
$aws/things/mySimulatedThing/shadow/name/simShadow1/update
-
在您輸入主題的訊息內文視窗中,輸入此影子文件,以顯示裝置以RGB值報告其 ID 及其目前顏色。選擇 Publish (發佈),發佈請求。
{ "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6" }
若您在主題中收到一則訊息:
-
$aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted
:這表示已建立影子,而訊息內文包含目前的影子文件。 -
$aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected
:檢閱訊息內文中的錯誤。 -
$aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted
:影子已存在,且訊息內文具有目前的影子狀態,例如在此範例中。有了這個,您可以設置您的裝置或確認它符合影子狀態。{ "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 3, "timestamp": 1591140517, "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6" }
從應用程式傳送更新
本節使用 AWS CLI 示範應用程式如何與影子互動。
若要使用 取得陰影的目前狀態 AWS CLI
在命令列輸入此命令:
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
在 Windows 平台上,您可使用 con
,而非 /dev/stdout
。
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
因為影子已存在,而且已由裝置初始化以反映其目前狀態,所以它會傳回下列的影子文件。
{ "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 3, "timestamp": 1591141111 }
應用程式可以使用此回應來初始化對其裝置狀態的表示法。
如果應用程式更新狀態,例如當使用者將智慧型燈泡的顏色變更為黃色時,應用程式會傳送 update-thing-shadow 命令。此命令對應至 UpdateThingShadow
REST API。
從應用程式更新影子
在命令列輸入此命令:
如果成功,這個命令應該會傳回下列影子文件。
{ "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] } }, "version": 4, "timestamp": 1591141596, "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab" }
回應裝置中的更新
返回 AWS 主控台中的MQTT用戶端時,您應該會看到 AWS IoT 發佈的訊息,以反映上一節中發佈的更新命令。
在MQTT用戶端中檢視更新訊息
在MQTT用戶端 中,選擇訂閱欄中的 $aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta。如果主題名稱被截斷,您可以暫停以查看完整主題。在本主題的主題記錄中,您應會看到類似此訊息的 /delta
訊息。
{ "version": 4, "timestamp": 1591141596, "state": { "ColorRGB": [ 255, 255, 0 ] }, "metadata": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab" }
您的裝置會處理此訊息的內容,以將裝置狀態設定為符合訊息中的 desired
狀態。
裝置更新狀態以符合訊息中desired
狀態後,必須透過 AWS IoT 發佈更新訊息,將新的報告狀態傳回 。此程序會在MQTT用戶端 中模擬這一點。
從裝置更新影子
-
在MQTT用戶端 中,選擇發佈至主題 。
-
在訊息內文視窗的訊息內文視窗上方的主題欄位中,輸入影子的主題,接著輸入
/update
動作:$aws/things/mySimulatedThing/shadow/name/simShadow1/update
,並在訊息內文中輸入此更新的影子文件,其中說明裝置的目前狀態。選擇 Publish (發佈),發佈更新的裝置狀態。{ "state": { "reported": { "ColorRGB": [255,255,0] } }, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }
如果 成功收到訊息 AWS IoT,您應該會在MQTT用戶端的 $aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted 訊息日誌中看到新的回應,其中包含影子的目前狀態,例如此範例。
{ "state": { "reported": { "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "reported": { "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5, "timestamp": 1591142747, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }
成功更新報告的裝置狀態也會導致 AWS IoT 將訊息中影子狀態的完整描述傳送至主題,例如由裝置在上述程序中執行的影子更新所導致的此訊息內文。
{ "previous": { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 4 }, "current": { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5 }, "timestamp": 1591142747, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }
觀察應用程式中的更新
應用程式現在可以查詢裝置報告的目前狀態的影子。
若要使用 取得陰影的目前狀態 AWS CLI
-
在命令列輸入此命令:
aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout
在 Windows 平台上,您可使用
con
,而非/dev/stdout
。aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
-
因為裝置剛剛更新影子,以反映其目前的狀態,所以應該傳回下列影子文件。
{ "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5, "timestamp": 1591143269 }
超越模擬
試驗 AWS CLI (代表應用程式) 與主控台 (代表裝置) 之間的互動,以建立 IoT 解決方案的模型。