

支援終止通知：2026 年 10 月 7 日 AWS 將停止 的支援 AWS IoT Greengrass Version 1。2026 年 10 月 7 日之後，您將無法再存取 AWS IoT Greengrass V1 資源。如需詳細資訊，請造訪[從 遷移 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 第五單元：與裝置陰影互動
<a name="module5"></a>

此進階模組會示範用戶端裝置如何與 AWS IoT Greengrass 群組中的[AWS IoT 裝置影子](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)互動。*陰影*為 JSON 文件用於儲存事物的目前或想要的狀態資訊。在此模組中，您將探索一個用戶端裝置 (`GG_Switch`) 如何修改另一個用戶端裝置 (`GG_TrafficLight`) 的狀態，以及如何將這些 AWS IoT Greengrass 狀態同步至雲端：

![\[AWS IoT Greengrass 核心連接到流量光源裝置陰影和光源切換裝置。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-077.5.png)


開始之前，請先執行 [Greengrass 裝置安裝](quick-start.md)指令碼，或確定您已完成[單元 1](module1.md) 和[單元 2](module2.md)。您也應該了解如何將用戶端裝置連接至 AWS IoT Greengrass 核心 ([單元 4](module4.md))。您不需要其他的元件或裝置。

此單元需約 30 分鐘完成。

**Topics**
+ [設定裝置和訂閱](config-dev-subs.md)
+ [下載必要的檔案](file-download.md)
+ [測試通訊 (停用裝置同步)](comms-disabled.md)
+ [測試通訊 (啟用裝置同步)](comms-enabled.md)

# 設定裝置和訂閱
<a name="config-dev-subs"></a>

當 AWS IoT Greengrass 核心連線到網際網路 AWS IoT 時，陰影可以同步到 。您在此模組中會先使用本機陰影 (但不同步到雲端)。然後，您啟用雲端同步。

每個用戶端裝置都有自己的影子。如需詳細資訊，請參閱《 *AWS IoT 開發人員指南*》中的[適用於 的 裝置陰影服務 AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-device-shadows.html)。

1. 在群組組態頁面上，選擇**用戶端裝置**索引標籤。

1. 從**用戶端裝置**索引標籤中，在您的 AWS IoT Greengrass 群組中新增兩個新的用戶端裝置。如需此程序的詳細步驟，請參閱 [在 AWS IoT Greengrass 群組中建立用戶端裝置](device-group.md)。
   + 命名用戶端裝置**GG\$1Switch**和 **GG\$1TrafficLight**。
   + 產生並下載兩個用戶端裝置的安全資源。
   + 記下用戶端裝置安全資源檔案名稱中的憑證 ID。您稍後會用到這些值。

1. 在電腦上為這些用戶端裝置的安全登入資料建立資料夾。將憑證和金鑰複製到此資料夾。

1. 確定用戶端裝置設定為使用本機影子，而不是與 同步 AWS 雲端。如果沒有，請選取用戶端裝置，選擇**同步陰影**，然後選擇**停用與雲端的陰影同步**。

1. <a name="module5-subscriptions"></a>將下表中的訂閱新增到群組。例如，若要建立第一個訂閱：

   1. 在群組組態頁面上，選擇**訂閱**索引標籤，然後選擇**新增**。

   1. 針對**來源類型**，選擇**用戶端裝置**，然後選擇 **GG\$1Switch**。

   1. 針對**目標類型**，選擇**服務**，然後選擇 **Local Shadow Service**。

   1. 針對 **Topic filter (主題篩選條件)**，輸入 **\$1aws/things/GG\$1TrafficLight/shadow/update**。

   1. 選擇 **Create subscription** (建立訂閱)。

   主題必須完全照表格所示輸入。雖然您可以使用萬用字元來合併部分訂閱，但我們並不建議這麼做。如需詳細資訊，請參閱《 *AWS IoT 開發人員指南*》中的 [Shadow MQTT 主題](https://docs.aws.amazon.com/iot/latest/developerguide/device-shadow-mqtt.html)。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/config-dev-subs.html)

   新的訂閱會顯示在**訂閱**索引標籤上。
**注意**  
如需 `$` 字元的相關資訊，請參閱[預留主題](https://docs.aws.amazon.com/iot/latest/developerguide/topics.html#reserved-topics)。

1. <a name="enable-automatic-detection"></a>確定已啟用自動偵測，這樣 Greengrass 核心就能發佈其 IP 地址清單。用戶端裝置會使用此資訊來探索核心。請執行下列操作：

   1. 在群組組態頁面上，選擇 **Lambda 函數**索引標籤。

   1. 在 **System Lambda 函數**下，選擇 **IP 偵測器**，然後選擇**編輯**。

   1. 在**編輯 IP 偵測器設定**中，選擇**自動偵測和覆寫 MQTT 代理程式端點**，然後選擇**儲存**。

1. 請確定 Greengrass 協助程式正在執行，如 中所述[部署雲端組態到核心裝置](configs-core.md)。

1. <a name="console-actions-deploy"></a>在群組組態頁面上，選擇**部署**。

# 下載必要的檔案
<a name="file-download"></a>

1. 如果您尚未這麼做，請安裝 AWS IoT Device SDK 適用於 Python 的 。如需說明，請參閱[安裝 AWS IoT Device SDK for Python](IoT-SDK.md)中的步驟 1。

   此 SDK 供用戶端裝置用來與 AWS IoT 和 AWS IoT Greengrass 核心裝置通訊。

1. 從 GitHub 上的 [ TrafficLight](https://github.com/aws/aws-greengrass-core-sdk-python/tree/master/examples/TrafficLight) 範例資料夾中，將 `lightController.py` 和 `trafficLight.py` 檔案下載到您的電腦。將它們儲存在包含 GG\$1Switch 和 GG\$1TrafficLight 用戶端裝置憑證和金鑰的資料夾中。

   `lightController.py` 指令碼對應至 GG\$1Switch 用戶端裝置，而`trafficLight.py`指令碼對應至 GG\$1TrafficLight 用戶端裝置。  
![\[檔案的螢幕擷取畫面包含兩個 Python 指令碼和裝置憑證與金鑰。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-082.png)
**注意**  
為了方便起見，Python 檔案範例會存放在適用於 Python 的 AWS IoT Greengrass Core SDK 儲存庫中，但不會使用 AWS IoT Greengrass Core SDK。

# 測試通訊 (停用裝置同步)
<a name="comms-disabled"></a>

1. <a name="ping-device"></a>請確定您的電腦和 AWS IoT Greengrass 核心裝置已使用相同的網路連線至網際網路。

   1. 在 AWS IoT Greengrass 核心裝置上，執行下列命令來尋找其 IP 地址。

      ```
      hostname -I
      ```

   1. 在您的電腦，使用核心的 IP 地址執行以下命令。您可以使用 Ctrl \$1 C 來停止 **ping** 命令。

      ```
      ping IP-address
      ```

      類似以下的輸出表示電腦與 AWS IoT Greengrass 核心裝置之間的通訊成功 （封包遺失 0%)：  
![\[ping 命令成功輸出。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-075.5.png)
**注意**  
如果您無法 ping 執行中的 EC2 執行個體 AWS IoT Greengrass，請確定執行個體的傳入安全群組規則允許 [Echo 請求](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html#sg-rules-ping)訊息的 ICMP 流量。如需詳細資訊，請參閱《*Amazon EC2 使用者指南*》中的[將規則新增至安全群組](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#adding-security-group-rule)。  
在 Windows 主機電腦的 Windows 防火牆和進階安全應用程式中，您也可能需要啟用允許傳入回聲請求的內送規則 (例如，**File and Printer Sharing (Echo Request - ICMPv4-In) (檔案和印表機共用 (回聲請求 - ICMPv4-In)**) 或建立規則。

1. 取得您的 AWS IoT 端點。

   1. <a name="iot-settings"></a>從[AWS IoT 主控台](https://console.aws.amazon.com/iot/)導覽窗格中，選擇**設定**。

   1. <a name="iot-settings-endpoint"></a>在**裝置資料端點**下，記下**端點**的值。您可以使用這個值，在以下步驟的命令中取代 *AWS\$1IOT\$1ENDPOINT* 預留位置。
**注意**  
請確定您的[端點對應至您的憑證類型](gg-core.md#certificate-endpoints)。

1. <a name="repeated-step"></a>在您的電腦 （而非 AWS IoT Greengrass 核心裝置） 上，開啟兩個[命令列 ](https://en.wikipedia.org/wiki/Command-line_interface)（終端或命令提示） 視窗。一個視窗代表 GG\$1Switch 用戶端裝置，另一個視窗代表 GG\$1TrafficLight 用戶端裝置。

   1. <a name="run-switch-device"></a>從 GG\$1Switch 用戶端裝置視窗中，執行下列命令。
      + 將 *path-to-certs-folder*替換為包含憑證、金鑰和 Python 檔案的資料夾路徑。
      + 將 *AWS\$1IOT\$1ENDPOINT* 取代為您的端點。
      + 將兩個 *switchCertId* 執行個體取代為 GG\$1Switch 用戶端裝置的檔案名稱中的憑證 ID。

      ```
      cd path-to-certs-folder
      python lightController.py --endpoint AWS_IOT_ENDPOINT --rootCA AmazonRootCA1.pem --cert switchCertId-certificate.pem.crt --key switchCertId-private.pem.key --thingName GG_TrafficLight --clientId GG_Switch
      ```

   1. <a name="run-trafficlight-device"></a>從 GG\$1TrafficLight 用戶端裝置視窗中，執行下列命令。
      + 將 *path-to-certs-folder*替換為包含憑證、金鑰和 Python 檔案的資料夾路徑。
      + 將 *AWS\$1IOT\$1ENDPOINT* 取代為您的端點。
      + 將兩個 *lightCertId* 執行個體取代為 GG\$1TrafficLight 用戶端裝置的檔案名稱中的憑證 ID。

      ```
      cd path-to-certs-folder
      python trafficLight.py --endpoint AWS_IOT_ENDPOINT --rootCA AmazonRootCA1.pem --cert lightCertId-certificate.pem.crt --key lightCertId-private.pem.key --thingName GG_TrafficLight --clientId GG_TrafficLight
      ```

      每 20 秒會切換更新陰影狀態為 G、Y 和 R，光源會顯示其新的狀態，如下所示。

      GG\$1Switch 輸出：  
![\[輸出的螢幕擷取畫面與 GG_Switch 有關聯。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-083.png)

      GG\$1TrafficLight 輸出：  
![\[輸出的螢幕擷取畫面與 GG_TrafficLight 有關聯。\]](http://docs.aws.amazon.com/zh_tw/greengrass/v1/developerguide/images/gg-get-started-084.png)

   第一次執行時，每個用戶端裝置指令碼都會 AWS IoT Greengrass 執行探索服務以連線到 AWS IoT Greengrass 核心 （透過網際網路）。在用戶端裝置發現並成功連接到 AWS IoT Greengrass 核心之後，就可以在本機執行未來的操作。
**注意**  
<a name="check-connection-info"></a> `lightController.py` 和 `trafficLight.py` 指令碼會將連線資訊存放在 `groupCA` 資料夾，系統會在與指令碼相同的資料夾建立這個資料夾。如果您收到連線錯誤，請確定`ggc-host`檔案中的 IP 地址符合核心的 IP 地址端點。

1. 在 AWS IoT 主控台中，選擇您的 AWS IoT Greengrass 群組，選擇**用戶端裝置**索引標籤，然後選擇 **GG\$1TrafficLight** 以開啟用戶端裝置的 AWS IoT 物件詳細資訊頁面。

1. 選擇**裝置影子**索引標籤。在 GG\$1Switch 變更狀態之後，此影子不應有任何更新。這是因為 GG\$1TrafficLight 設定為**停用與雲端的陰影同步**。

1. C 在 GG\$1Switch (`lightController.py`) 用戶端裝置視窗中按下 Ctrl \$1。您應該會看到 GG\$1TrafficLight (`trafficLight.py`) 視窗停止接收狀態變更訊息。

   將這些視窗保持開啟，讓您可以在下一個區段中執行命令。

# 測試通訊 (啟用裝置同步)
<a name="comms-enabled"></a>

對於此測試，您將 GG\$1TrafficLight 裝置陰影設定為與 AWS IoT同步。您執行的命令與在之前測試中的命令相同，但此次雲端中的陰影狀態會在 GG\$1Switch 傳送更新請求時更新。

1. 在 AWS IoT 主控台中，選擇您的 AWS IoT Greengrass 群組，然後選擇**用戶端裝置**索引標籤。

1. 選取 GG\$1TrafficLight 裝置，選擇**同步陰影**，然後選擇**啟用與雲端的陰影同步**。

   您應該會收到裝置影子同步狀態已更新的通知。

1. <a name="console-actions-deploy"></a>在群組組態頁面上，選擇**部署**。

1. 在兩個命令列視窗中，針對 [GG\$1Switch](comms-disabled.md#run-switch-device) 和 [GG\$1TrafficLight](comms-disabled.md#run-trafficlight-device) 用戶端裝置執行先前測試的命令。

1. 現在，在 AWS IoT 主控台中檢查陰影狀態。選擇您的 AWS IoT Greengrass 群組，選擇**用戶端裝置**索引標籤，選擇 **GG\$1TrafficLight**，選擇**裝置影子**索引標籤，然後選擇 **Classic Shadow**。

   由於您已啟用 GG\$1TrafficLight 陰影的同步 AWS IoT，因此每當 GG\$1Switch 傳送更新時，應該更新雲端中的陰影狀態。此功能可用來公開用戶端裝置的狀態 AWS IoT。
**注意**  
如有必要，您可以透過檢視 AWS IoT Greengrass 核心日誌來疑難排解問題，特別是 `runtime.log`：  

   ```
   cd /greengrass/ggc/var/log
   sudo cat system/runtime.log | more
   ```
 您也可以檢視 `GGShadowSyncManager.log` 和 `GGShadowService.log`。如需詳細資訊，請參閱[故障診斷 AWS IoT Greengrass](gg-troubleshooting.md)。

保持設定用戶端裝置和訂閱。您會在下一個模組中用到它們。您也可以執行相同的命令。