

终止支持通知：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)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 模块 5：与设备影子交互
<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 core 连接到红绿灯设备 shadow 和灯光开关设备。\]](http://docs.aws.amazon.com/zh_cn/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的 Device Shadow 服务](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. 对于**目标类型**，选择**服务**，然后选择**本地影子服务**。

   1. 对于 **Topic filter (主题筛选条件)**，输入 **\$1aws/things/GG\$1TrafficLight/shadow/update**。

   1. 选择**创建订阅**。

   主题的输入方式必须与表中所示完全相同。尽管可以使用通配符来整合一些订阅，但我们不建议这种做法。有关更多信息，请参阅 *AWS IoT 开发人员指南*中的[影子 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_cn/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. 在**系统 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 适用于 Python 的](IoT-SDK.md)中的步骤 1。

   客户端设备使用此 SDK 与核心设备通信， AWS IoT 以及与 AWS IoT Greengrass 核心设备通信。

1. 从 ex [ TrafficLight](https://github.com/aws/aws-greengrass-core-sdk-python/tree/master/examples/TrafficLight)amples 文件夹中 GitHub，将`lightController.py`和`trafficLight.py`文件下载到您的计算机。将它们保存在包含 GG\$1Switch 和 GG\$1 TrafficLight 客户端设备证书和密钥的文件夹中。

   该`lightController.py`脚本对应于 GG\$1Switch 客户端设备，`trafficLight.py`脚本对应于 GG\$1 TrafficLight 客户端设备。  
![\[包含两个 Python 脚本以及设备证书和密钥的文件的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-082.png)
**注意**  
为方便起见，示例 Python 文件存储在适用于 Python 的 AWS IoT Greengrass 核心 SDK 存储库中，但它们不使用 AWS IoT Greengrass 核心 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_cn/greengrass/v1/developerguide/images/gg-get-started-075.5.png)
**注意**  
如果您无法 ping 正在运行的实例 AWS IoT Greengrass，请确保该 EC2 实例的入站安全组规则允许 [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 防火墙应用程序中，您可能还需要启用允许入站回显请求的入站规则（例如，**文件和打印机共享（Echo Request- 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\$1 TrafficLight 客户端设备。

   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\$1 TrafficLight 客户端设备窗口中，运行以下命令。
      + *path-to-certs-folder*替换为包含证书、密钥和 Python 文件的文件夹的路径。
      + 替换*AWS\$1IOT\$1ENDPOINT*为您的终端节点。
      + 将这两个*lightCertId*实例替换为您的 GG\$1 TrafficLight 客户端设备文件名中的证书 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_cn/greengrass/v1/developerguide/images/gg-get-started-083.png)

      GG\$1 TrafficLight 输出：  
![\[与 GG_ TrafficLight 关联的输出的屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/greengrass/v1/developerguide/images/gg-get-started-084.png)

   首次执行时，每个客户端设备脚本都会运行 AWS IoT Greengrass 发现服务以连接到 AWS IoT Greengrass 核心（通过 Internet）。在客户机设备发现并成功连接到 AWS IoT Greengrass 核心之后，可以在本地执行 future 操作。
**注意**  
<a name="check-connection-info"></a> `lightController.py` 和 `trafficLight.py` 脚本将连接信息存储在 `groupCA` 文件夹中，该文件夹与脚本在同一文件夹中创建。如果您收到连接错误，请确保 `ggc-host` 文件中的 IP 地址与您在此步骤中为核心配置的单个 IP 地址端点匹配。

1. 在 AWS IoT 控制台中，选择您的 AWS IoT Greengrass 群组，选择**客户端设备**选项卡，然后选择 **GG\$1 TrafficLight** 以打开客户端设备 AWS IoT 的事物详细信息页面。

1. 选择**设备影子**选项卡。在 GG\$1Switch 更改状态后，该影子不应有任何更新。这是因为 GG\$1 设置TrafficLight 为**禁用与云的阴影同步**。

1. 在 GG\$1Switch (`lightController.py`) 客户端设备窗口中按 Ctrl \$1 C。您应该看到 GG\$1 TrafficLight (`trafficLight.py`) 窗口停止接收状态更改消息。

   保持这些窗口打开，以便您可以在下一部分中运行这些命令。

# 测试通信 (启用了设备同步)
<a name="comms-enabled"></a>

在此测试中，您需要配置要同步的 GG\$1 TrafficLight 设备影子。 AWS IoT您运行与上一个测试中相同的命令，但这次当 GG\$1Switch 发送更新请求时，云中的影子状态会更新。

1. 在 AWS IoT 控制台中，选择您的 AWS IoT Greengrass 群组，然后选择**客户端设备**选项卡。

1. 选择 GG\$1 TrafficLight 设备，选择 “**同步阴影**”，然后选择 “**启用与云端的阴影同步**”。

   您应该会收到设备影子同步数据已更新的通知。

1. <a name="console-actions-deploy"></a>在组配置页面上，选择**部署**。

1. [在两个命令行窗口中，对 [GG\$1Switch 和 GG\$1](comms-disabled.md#run-switch-device) 客户端设备运行先前测试中的命令。TrafficLight](comms-disabled.md#run-trafficlight-device)

1. 现在，在 AWS IoT 控制台中检查阴影状态。选择您的 AWS IoT Greengrass 群组，选择 “**客户端设备**” 选项卡，选择 **GG\$1 TrafficLight**，选择 “**设备影子**” 选项卡，然后选择 C **lassic Shadow**。

   由于您启用了 GG\$1 TrafficLight 影子同步到的功能 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)。

保持客户端设备和订阅的设置。您将在下一模块中使用它们。您还会运行相同的命令。