本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
教學課程:使用範例應用程式和 MQTT 測試用戶端,與 Device Shadow 互動
如要與 shadow.py
範例應用程式產生互動,請為 desired
值在終端機中輸入一個值。例如,您可指定類似交通號誌的顏色,而 AWS IoT 會回應該請求並更新回報的值。
於本教學課程中,您會了解如何:
-
使用
shadow.py
範例應用程式來指定所需的狀態並更新影子的目前狀態。 -
編輯 Shadow 文件,以觀察差異事件,及
shadow.py
範例應用程序如何加以回應。 -
使用 MQTT 測試用戶端訂閱影子主題,並在執行範例程式時觀察更新。
執行本教學課程之前,您必須具備:
設定您的 AWS 帳戶,配置您的 Raspberry Pi 裝置,並建立 AWS IoT 物件和政策。您也必須安裝了必要的軟體、裝置 SDK、憑證檔案,並在終端機中執行範例程式。如需詳細資訊,請參閱先前的教學課程 教學課程:準備好 Raspberry Pi 來執行影子應用程式 和 步驟 1:執行 shadow.py 範例應用程式。若您尚未完成,您必須完成這些教學課程。
於本教學課程中,您將會:
此教學課程約需 45 分鐘方能完成。
步驟 1:使用 shadow.py
範例應用程式更新所需和回報的值
在先前的教學課程 步驟 1:執行 shadow.py 範例應用程式 中,您已了解當您如本節 教學課程:安裝裝置 SDK 並執行 Device Shadows 的範例應用程式 所述輸入所需值時,如何觀察發佈至 AWS IoT 主控台中的 Shadow 文件。
在上一個範例中,我們將所需的顏色設定為 yellow
。輸入每個值後,終端機會提示您輸入另一個 desired
值。若您再次輸入相同的值 (yellow
),應用程序會辨識這一點,並提示您輸入新的 desired
值。
Enter desired value: yellow Local value is already 'yellow'. Enter desired value:
現在假設您輸入顏色 green
。AWS IoT 會回應該請求,並更新 reported
值為 green
。當 desired
狀態與 reported
狀態不同而造成差異時,這就是更新發生了。
shadow.py
範例應用程式如何模擬 Device Shadow 互動:
-
於終端機中輸入
desired
值 (例如yellow
)以發布所需的狀態。 -
由於
desired
狀態與reported
狀態 (例如,顏色green
) 不同,就會發生差異,而訂閱差異的應用程式會收到這個訊息。 -
應用程式會回應訊息,並將其狀態更新為
desired
值,yellow
。 -
然後,應用程式會發佈更新訊息,其包含裝置狀態
yellow
的新回報值。
下列展示了終端機中顯示的訊息,其中顯示如何發佈更新請求。
Enter desired value: green Changed local shadow value to 'green'. Updating reported shadow value to 'green'... Update request published. Finished updating reported shadow value to 'green'.
在 AWS IoT 主控台中,Shadow 文件會將 reported
和 desired
兩個欄位的更新值反映為 green
,且版本編號會遞增 1。例如,若先前的版本編號顯示為 10,則目前的版本編號會顯示為 11。
注意
刪除影子不會將版本編號重置為 0。當您發佈更新請求或建立另一個具相同名稱的陰子時,您會看到陰子版本會遞增 1。
編輯 Shadow 文件以觀察差異事件
shadow.py
範例應用程式也會訂閱 delta
事件,並在 desired
值發生變更時加以回應。例如,您可將 desired
值變更為顏色 red
。如要進行,請於 AWS IoT 主控台中,按一下 Edit (編輯) 來編輯 Shadow 文件,然後在 JSON 中設定 desired
值為 red
,同時保留 reported
值為 green
。儲存變更之前,請讓 Raspberry Pi 上的終端機保持開啟狀態,因為您會在變更發生時看到顯示於終端機中的訊息。
{ "desired": { "welcome": "aws-iot", "color": "red" }, "reported": { "welcome": "aws-iot", "color": "green" } }
儲存新值之後,shadow.py
範例應用程式會回應此變更,並在終端機中顯示指出差異的訊息。接著,您應該會在輸入 desired
值的提示下方看到下列訊息。
Enter desired value: Received shadow delta event. Delta reports that desired value is 'red'. Changing local value... Changed local shadow value to 'red'. Updating reported shadow value to 'red'... Finished updating reported shadow value to 'red'. Enter desired value: Update request published. Finished updating reported shadow value to 'red'.
步驟 2:檢視 MQTT 測試用戶端中 shadow.py
範例應用程式的訊息
您可使用 AWS IoT 主控台中的 MQTT 測試用戶端,監控傳入您 AWS 帳戶 中的 MQTT 訊息。訂閱 Device Shadow 服務使用的預留 MQTT 主題,您可在執行範例應用程式時觀察主題收到的訊息。
若您尚未使用 MQTT 測試用戶端,您可檢閱 使用 AWS IoT MQTT用戶端檢視MQTT訊息。這有助於您了解如何使用 AWS IoT 主控台中的 MQTT 測試用戶端,在 MQTT 訊息通過訊息代理程式時,檢視訊息。
-
開啟 MQTT 測試用戶端
在新視窗開啟 AWS IoT 主控台中的 MQTT 測試用戶端
,如此您便可觀察 MQTT 主題所收到的訊息,不會遺失 MQTT 測試用戶端的組態。若您讓 MQTT 用戶端前往主控台中的另一個頁面,其不會保留任何訂閱或訊息記錄。在本教學課程的這一節中,您可在個別的視窗中開啟您 AWS IoT 物件的 Shadow 文件 和 MQTT 測試用戶端,以便更輕鬆地觀察與 Device Shadows 的互動。 -
訂閱 MQTT 預留的 Shadow 主題
您可使用 MQTT 測試用戶端輸入 Device Shadow 之 MQTT 預留主題的名稱,並加以訂閱,以於執行
shadow.py
範例應用程式時收到更新。如要訂閱主題:於 AWS IoT 主控台的 MQTT 測試用戶端中,選擇 Subscribe to a topic (訂閱主題)。
於 主題篩選條件區段中,輸入:$aws/things/
thingname
/shadow/update/#。在此,thingname
是您先前所建立物件資源的名稱 (例如,My_light_bulb
)。保留其他組態設定的預設值,然後選擇 Subscribe (訂閱)。
在主題訂閱中使用 # 萬用字元,您可同時訂閱多個 MQTT 主題,並在單一視窗中觀察裝置及其 Shadow 間交換的所有訊息。如需萬用字元及其用法的詳細資訊,請參閱 MQTT 主題。
-
執行
shadow.py
範例程式並觀察訊息在 Raspberry Pi 的命令列視窗中,若您已中斷程式的連線,請再次執行範例應用程式,並於 AWS IoT 主控台中查看 MQTT 測試用戶端中的訊息。
-
執行下列命令以重新啟動範例程式。以您之前建立的 AWS IoT 物件名稱替換
your-iot-thing-name
和your-iot-endpoint
(例如My_light_bulb
),及與裝置互動的端點。cd ~/aws-iot-device-sdk-python-v2/samples python3 shadow.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint
your-iot-endpoint
--thing_nameyour-iot-thing-name
shadow.py
範例應用程式接著會執行並擷取目前的影子狀態。若您已刪除影子或清除目前狀態,該程式會將目前值設定為off
,然後提示您輸入desired
值。Connecting to a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-0c8ae2ff-cc87-49d2-a82a-ae7ba1d0ca5a'... Connected! Subscribing to Delta events... Subscribing to Update responses... Subscribing to Get responses... Requesting current shadow state... Launching thread to read user input... Finished getting initial shadow state. Shadow document lacks 'color' property. Setting defaults... Changed local shadow value to 'off'. Updating reported shadow value to 'off'... Update request published. Finished updating reported shadow value to 'off'... Enter desired value:
另一方面,若程式正在執行,而您將其重新啟動,則會在終端機中看到回報的最新顏色值。於 MQTT 測試用戶端中,您會看到主題更新 $aws/things/
thingname
/shadow/get 和 $aws/things/thingname
/shadow/get/accepted。假設回報的最新顏色是
green
。下列會顯示 $aws/things/thingname
/shadow/get/accepted JSON 檔案的內容。{ "state": { "desired": { "welcome": "aws-iot", "color": "green" }, "reported": { "welcome": "aws-iot", "color": "green" } }, "metadata": { "desired": { "welcome": { "timestamp": 1620156892 }, "color": { "timestamp": 1620161643 } }, "reported": { "welcome": { "timestamp": 1620156892 }, "color": { "timestamp": 1620161643 } } }, "version": 10, "timestamp": 1620173908 }
-
於終端機中輸入
desired
值,例如yellow
。shadow.py
範例應用程式會在終端機中回應並顯示下列訊息,顯示reported
值變更為yellow
。Enter desired value: yellow Changed local shadow value to 'yellow'. Updating reported shadow value to 'yellow'... Update request published. Finished updating reported shadow value to 'yellow'.
於 AWS IoTconsole (主控台) MQTT test client (MQTT 測試用戶端) 的 Subscriptions (訂閱) 之下,您會看到下列主題收到訊息:
-
$aws/things/
thingname
/shadow/update:顯示desired
和updated
值會變更為顏色yellow
。 -
$aws/things/
thingname
/shadow/update/accepted:顯示desired
和reported
狀態的目前值及其中繼資料和版本資訊。 -
$aws/things/
thingname
/shadow/update/documents:顯示desired
和reported
狀態的先前的值和目前值及其中繼資料和版本資訊。
作為文件 $aws/things/
thingname
/shadow/update/documents 也包含其他兩個主題中所包含的資訊,我們可以加以檢閱以查看狀態資訊。先前狀態會顯示設定為green
的回報值、其中繼資料和版本資訊,目前狀態會顯示已更新為yellow
的回報值。{ "previous": { "state": { "desired": { "welcome": "aws-iot", "color": "green" }, "reported": { "welcome": "aws-iot", "color": "green" } }, "metadata": { "desired": { "welcome": { "timestamp": 1617297888 }, "color": { "timestamp": 1617297898 } }, "reported": { "welcome": { "timestamp": 1617297888 }, "color": { "timestamp": 1617297898 } } }, "version": 10 }, "current": { "state": { "desired": { "welcome": "aws-iot", "color": "yellow" }, "reported": { "welcome": "aws-iot", "color": "yellow" } }, "metadata": { "desired": { "welcome": { "timestamp": 1617297888 }, "color": { "timestamp": 1617297904 } }, "reported": { "welcome": { "timestamp": 1617297888 }, "color": { "timestamp": 1617297904 } } }, "version": 11 }, "timestamp": 1617297904 }
-
-
若您現在輸入另一個
desired
值,您會看到這些主題所收到reported
值和訊息更新的進一步變更。版本編號也會遞增 1。例如,若您輸入值green
時,先前的狀態會報告值yellow
,而目前狀態會報告值green
。
-
-
編輯 Shadow 文件以觀察差異事件
如要觀察差異主題的變更,請編輯 AWS IoT 主控台中的 Shadow 文件。例如,您可將
desired
值變更為顏色red
。若要這麼做,請於 AWS IoT 主控台中,選擇 Edit (編輯),然後在 JSON 中設定desired
值為紅色,同時保持reported
值設定為green
。儲存變更之前,請保持終端開啟狀態,因為您會在終端機中看到回報的差異訊息。{ "desired": { "welcome": "aws-iot", "color": "red" }, "reported": { "welcome": "aws-iot", "color": "green" } }
shadow.py
範例應用程式會回應此變更,並在終端機中顯示指出差異的訊息。於 MQTT 測試用戶端中,update
主題將會收到一則訊息,顯示desired
和reported
值的變更。您也會看到主題 $aws/things/
thingname
/shadow/update/delta 收到訊息。如要查看訊息,請選擇此列於 Subscriptions (訂閱) 之下的主題。{ "version": 13, "timestamp": 1617318480, "state": { "color": "red" }, "metadata": { "color": { "timestamp": 1617318480 } } }
步驟 3:疑難排解 Device Shadow 互動的錯誤
當您執行 Shadow 範例應用程式時,您可能會遇到觀察與 Device Shadow 服務互動的問題。
若程式執行成功,並提示您輸入 desired
值,您應可使用如前所述的 Shadow 文件和 MQTT 測試用戶端,觀察 Device Shadow 互動。不過,若您無法看到互動,您可檢查下列事項:
-
檢查 AWS IoT 主控台中物件名稱及其影子
若您看不到 Shadow 文件中的訊息,請檢閱命令,並確定其符合 AWS IoT 主控台中的物件名稱。您還可依序選擇您的物件名稱和 Shadows (影子),來檢查您是否有經典影子。本教學課程主要著重於與經典影子的互動。
您也可以確認您使用的裝置已連線至網際網路。於 AWS IoT 主控台中,選擇您先前建立的物件,然後選擇 Interact (互動)。在物件詳細資訊頁面上,您應會在此處看到訊息:
This thing already appears to be connected.
-
查看您訂閱的 MQTT 預留主題
若您在 MQTT 測試用戶端中看不到訊息,請檢查您訂閱的主題是否已正確格式化。MQTT Device Shadow 主題具有格式 $aws/things/
thingname
/shadow/,且可能具有update
、get
或delete
,根據您希望對影子執行的動作而定。本教學課程使用主題 $aws/things/thingname
/shadow/#,因此,在訂閱測試用戶端之主題篩選條件部分中的主題時,請確定您已正確輸入。當您輸入主題名稱時,請確定
thingname
與您先前建立的 AWS IoT 物件名稱相同。您還可訂閱其他 MQTT 主題,查看是否已成功執行更新。例如,您可訂閱主題 $aws/things/thingname
/shadow/update/rejected,在更新請求失敗時收到訊息,您便可對連線問題進行偵錯。如需有關預留主題的更多資訊,請參閱 影子主題 和 裝置影子MQTT主題。
步驟 4:檢閱結果及後續步驟
在本教學課程中,您會了解如何:
-
使用
shadow.py
範例應用程式來指定所需的狀態並更新影子的目前狀態。 -
編輯 Shadow 文件,以觀察差異事件,及
shadow.py
範例應用程序如何加以回應。 -
使用 MQTT 測試用戶端訂閱影子主題,並在執行範例程式時觀察更新。
後續步驟
您可訂閱其他 MQTT 預留主題,以觀察影子應用程式的更新。例如,若您僅訂閱主題 $aws/things/thingname
/shadow/update/accepted,則更新成功執行時,您只會看到目前的狀態資訊。
您也可訂閱其他影子主題來偵錯問題,或深入了解 Device Shadow 互動,還可對 Device Shadow 互動的任何問題進行偵錯。如需詳細資訊,請參閱 影子主題 及 裝置影子MQTT主題。
您也可選擇使用命名影子或使用為 LED 與 Raspberry Pi 連接其他的硬體擴展您的應用程式,並使用從終端傳送訊息來觀察其狀態的變化。
如需有關 Device Shadows 服務及在裝置、應用程式和服務中使用服務的詳細資訊,請參閱 AWS IoT Device Shadow 服務、在裝置中使用影子 and 在應用程式和服務中使用影子。