

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

# 测试客户端设备通信
<a name="test-client-device-communications"></a>

客户端设备可以使用 AWS IoT Device SDK 来发现、连接核心设备并与之通信。您可以使用中的 Greengrass 发现客户端 AWS IoT Device SDK 来使用 Greengras [s 发现 API，它会返回有关客户端设备](greengrass-discover-api.md)可以连接的核心设备的信息。API 响应包括要连接的 MQTT 代理端点和用于验证每台核心设备身份的证书。然后，客户端设备可以尝试连接每个端点，直至其成功连接核心设备。

客户端设备仅能发现您与之关联的核心设备。在测试客户端设备与核心设备之间的通信之前，必须将客户端设备与核心设备相关联。有关更多信息，请参阅 [关联客户端设备](associate-client-devices.md)。

Greengrass Discovery API 会返回您指定的核心设备 MQTT 代理端点。您可以使用 [IP 检测器组件](ip-detector-component.md)为您管理这些端点，也可以手动管理每台核心设备的端点。有关更多信息，请参阅 [管理核心设备端点](manage-core-device-endpoints.md)。

**注意**  
要使用 Greengrass Discovery API，客户端设备必须拥有 `greengrass:Discover` 权限。有关更多信息，请参阅 [客户端设备的最低 AWS IoT 政策](device-auth.md#client-device-minimal-iot-policy)。

 AWS IoT Device SDK 有多种编程语言版本。有关更多信息，请参阅《*AWS IoT Core 开发者指南*》 SDKs中的[AWS IoT 设备](https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html)。

**Topics**
+ [测试通信（Python）](#test-client-device-communications-python)
+ [测试通信（C\$1\$1）](#test-client-device-communications-cpp)
+ [测试通信 (JavaScript)](#test-client-device-communications-javascript)
+ [测试通信（Java）](#test-client-device-communications-java)

## 测试通信（Python）
<a name="test-client-device-communications-python"></a>

在本节中，您将使用[适用于 Python 的AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-python-v2) 中的 Greengrass Discovery 示例来测试客户端设备与核心设备之间的通信。

**重要**  
要使用适用于 Python 的 AWS IoT Device SDK v2，设备必须运行 Python 3.6 或更高版本。

**测试通信（适用于 Python 的AWS IoT Device SDK v2）**

1. <a name="download-iot-device-sdk-python-v2"></a>下载[适用于 Python 的AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-python-v2) 并将其安装到要作为客户端设备连接的设备上。 AWS IoT 

   在客户端设备上，执行以下操作：

   1. 克隆适用于 Python 的 AWS IoT Device SDK v2 版本库进行下载。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git
      ```

   1. 安装适用于 Python 的 AWS IoT Device SDK v2。

      ```
      python3 -m pip install --user ./aws-iot-device-sdk-python-v2
      ```

1. <a name="cd-iot-device-sdk-python-v2"></a>在 python 版 AWS IoT Device SDK v2 中切换到示例文件夹。

   ```
   cd aws-iot-device-sdk-python-v2/samples/greengrass
   ```

1. <a name="test-client-device-communications-application-intro"></a>运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题和消息以及用于验证和保护连接的证书的参数。以下示例向 `clients/MyClientDevice1/hello/world` 主题发送“Hello World”消息。<a name="test-client-device-communications-application-command-replace"></a>
   + *MyClientDevice1*替换为客户端设备的事物名称。
   + *\$1/certs/AmazonRootCA1.pem*替换为客户端设备上的 Amazon 根 CA 证书的路径。
   + *\$1/certs/device.pem.crt*替换为客户端设备上设备证书的路径。
   + *\$1/certs/private.pem.key*替换为客户端设备上私钥文件的路径。
   + *us-east-1*替换为您的客户端设备和核心设备运行的地 AWS 区。

   ```
   python3 basic_discovery.py \\
     --thing_name MyClientDevice1 \\
     --topic 'clients/MyClientDevice1/hello/world' \\
     --message 'Hello World!' \\
     --ca_file ~/certs/AmazonRootCA1.pem \\
     --cert ~/certs/device.pem.crt \\
     --key ~/certs/private.pem.key \\
     --region us-east-1 \\
     --verbosity Warn
   ```

   <a name="test-client-device-communications-application-output-intro"></a>发现示例应用程序发送消息 10 次并断开连接。它还订阅在其中发布消息的同一主题。如果输出显示应用程序收到了有关该主题的 MQTT 消息，则客户端设备可以成功地与核心设备通信。

   ```
   Performing greengrass discovery...
   awsiot.greengrass_discovery.DiscoverResponse(gg_groups=[awsiot.greengrass_discovery.GGGroup(gg_group_id='greengrassV2-coreDevice-MyGreengrassCore', cores=[awsiot.greengrass_discovery.GGCore(thing_arn='arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore', connectivity=[awsiot.greengrass_discovery.ConnectivityInfo(id='203.0.113.0', host_address='203.0.113.0', metadata='', port=8883)])], certificate_authorities=['-----BEGIN CERTIFICATE-----\
   MIICiT...EXAMPLE=\
   -----END CERTIFICATE-----\
   '])])
   Trying core arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore at host 203.0.113.0 port 8883
   Connected!
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 0}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 0}'
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 1}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 1}'
   
   ...
   
   Published topic clients/MyClientDevice1/hello/world: {"message": "Hello World!", "sequence": 9}
   
   Publish received on topic clients/MyClientDevice1/hello/world
   b'{"message": "Hello World!", "sequence": 9}'
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果应用程序输出的是错误，请参阅 [Greengrass 发现问题疑难解答](troubleshooting-client-devices.md#greengrass-discovery-issues)。

   <a name="test-client-device-communications-application-view-core-logs"></a>您还可以查看核心设备上的 Greengrass 日志，以验证客户端设备是否成功连接和发送消息。有关更多信息，请参阅 [监控 AWS IoT Greengrass 日志](monitor-logs.md)。

## 测试通信（C\$1\$1）
<a name="test-client-device-communications-cpp"></a>

在本节中，您将使用[适用于 C\$1\$1 的AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2) 中的 Greengrass Discovery 示例来测试客户端设备与核心设备之间的通信。

<a name="iot-device-sdk-cpp-v2-build-requirements-intro"></a>要构建 C\$1\$1 版 AWS IoT Device SDK v2，设备必须具有以下工具：<a name="iot-device-sdk-cpp-v2-build-requirements"></a>
+ C\$1\$1 11 或更高版本
+ CMake 3.1 或更高版本
+ 以下编译器之一：
  + GCC 4.8 或更高版本
  + Clang 3.9 或更高版本
  + MSVC 2015 或更高版本

**测试通信（适用于 C\$1\$1 的AWS IoT Device SDK v2）**

1. 下载并构建 [C\$1\$1 版AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2) 以 AWS IoT 将其作为客户端设备进行连接。

   在客户端设备上，执行以下操作：

   1. 为 AWS IoT Device SDK v2 for C\$1\$1 工作区创建一个文件夹，然后更改为该文件夹。

      ```
      cd
      mkdir iot-device-sdk-cpp
      cd iot-device-sdk-cpp
      ```

   1. 克隆适用于 C\$1\$1 的 AWS IoT Device SDK v2 存储库进行下载。`--recursive` 标记指定下载子模块。

      ```
      git clone --recursive https://github.com/aws/aws-iot-device-sdk-cpp-v2.git
      ```

   1. 为 AWS IoT Device SDK v2 for C\$1\$1 编译输出创建一个文件夹，然后更改为该文件夹。

      ```
      mkdir aws-iot-device-sdk-cpp-v2-build
      cd aws-iot-device-sdk-cpp-v2-build
      ```

   1. 为 C\$1\$1 构建 AWS IoT Device SDK v2。

      ```
      cmake -DCMAKE_INSTALL_PREFIX="~/iot-device-sdk-cpp" -DCMAKE_BUILD_TYPE="Release" ../aws-iot-device-sdk-cpp-v2
      cmake --build . --target install
      ```

1. 在 v2 中构建 C\$1\$1 版 Greengrass 发现示例应用程序。 AWS IoT Device SDK 执行以下操作：

   1. 切换到 C\$1\$1 版 v2 中的 Greengrass 发现示例文件夹。 AWS IoT Device SDK 

      ```
      cd ../aws-iot-device-sdk-cpp-v2/samples/greengrass/basic_discovery
      ```

   1. 为 Greengrass Discovery 示例构建输出创建一个文件夹，然后更改为该文件夹。

      ```
      mkdir build
      cd build
      ```

   1. 构建 Greengrass Discovery 示例应用程序。

      ```
      cmake -DCMAKE_PREFIX_PATH="~/iot-device-sdk-cpp" -DCMAKE_BUILD_TYPE="Release" ..
      cmake --build . --config "Release"
      ```

1. <a name="test-client-device-communications-application-scanner-intro"></a>运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题以及用于验证和保护连接的证书的参数。以下示例订阅了 `clients/MyClientDevice1/hello/world` 主题，并将您在命令行中输入的消息发布至同一主题。<a name="test-client-device-communications-application-command-replace"></a>
   + *MyClientDevice1*替换为客户端设备的事物名称。
   + *\$1/certs/AmazonRootCA1.pem*替换为客户端设备上的 Amazon 根 CA 证书的路径。
   + *\$1/certs/device.pem.crt*替换为客户端设备上设备证书的路径。
   + *\$1/certs/private.pem.key*替换为客户端设备上私钥文件的路径。
   + *us-east-1*替换为您的客户端设备和核心设备运行的地 AWS 区。

   ```
   ./basic-discovery \
     --thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --ca_file ~/certs/AmazonRootCA1.pem \
     --cert ~/certs/device.pem.crt \
     --key ~/certs/private.pem.key \
     --region us-east-1
   ```

   <a name="test-client-device-communications-application-scanner-output-intro"></a>Discovery 示例应用程序订阅主题并提示您输入要发布的消息。

   ```
   Connecting to group greengrassV2-coreDevice-MyGreengrassCore with thing arn arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore, using endpoint 203.0.113.0:8883
   Connected to group greengrassV2-coreDevice-MyGreengrassCore, using connection to 203.0.113.0:8883
   Successfully subscribed to clients/MyClientDevice1/hello/world
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press enter. Enter 'exit' to exit this program.
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果应用程序输出的是错误，请参阅 [Greengrass 发现问题疑难解答](troubleshooting-client-devices.md#greengrass-discovery-issues)。

1. <a name="test-client-device-communications-application-scanner-input"></a>输入一条消息，例如 **Hello World\$1**。

   ```
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press enter. Enter 'exit' to exit this program.
   Hello World!
   ```

   <a name="test-client-device-communications-application-scanner-input-output"></a>如果输出显示应用程序收到了有关该主题的 MQTT 消息，则客户端设备可以成功地与核心设备通信。

   ```
   Operation on packetId 2 Succeeded
   Publish received on topic clients/MyClientDevice1/hello/world
   Message:
   Hello World!
   ```

   <a name="test-client-device-communications-application-view-core-logs"></a>您还可以查看核心设备上的 Greengrass 日志，以验证客户端设备是否成功连接和发送消息。有关更多信息，请参阅 [监控 AWS IoT Greengrass 日志](monitor-logs.md)。

## 测试通信 (JavaScript)
<a name="test-client-device-communications-javascript"></a>

在本节中，您将使用 [v2 JavaScript](https://github.com/aws/aws-iot-device-sdk-js-v2) 中的AWS IoT Device SDK Greengrass 发现示例来测试客户端设备与核心设备之间的通信。

**重要**  
要将 AWS IoT Device SDK v2 用于 JavaScript，设备必须运行 Node v10.0 或更高版本。

**测试通信（AWS IoT Device SDK v2 适用于 JavaScript）**

1. 下载并安装该设备[的AWS IoT Device SDK JavaScript v2](https://github.com/aws/aws-iot-device-sdk-js-v2) 以作为客户端设备进行连接。 AWS IoT 

   在客户端设备上，执行以下操作：

   1. 克隆 AWS IoT Device SDK v2 以供 JavaScript 存储库下载。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-js-v2.git
      ```

   1. 安装适用的 AWS IoT Device SDK v2。 JavaScript

      ```
      cd aws-iot-device-sdk-js-v2
      npm install
      ```

1. 切换到 v2 中的 Greengrass 发现示例文件夹。 AWS IoT Device SDK JavaScript

   ```
   cd samples/node/greengrass/basic_discovery
   ```

1. 安装 Greengrass Discovery 示例应用程序。

   ```
   npm install
   ```

1. <a name="test-client-device-communications-application-intro"></a>运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题和消息以及用于验证和保护连接的证书的参数。以下示例向 `clients/MyClientDevice1/hello/world` 主题发送“Hello World”消息。<a name="test-client-device-communications-application-command-replace"></a>
   + *MyClientDevice1*替换为客户端设备的事物名称。
   + *\$1/certs/AmazonRootCA1.pem*替换为客户端设备上的 Amazon 根 CA 证书的路径。
   + *\$1/certs/device.pem.crt*替换为客户端设备上设备证书的路径。
   + *\$1/certs/private.pem.key*替换为客户端设备上私钥文件的路径。
   + *us-east-1*替换为您的客户端设备和核心设备运行的地 AWS 区。

   ```
   node dist/index.js \
     --thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --message 'Hello World!' \
     --ca_file ~/certs/AmazonRootCA1.pem \
     --cert ~/certs/device.pem.crt \
     --key ~/certs/private.pem.key \
     --region us-east-1 \
     --verbose warn
   ```

   <a name="test-client-device-communications-application-output-intro"></a>发现示例应用程序发送消息 10 次并断开连接。它还订阅在其中发布消息的同一主题。如果输出显示应用程序收到了有关该主题的 MQTT 消息，则客户端设备可以成功地与核心设备通信。

   ```
   Discovery Response:
   {"gg_groups":[{"gg_group_id":"greengrassV2-coreDevice-MyGreengrassCore","cores":[{"thing_arn":"arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore","connectivity":[{"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}]}],"certificate_authorities":["-----BEGIN CERTIFICATE-----\nMIICiT...EXAMPLE=\n-----END CERTIFICATE-----\n"]}]}
   Trying endpoint={"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}
   [WARN] [2021-06-12T00:46:45Z] [00007f90c0e8d700] [socket] - id=0x7f90b8018710 fd=26: setsockopt() for NO_SIGNAL failed with errno 92. If you are having SIGPIPE signals thrown, you may want to install a signal trap in your application layer.
   Connected to endpoint={"id":"203.0.113.0","host_address":"203.0.113.0","port":8883,"metadata":""}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":1}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":2}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":3}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":4}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":5}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":6}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":7}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":8}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":9}
   Publish received. topic:"clients/MyClientDevice1/hello/world" dup:false qos:0 retain:false
   {"message":"Hello World!","sequence":10}
   Complete!
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果应用程序输出的是错误，请参阅 [Greengrass 发现问题疑难解答](troubleshooting-client-devices.md#greengrass-discovery-issues)。

   <a name="test-client-device-communications-application-view-core-logs"></a>您还可以查看核心设备上的 Greengrass 日志，以验证客户端设备是否成功连接和发送消息。有关更多信息，请参阅 [监控 AWS IoT Greengrass 日志](monitor-logs.md)。

## 测试通信（Java）
<a name="test-client-device-communications-java"></a>

在本节中，您将使用[适用于 Java 的AWS IoT Device SDK v2](https://github.com/aws/aws-iot-device-sdk-java-v2) 中的 Greengrass Discovery 示例来测试客户端设备与核心设备之间的通信。

**重要**  
要构建 Java 版 AWS IoT Device SDK v2，设备必须具有以下工具：  
Java 8 或更高版本，`JAVA_HOME` 指向 Java 文件夹。
Apache Maven

**测试通信（适用于 Java 的AWS IoT Device SDK v2）**

1. 下载并编译[适用于 Java 的AWS IoT Device SDKAWS IoT v2](https://github.com/aws/aws-iot-device-sdk-java-v2)，将其作为客户端设备进行连接。

   在客户端设备上，执行以下操作：

   1. 克隆适用于 Java 的 AWS IoT Device SDK v2 存储库进行下载。

      ```
      git clone https://github.com/aws/aws-iot-device-sdk-java-v2.git
      ```

   1. 切换到适用于 Java 的 AWS IoT Device SDK v2 文件夹。

   1. 编译适用于 Java 的 AWS IoT Device SDK v2。

      ```
      cd aws-iot-device-sdk-java-v2
      mvn versions:use-latest-versions -Dincludes="software.amazon.awssdk.crt*"
      mvn clean install
      ```

1. <a name="test-client-device-communications-application-scanner-intro"></a>运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题以及用于验证和保护连接的证书的参数。以下示例订阅了 `clients/MyClientDevice1/hello/world` 主题，并将您在命令行中输入的消息发布至同一主题。<a name="test-client-device-communications-application-command-replace"></a>
   + 将的*MyClientDevice1*两个实例替换为客户端设备的事物名称。
   + *\$1HOME/certs/AmazonRootCA1.pem*替换为客户端设备上的 Amazon 根 CA 证书的路径。
   + *\$1HOME/certs/device.pem.crt*替换为客户端设备上设备证书的路径。
   + *\$1HOME/certs/private.pem.key*替换为客户端设备上私钥文件的路径。
   + *us-east-1*替换为客户端设备和核心设备的运行 AWS 区域 位置。

   ```
   DISCOVERY_SAMPLE_ARGS="--thing_name MyClientDevice1 \
     --topic 'clients/MyClientDevice1/hello/world' \
     --ca_file $HOME/certs/AmazonRootCA1.pem \
     --cert $HOME/certs/device.pem.crt \
     --key $HOME/certs/private.pem.key \
     --region us-east-1"
   
   mvn exec:java -pl samples/Greengrass/Discovery \
     -Dexec.mainClass=greengrass.BasicDiscovery \
     -Dexec.args="$DISCOVERY_SAMPLE_ARGS"
   ```

   <a name="test-client-device-communications-application-scanner-output-intro"></a>Discovery 示例应用程序订阅主题并提示您输入要发布的消息。

   ```
   Connecting to group ID greengrassV2-coreDevice-MyGreengrassCore, with thing arn arn:aws:iot:us-east-1:123456789012:thing/MyGreengrassCore, using endpoint 203.0.113.0:8883
   Started a clean session
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press Enter. Type 'exit' or 'quit' to exit this program:
   ```

   <a name="test-client-device-communications-application-troubleshooting"></a>如果应用程序输出的是错误，请参阅 [Greengrass 发现问题疑难解答](troubleshooting-client-devices.md#greengrass-discovery-issues)。

1. <a name="test-client-device-communications-application-scanner-input"></a>输入一条消息，例如 **Hello World\$1**。

   ```
   Enter the message you want to publish to topic clients/MyClientDevice1/hello/world and press Enter. Type 'exit' or 'quit' to exit this program:
   Hello World!
   ```

   <a name="test-client-device-communications-application-scanner-input-output"></a>如果输出显示应用程序收到了有关该主题的 MQTT 消息，则客户端设备可以成功地与核心设备通信。

   ```
   Message received on topic clients/MyClientDevice1/hello/world: Hello World!
   ```

   <a name="test-client-device-communications-application-view-core-logs"></a>您还可以查看核心设备上的 Greengrass 日志，以验证客户端设备是否成功连接和发送消息。有关更多信息，请参阅 [监控 AWS IoT Greengrass 日志](monitor-logs.md)。