

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

# 測試用戶端裝置通訊
<a name="test-client-device-communications"></a>

用戶端裝置可以使用 AWS IoT Device SDK 來探索、連線核心裝置，以及與核心裝置通訊。您可以在 中使用 Greengrass 探索用戶端 AWS IoT Device SDK 來使用 [Greengrass 探索 API](greengrass-discover-api.md)，這會傳回用戶端裝置可連線之核心裝置的相關資訊。API 回應包含要連線的 MQTT 代理程式端點，以及用來驗證每個核心裝置的身分的憑證。然後，用戶端裝置可以嘗試每個端點，直到成功連接到核心裝置為止。

用戶端裝置只能探索與之建立關聯的核心裝置。在測試用戶端裝置與核心裝置之間的通訊之前，您必須將用戶端裝置與核心裝置建立關聯。如需詳細資訊，請參閱[關聯用戶端裝置](associate-client-devices.md)。

Greengrass 探索 API 會傳回您指定的核心裝置 MQTT 代理程式端點。您可以使用 [IP 偵測器元件](ip-detector-component.md)來為您管理這些端點，也可以為每個核心裝置手動管理它們。如需詳細資訊，請參閱[管理核心裝置端點](manage-core-device-endpoints.md)。

**注意**  
若要使用 Greengrass 探索 API，用戶端裝置必須具有 `greengrass:Discover`許可。如需詳細資訊，請參閱[用戶端裝置的最低 AWS IoT 政策](device-auth.md#client-device-minimal-iot-policy)。

 AWS IoT Device SDK 提供多種程式設計語言。如需詳細資訊，請參閱《 *AWS IoT Core 開發人員指南*[AWS IoT 》中的 裝置SDKs](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>

在本節中，您會在適用於 [AWS IoT Device SDK Python 的 v2](https://github.com/aws/aws-iot-device-sdk-python-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

**重要**  
若要使用 AWS IoT Device SDK v2 for Python，裝置必須執行 Python 3.6 或更新版本。

**測試通訊 (AWS IoT Device SDK v2 for Python)**

1. <a name="download-iot-device-sdk-python-v2"></a>下載並安裝適用於 [AWS IoT Device SDK Python 的 v2](https://github.com/aws/aws-iot-device-sdk-python-v2) 至 AWS IoT 物件，以做為用戶端裝置進行連線。

   在用戶端裝置上，執行下列動作：

   1. 複製 AWS IoT Device SDK v2 for Python 儲存庫以進行下載。

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

   1. 安裝 AWS IoT Device SDK v2 for Python。

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

1. <a name="cd-iot-device-sdk-python-v2"></a>變更為 AWS IoT Device SDK v2 for Python 中的範例資料夾。

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

1. <a name="test-client-device-communications-application-intro"></a>執行範例 Greengrass 探索應用程式。此應用程式需要指定用戶端裝置物件名稱的引數、要使用的 MQTT 主題和訊息，以及驗證和保護連線的憑證。下列範例會將 Hello World 訊息傳送至 `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 區域。

   ```
   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>

在本節中，您會在適用於 [AWS IoT Device SDK C\$1\$1 的 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

<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. 下載並建置適用於 [AWS IoT Device SDK C\$1\$1 的 v2](https://github.com/aws/aws-iot-device-sdk-cpp-v2) 至 AWS IoT 物件，以做為用戶端裝置進行連線。

   在用戶端裝置上，執行下列動作：

   1. 建立適用於 C\$1\$1 工作區的 AWS IoT Device SDK v2 資料夾，然後變更為該資料夾。

      ```
      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 建立 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. 在適用於 C\$1\$1 的 AWS IoT Device SDK v2 中建置 Greengrass 探索範例應用程式。請執行下列操作：

   1. 變更為適用於 C\$1\$1 的 AWS IoT Device SDK v2 中的 Greengrass 探索範例資料夾。

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

   1. 建立 Greengrass 探索範例建置輸出的資料夾，然後變更為該資料夾。

      ```
      mkdir build
      cd build
      ```

   1. 建置 Greengrass 探索範例應用程式。

      ```
      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 探索應用程式。此應用程式預期引數會指定用戶端裝置物件名稱、要使用的 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>探索範例應用程式會訂閱主題，並提示您輸入要發佈的訊息。

   ```
   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>

在本節中，您會在適用於 [AWS IoT Device SDK JavaScript 的 v2](https://github.com/aws/aws-iot-device-sdk-js-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

**重要**  
若要使用 AWS IoT Device SDK v2 for JavaScript，裝置必須執行 Node v10.0 或更新版本。

**測試通訊 （適用於 JavaScript 的AWS IoT Device SDK v2)**

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 for JavaScript 儲存庫以進行下載。

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

   1. 安裝適用於 JavaScript 的 AWS IoT Device SDK v2。

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

1. 變更為適用於 JavaScript 的 AWS IoT Device SDK v2 中的 Greengrass 探索範例資料夾。

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

1. 安裝 Greengrass 探索範例應用程式。

   ```
   npm install
   ```

1. <a name="test-client-device-communications-application-intro"></a>執行範例 Greengrass 探索應用程式。此應用程式需要指定用戶端裝置物件名稱的引數、要使用的 MQTT 主題和訊息，以及驗證和保護連線的憑證。下列範例會將 Hello World 訊息傳送至 `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 的區域。

   ```
   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>

在本節中，您會在適用於 [AWS IoT Device SDK Java 的 v2](https://github.com/aws/aws-iot-device-sdk-java-v2) 中使用 Greengrass 探索範例來測試用戶端裝置與核心裝置之間的通訊。

**重要**  
若要建置適用於 Java 的 AWS IoT Device SDK v2，裝置必須具有下列工具：  
Java 8 或更新版本，並`JAVA_HOME`指向 Java 資料夾。
Apache Maven

**測試通訊 (AWS IoT Device SDK v2 for Java)**

1. 下載並建置適用於 [AWS IoT Device SDK Java 的 v2](https://github.com/aws/aws-iot-device-sdk-java-v2) 至 AWS IoT 物件，以做為用戶端裝置進行連線。

   在用戶端裝置上，執行下列動作：

   1. 複製 AWS IoT Device SDK v2 for Java 儲存庫以進行下載。

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

   1. 變更為 AWS IoT Device SDK v2 for Java 資料夾。

   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 探索應用程式。此應用程式需要指定用戶端裝置物件名稱的引數、要使用的 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>探索範例應用程式會訂閱主題，並提示您輸入要發佈的訊息。

   ```
   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)。