测试客户端设备通信 - AWS IoT Greengrass

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

测试客户端设备通信

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

客户端设备仅能发现您与之关联的核心设备。在测试客户端设备与核心设备之间的通信之前,必须将客户端设备与核心设备相关联。有关更多信息,请参阅 关联客户端设备

Greengrass Discovery API 会返回您指定的核心设备 MQTT 代理端点。您可以使用 IP 检测器组件为您管理这些端点,也可以手动管理每台核心设备的端点。有关更多信息,请参阅 管理核心设备端点

注意

要使用 Greengrass Discovery API,客户端设备必须拥有 greengrass:Discover 权限。有关更多信息,请参阅 针对客户端设备的最低 AWS IoT 政策

AWS IoT Device SDK 有多种编程语言。有关更多信息,请参阅AWS IoT Core 开发人员指南中的 AWS IoT Device 软件开发工具包

测试通信(Python)

在本节中,您将使用适用于 Python 的 AWS IoT Device SDK v2 中的 Greengrass Discovery 示例来测试客户端设备与核心设备之间的通信。

重要

要使用适用于 Python 的 AWS IoT Device SDK v2,设备必须使用 Python 3.6 或更高版本。

测试通信(适用于 Python 的 AWS IoT Device SDK v2)
  1. 下载适用于 Python 的 AWS IoT Device SDK v2 并将其安装到要作为客户端设备连接的 AWS IoT 事物上。

    在客户端设备上,执行以下操作:

    1. 克隆适用于 Python 的 AWS IoT Device SDK v2 存储库以将其下载。

      git clone https://github.com/aws/aws-iot-device-sdk-python-v2.git
    2. 安装适用于 Python 的 AWS IoT Device SDK v2。

      python3 -m pip install --user ./aws-iot-device-sdk-python-v2
  2. 更改为适用于 Python 的 AWS IoT Device SDK v2 中的示例文件夹。

    cd aws-iot-device-sdk-python-v2/samples/greengrass
  3. 运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题和消息以及用于验证和保护连接的证书的参数。以下示例向 clients/MyClientDevice1/hello/world 主题发送“Hello World”消息。

    • myClientDevice1 替换为客户端设备的事物名称。

    • ~/certs/AmazonRootCA1.pem 替换为客户端设备上的 Amazon 根 CA 证书的路径。

    • ~/certs/device.pem.crt 替换为客户端设备上的设备证书的路径。

    • ~/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

    发现示例应用程序发送消息 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}'

    如果应用程序输出的是错误,请参阅 Greengrass 发现问题疑难解答

    您还可以查看核心设备上的 Greengrass 日志,以验证客户端设备是否成功连接和发送消息。有关更多信息,请参阅 监控 AWS IoT Greengrass 日志

测试通信(C++)

在本节中,您将使用适用于 C++ 的 AWS IoT Device SDK v2 中的 Greengrass Discovery 示例来测试客户端设备与核心设备之间的通信。

要构建适用于 C++ 的 AWS IoT Device SDK v2,设备必须具有以下工具:

  • C++ 11 或更高版本

  • CMake 3.1 或更高版本

  • 以下编译器之一:

    • GCC 4.8 或更高版本

    • Clang 3.9 或更高版本

    • MSVC 2015 或更高版本

测试通信(适用于 C++ 的 AWS IoT Device SDK v2)
  1. 下载适用于 C++ 的 AWS IoT Device SDK v2 并将其构建至要作为客户端设备连接的 AWS IoT 事物上。

    在客户端设备上,执行以下操作:

    1. 为适用于 C++ 的 AWS IoT Device SDK v2 工作区创建一个文件夹,然后更改为该文件夹。

      cd mkdir iot-device-sdk-cpp cd iot-device-sdk-cpp
    2. 克隆适用于 C++ 的 AWS IoT Device SDK v2 存储库以将其下载。--recursive 标记指定下载子模块。

      git clone --recursive https://github.com/aws/aws-iot-device-sdk-cpp-v2.git
    3. 为适用于 C++ 的 AWS IoT Device SDK v2 构建输出创建一个文件夹,然后更改为该文件夹。

      mkdir aws-iot-device-sdk-cpp-v2-build cd aws-iot-device-sdk-cpp-v2-build
    4. 构建适用于 C++ 的 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
  2. 在适用于 C++ 的 AWS IoT Device SDK v2 中构建 Greengrass Discovery 示例应用程序。执行以下操作:

    1. 更改为适用于 C++ 的 AWS IoT Device SDK v2 中的 Greengrass Discovery 示例文件夹。

      cd ../aws-iot-device-sdk-cpp-v2/samples/greengrass/basic_discovery
    2. 为 Greengrass Discovery 示例构建输出创建一个文件夹,然后更改为该文件夹。

      mkdir build cd build
    3. 构建 Greengrass Discovery 示例应用程序。

      cmake -DCMAKE_PREFIX_PATH="~/iot-device-sdk-cpp" -DCMAKE_BUILD_TYPE="Release" .. cmake --build . --config "Release"
  3. 运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题以及用于验证和保护连接的证书的参数。以下示例订阅了 clients/MyClientDevice1/hello/world 主题,并将您在命令行中输入的消息发布至同一主题。

    • myClientDevice1 替换为客户端设备的事物名称。

    • ~/certs/AmazonRootCA1.pem 替换为客户端设备上的 Amazon 根 CA 证书的路径。

    • ~/certs/device.pem.crt 替换为客户端设备上的设备证书的路径。

    • ~/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

    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.

    如果应用程序输出的是错误,请参阅 Greengrass 发现问题疑难解答

  4. 输入一条消息,例如 Hello World!

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

    如果输出显示应用程序收到了有关该主题的 MQTT 消息,则客户端设备可以成功地与核心设备通信。

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

    您还可以查看核心设备上的 Greengrass 日志,以验证客户端设备是否成功连接和发送消息。有关更多信息,请参阅 监控 AWS IoT Greengrass 日志

测试通信(JavaScript)

在本节中,您将使用适用于 JavaScript 的 AWS IoT Device SDK v2 中的 Greengrass Discovery 示例来测试客户端设备与核心设备之间的通信。

重要

要使用适用于 JavaScript 的 AWS IoT Device SDK v2,设备必须运行 Node v10.0 或更高版本。

测试通信(适用于 JavaScript 的 AWS IoT Device SDK v2)
  1. 下载适用于 JavaScript 的 AWS IoT Device SDK v2 并将其安装到要作为客户端设备连接的 AWS IoT 事物上。

    在客户端设备上,执行以下操作:

    1. 克隆适用于 JavaScript 的 AWS IoT Device SDK v2 存储库以将其下载。

      git clone https://github.com/aws/aws-iot-device-sdk-js-v2.git
    2. 安装适用于 JavaScript 的 AWS IoT Device SDK V2

      cd aws-iot-device-sdk-js-v2 npm install
  2. 更改为适用于 JavaScript 的 AWS IoT Device SDK v2 中的 Greengrass Discovery 示例文件夹。

    cd samples/node/greengrass/basic_discovery
  3. 安装 Greengrass Discovery 示例应用程序。

    npm install
  4. 运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题和消息以及用于验证和保护连接的证书的参数。以下示例向 clients/MyClientDevice1/hello/world 主题发送“Hello World”消息。

    • myClientDevice1 替换为客户端设备的事物名称。

    • ~/certs/AmazonRootCA1.pem 替换为客户端设备上的 Amazon 根 CA 证书的路径。

    • ~/certs/device.pem.crt 替换为客户端设备上的设备证书的路径。

    • ~/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

    发现示例应用程序发送消息 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!

    如果应用程序输出的是错误,请参阅 Greengrass 发现问题疑难解答

    您还可以查看核心设备上的 Greengrass 日志,以验证客户端设备是否成功连接和发送消息。有关更多信息,请参阅 监控 AWS IoT Greengrass 日志

测试通信(Java)

在本节中,您将使用适用于 Java 的 AWS IoT Device SDK 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 SDK v2 并将其构建至要作为客户端设备连接的 AWS IoT 事物上。

    在客户端设备上,执行以下操作:

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

      git clone https://github.com/aws/aws-iot-device-sdk-java-v2.git
    2. 更换至适用于 Java 的 AWS IoT Device SDK v2 文件夹。

    3. 构建适用于 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
  2. 运行示例 Greengrass Discovery 应用程序。此应用程序需要指定客户端设备事物名称、要使用的 MQTT 主题以及用于验证和保护连接的证书的参数。以下示例订阅了 clients/MyClientDevice1/hello/world 主题,并将您在命令行中输入的消息发布至同一主题。

    • myClientDevice1 的两个实例替换为客户端设备的事物名称。

    • $HOME/certs/AmazonRootCA1.pem 替换为客户端设备上的 Amazon 根 CA 证书的路径。

    • $HOME/certs/device.pem.crt 替换为客户端设备上的设备证书的路径。

    • $HOME/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"

    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:

    如果应用程序输出的是错误,请参阅 Greengrass 发现问题疑难解答

  3. 输入一条消息,例如 Hello World!

    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!

    如果输出显示应用程序收到了有关该主题的 MQTT 消息,则客户端设备可以成功地与核心设备通信。

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

    您还可以查看核心设备上的 Greengrass 日志,以验证客户端设备是否成功连接和发送消息。有关更多信息,请参阅 监控 AWS IoT Greengrass 日志