

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

# 使用客户端设备设置 Amazon IoT Greengrass 并对其故障排除
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices"></a>

*Marouane Sefiani 和 Akalanka De Silva，Amazon Web Services*

## Summary
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-summary"></a>

Amazon IoT Greengrass 是一种开源边缘运行时和云服务，用于在边缘设备上构建、部署和管理物联网 (IoT) 软件。Amazon IoT Greengrass 用例包括：
+ 智能家居，其中 Amazon IoT Greengrass 网关用作家庭自动化中心
+ 智能工厂，Amazon IoT Greengrass 可以促进车间数据的提取和本地处理

Amazon IoT Greengrass 可以充当其他边缘设备（也称为*客户端设备*）的安全、经过身份验证的 MQTT 连接端点，否则这些设备通常会直接连接到 AWS IoT Core。当客户端设备无法直接通过网络访问 AWS IoT Core 端点时，此功能非常有用。

您可将 Amazon IoT Greengrass 设置为与客户端设备一起使用，用于以下用例：
+ 供客户端设备将数据发送到 Amazon IoT Greengrass
+ 让 Amazon IoT Greengrass 将数据转发至 AWS IoT Core
+ 利用高级 AWS IoT Core 规则引擎功能

这些功能需要在 Amazon IoT Greengrass 设备上安装与配置以下组件：
+ MQTT 代理
+ MQTT 网桥
+ 客户端设备身份验证
+ IP 探测器

此外，来自客户端设备的已发布消息必须采用 JSON 格式或[协议缓冲区 (protobuf)](https://protobuf.dev/) 格式。

本示例介绍了如何安装和配置这些必需的组件，并提供了故障排除提示和最佳实践。

## 先决条件和限制
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ [AWS 命令行界面（AWS CLI）版本 2](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)
+ 两台运行 Python 3.7 或更高版本的客户端设备
+ 一台运行 Java 运行时环境（JRE）版本 8 或更高版本以及 [Amazon Corretto 11](https://aws.amazon.com/corretto/) 或 [OpenJDK 11](https://openjdk.java.net/)的核心设备

**限制**
+ 您必须选择一个提供 AWS IoT Core 的 AWS 区域。有关当前的 AWS IoT Core 区域列表，请参阅[按区域划分的 Amazon Web Services](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。
+ 核心设备必须至少有 172 MB 内存和 512 MB 磁盘空间。

## 架构
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-architecture"></a>

下图显示此模式的解决方案架构。

![\[使用客户端设备设置 Amazon IoT Greengrass 的解决方案架构\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/0656c5ae-d979-4cf7-be92-a46fa81cab0d.png)


此架构包括：
+ 两个客户端设备 每个设备都包含私钥、设备证书以及根证书颁发机构 (CA) 证书。每个客户端设备上还安装了包含 MQTT 客户端的 AWS IoT 设备开发工具包。
+ 部署了 Amazon IoT Greengrass 的核心设备，包含以下组件：
  + MQTT 代理
  + MQTT 网桥
  + 客户端设备身份验证
  + IP 探测器

该架构支持以下场景：
+ 客户端设备可以使用 MQTT 客户端通过核心设备的 MQTT 代理相互通信。
+ 客户设备还可通过核心设备的 MQTT 代理和 MQTT 桥与云中的 AWS IoT Core 通信。
+ 云端的 AWS IoT Core 可通过 MQTT 测试客户端以及核心设备的 MQTT 网桥器和 MQTT 代理向客户端设备发送消息。

有关客户端设备和核心设备之间通信的更多信息，请参阅[其他信息](#set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional)部分。

## 工具
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-tools"></a>

**Amazon Web Services**
+ [Amazon IoT Greengrass](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html) 是一项开源物联网 (IoT) 边缘运行时和云服务，可帮助您在设备上构建、部署和管理 IoT 应用程序。
+ [AWS IoT Core](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html) 为连接互联网的设备提供安全的双向通信，以连接到 Amazon Web Services Cloud。
+ [AWS IoT Device SDK](https://boto3.amazonaws.com/v1/documentation/api/latest/guide/quickstart.html) 是一个软件开发工具包，包括开源库、开发人员指南（含示例）和移植指南，便于您在自己选择的硬件平台上构建创新的 IoT 产品或解决方案。
+ [AWS Identity and Access Management (AWS IAM) ](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)通过控制验证和授权使用您 AWS 资源的用户，帮助您安全地管理对您 AWS 资源的访问。

## 最佳实践
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-best-practices"></a>
+ 来自客户端设备的消息负载应采用 JSON 或 Protobuf 格式，以便利用 AWS IoT Core 规则引擎的高级功能，例如转换和条件操作。
+ 配置 MQTT 巧劲儿以允许双向通信。
+ 在 Amazon IoT Greengrass 中配置和部署 IP 检测器组件，以确保核心设备的 IP 地址包含在 MQTT 代理证书的使用者备用名称 (SAN) 字段中。

## 操作说明
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-epics"></a>

### 设置核心设备
<a name="set-up-the-core-device"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在您的核心设备设置 Amazon IoT Greengrass。 | 按照[开发人员指南](https://docs.aws.amazon.com/greengrass/v2/developerguide/install-greengrass-core-v2.html)中的说明安装 Amazon IoT Greengrass Core 软件。 | Amazon IoT Greengrass | 
| 检查安装状态。 | 使用以下命令检查核心设备上 Amazon IoT Greengrass 服务的状态：<pre>sudo systemctl status greengrass.service</pre>命令预期输出是：<pre>Launched Nucleus successfully</pre> | 常规 AWS | 
| 设置 IAM policy 并将其附加至 Greengrass 服务角色。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | 常规 AWS | 
| 在 Amazon IoT Greengrass 核心设备中配置和部署所需组件。 | 配置与部署以下组件：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | Amazon IoT Greengrass | 
| 确认 MQTT 桥允许双向通信。 | 要在客户端设备和 AWS IoT Core 之间中继 MQTT 消息，请配置和部署 MQTT 桥组件并指定要中继的主题。示例如下：<pre>{<br />  "mqttTopicMapping": {<br />    "ClientDevicesToCloud": {<br />      "topic": "dt/#",<br />      "source": "LocalMqtt",<br />      "target": "IotCore"<br />    },<br />    "CloudToClientDevices": {<br />      "topic": "cmd/#",<br />      "source": "IotCore",<br />      "target": "LocalMqtt"<br />    }<br />  }<br />}</pre> | Amazon IoT Greengrass | 
| 确认身份验证组件允许客户端设备连接并发布或订阅主题。 | 以下 `aws.greengrass.clientdevices.Auth` 配置允许所有客户端设备连接、发布消息和订阅所有主题。<pre>{<br />  "deviceGroups": {<br />    "formatVersion": "2021-03-05",<br />    "definitions": {<br />      "MyPermissiveDeviceGroup": {<br />        "selectionRule": "thingName: *",<br />        "policyName": "MyPermissivePolicy"<br />      }<br />    },<br />    "policies": {<br />      "MyPermissivePolicy": {<br />        "AllowAll": {<br />          "statementDescription": "Allow client devices to perform all actions.",<br />          "operations": [<br />            "*"<br />          ],<br />          "resources": [<br />            "*"<br />          ]<br />        }<br />      }<br />    }<br />  }<br />}</pre> | Amazon IoT Greengrass | 

### 设置客户端设备
<a name="set-up-client-devices"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 AWS IoT Device SDK。 | 在客户端设备上安装 AWS IoT 设备软件开发工具包。有关支持的语言和相关语言的完整列表 SDKs，请参阅 [AWS IoT Core 文档](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)。例如，适用于 Python 的 AWS 物联网设备软件开发工具包[位于上 GitHub](https://github.com/aws/aws-iot-device-sdk-python-v2)。若要安装此 SDK，请执行以下操作[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html)或者，您可从源存储库安装 SDK：<pre># Create a workspace directory to hold all the SDK files<br />mkdir sdk-workspace<br />cd sdk-workspace<br /># Clone the repository<br />git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git<br /># Install using Pip (use 'python' instead of 'python3' on Windows)<br />python3 -m pip install ./aws-iot-device-sdk-python-v2</pre> | 常规 AWS IoT | 
| 创建事物。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | AWS IoT Core | 
| 从 Greengrass 核心设备下载 CA 证书。 | 如果您希望 Greengrass 核心设备在离线环境中工作，则必须使 Greengrass 核心 CA 证书可供客户端设备使用，以便客户端设备可以验证 MQTT 代理的证书（由 Greengrass 核心 CA 颁发）。因此，获取此证书副本非常重要。通过以下方法之一下载 CA 证书：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | 常规 AWS | 
| 在客户端设备复制凭证。 | 在客户端设备中复制 Greengrass 核心 CA 证书、设备证书以及私钥。 | 常规 AWS | 
| 将客户端设备与核心设备相关联。 | 将客户端设备与核心设备关联，以便其可以发现核心设备。然后，客户端设备可以使用 [Greengrass 发现 API ](https://docs.aws.amazon.com/greengrass/v2/developerguide/greengrass-discover-api.html)来检索其关联核心设备的连接信息和证书。有关更多信息，请参阅 Amazon IoT Greengrass 文档中的[关联客户端设备](https://docs.aws.amazon.com/greengrass/v2/developerguide/associate-client-devices.html)。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html)您关联的客户端设备现在可使用 Greengrass 发现 API 来发现此核心设备。 | Amazon IoT Greengrass | 

### 发送与接收数据
<a name="send-and-receive-data"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将数据从一个客户端设备发送到另一客户端设备。 | 使用设备中的 MQTT 客户端发布有关 `dt/client1/sensor` 主题的消息。 | 常规 AWS | 
| 将数据从客户端设备发送至 AWS IoT Core。 | 使用设备中的 MQTT 客户端发布有关 `dt/client1/sensor` 主题的消息。在 MQTT 测试客户端中，订阅设备正在发送消息的主题，或订阅 **\$1** 以获取所有主题（查看[详细信息](https://docs.aws.amazon.com/iot/latest/developerguide/view-mqtt-messages.html)）。 | 常规 AWS | 
| 将数据从 AWS IoT Core 发送至客户端设备。 | 在 MQTT 测试客户端页面上，在**发布到主题**选项卡上的**主题名称**字段中，输入您消息的主题名称。在此示例中，使用 `cmd/client1` 作为主题。 | 常规 AWS | 

## 问题排查
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| **无法验证服务器证书错误** | 当 MQTT 客户端无法验证 MQTT 代理在 TLS 握手期间提供的证书时，会出现此错误。最常见的原因是 MQTT 客户端缺失 CA 证书。请按照以下步骤确保将 CA 证书提供给 MQTT 客户端。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices.html) | 
| **无法验证服务器名称错误** | 当 MQTT 客户端无法验证是否连接到正确的服务器时，就会发生此错误。最常见的原因是 Greengrass 设备的 IP 地址未在证书的 SAN 字段中列出。按照前一解决方案中的说明获取 MQTT 代理证书，并验证 SAN 字段是否包含 Amazon IoT Greengrass 设备的 IP 地址，如[其他信息](#set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional)部分所述。如果没有，请确认 IP 检测器组件安装得当，然后重新启动核心设备。 | 
| **仅在从嵌入式客户端设备连接时，无法验证服务器名称** | Mbed TLS 是嵌入式设备中使用的流行 TLS 库，目前仅在证书的 SAN 字段中支持 DNS 名称验证，如 Mbed TLS 库代码所示。由于核心设备没有自己的域名并且依赖于 IP 地址，因此使用 Mbed TLS 的 TLS 客户端将在 TLS 握手期间无法通过服务器名称验证，从而导致连接失败。我们建议您通过 [x509\$1crt\$1check\$1san 函数](https://github.com/Mbed-TLS/mbedtls/blob/6a327a5fdc2786cb50b4dbe5e3a75884a1f8435a/library/x509_crt.c#L2548)将 SAN IP 地址验证添加至 mbed TLS 库中。 | 

## 相关资源
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-resources"></a>
+ [Amazon IoT Greengrass 文档](https://docs.aws.amazon.com/greengrass/v2/developerguide/what-is-iot-greengrass.html)
+ [AWS IoT Core 文档](https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html)
+ [MQTT 代理组件](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-broker-moquette-component.html)
+ [MQTT 网桥组件](https://docs.aws.amazon.com/greengrass/v2/developerguide/mqtt-bridge-component.html)
+ [客户端设备身份验证组件](https://docs.aws.amazon.com/greengrass/v2/developerguide/client-device-auth-component.html)
+ [IP 探测器组件](https://docs.aws.amazon.com/greengrass/v2/developerguide/ip-detector-component.html)
+ [AWS IoT Device SDK](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)
+ 使用 [Amazon IoT Greengrass 实现本地客户端设备](https://aws.amazon.com/blogs/iot/implementing-local-client-devices-with-aws-iot-greengrass/)(AWS Blog 文章)
+ [RFC 5280 — Internet X.509 公钥基础设施证书和证书吊销列表 (CRL) 配置文件](https://www.rfc-editor.org/rfc/rfc5280)

## 附加信息
<a name="set-up-and-troubleshoot-aws-iot-greengrass-with-client-devices-additional"></a>

本节提供有关客户端设备和核心设备之间通信的附加信息。

MQTT 代理在核心设备中的端口 8883 上侦听 TLS 客户端连接尝试。下图显示了 MQTT 代理的服务器证书示例。

![\[MQTT 代理服务器证书示例\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/b2c324a1-60cd-4194-80e7-e5184662146a.png)


示例证书显示以下详细信息：
+ 该证书由 Amazon IoT Greengrass Core CA 颁发，该证书是本地的且特定于核心设备，也就是说，它充当本地 CA。
+ 该证书由客户端身份验证组件每周自动轮换，如下图所示。您可在客户端身份验证组件配置中设置此间隔。

![\[轮换 MQTT 代理服务器证书\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/65bcdc5c-a71c-4f52-adcd-21910fabfc2a.png)

+ 主题备用名称 (SAN) 在 TLS 客户端服务器名称验证中起着至关重要的作用。它可以帮助 TLS 客户端确保它连接到正确的服务器，并有助于避免在 TLS 会话设置期间 man-in-the-middle受到攻击。在示例证书中，SAN 字段表示此服务器正在本地主机 (本地 Unix 域套接字) 上侦听，并且网络接口的 IP 地址为 192.168.1.12。

TLS 客户端在服务器验证期间使用证书中的 SAN 字段来验证它是否正在连接到合法服务器。相比之下，在 HTTP 服务器和浏览器之间的典型 TLS 握手期间，通用名称 (CN) 字段或 SAN 字段中的域名用于在服务器验证过程中交叉检查浏览器实际连接到的域 。如果核心设备没有域名，SAN 字段中包含的 IP 地址也有同样的作用。有关更多信息，请参阅 *RFC 5280 — Internet X.509 公钥基础设施证书和证书吊销*列表 (CRL) 配置文件的[主题备用名称部分](https://www.rfc-editor.org/rfc/rfc5280#section-4.2.1.6)。

Amazon IoT Greengrass 中的 IP 检测器组件可确保证书 SAN 字段中包含正确的 IP 地址。

示例中的证书由充当本地 CA 的 Amazon IoT Greengrass 设备进行签名。TLS 客户端（MQTT 客户端）不知道此 CA，因此我们必须提供如下所示的 CA 证书。

![\[CA 证书示例\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/a340e6ea-dcfa-42a4-a370-c16ee08a6842/images/b08b3bcb-9e12-4f5a-9204-cf65ea32902f.png)
