

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

# 教學課程：示範與 AWS IoT 裝置用戶端的 MQTT 訊息通訊
<a name="iot-dc-testconn"></a>

本教學課程示範 AWS IoT 裝置用戶端如何訂閱和發佈 MQTT 訊息，這些訊息常用於 IoT 解決方案。

**若要開始此教學課程：**
+ 將本機主機電腦和 Raspberry Pi 設定成[上一節](iot-dc-install-dc.md)中的使用方式。

  如果您在安裝 AWS IoT 裝置用戶端後儲存 microSD 卡映像，則可以搭配 Raspberry Pi 使用該映像的 microSD 卡。
+ 如果您之前已執行過此示範，請檢閱 [步驟 2：使用 AWS IoT 裝置用戶端建置示範 AWS 帳戶 後清除您的](iot-dc-cleanup.md#iot-dc-cleanup-cloud) 以刪除先前執行中建立的所有 AWS IoT 資源，以避免重複的資源錯誤。

此教學課程約需 45 分鐘方能完成。

**完成此主題時：**
+ 您將示範 IoT 裝置從 訂閱 MQTT 訊息 AWS IoT 以及向其發佈 MQTT 訊息的不同方式 AWS IoT。

**必要設備：**
+ [上一節](iot-dc-install-dc.md)中的本機開發和測試環境
+ [上一節](iot-dc-install-dc.md)中使用的 Raspberry Pi
+ [上一節](iot-dc-install-dc.md)中使用的 Raspberry Pi microSD 記憶卡

**Topics**
+ [準備 Raspberry Pi 以示範 MQTT 訊息通訊](iot-dc-testconn-provision.md)
+ [示範使用 AWS IoT 裝置用戶端發佈訊息](iot-dc-testconn-publish.md)
+ [示範使用 AWS IoT 裝置用戶端訂閱訊息](iot-dc-testconn-subscribe.md)

# 準備 Raspberry Pi 以示範 MQTT 訊息通訊
<a name="iot-dc-testconn-provision"></a>

此程序會在 Raspberry Pi 中 AWS IoT 和 中建立資源，以使用 AWS IoT 裝置用戶端示範 MQTT 訊息通訊。

**Topics**
+ [建立憑證檔案來示範 MQTT 通訊](#iot-dc-testconn-provision-certs)
+ [佈建裝置來示範 MQTT 通訊](#iot-dc-testconn-provision-aws)
+ [設定 AWS IoT Device Client 組態檔案和 MQTT 測試用戶端，以示範 MQTT 通訊](#iot-dc-testconn-provision-dc-config)

## 建立憑證檔案來示範 MQTT 通訊
<a name="iot-dc-testconn-provision-certs"></a>

此程序會建立此示範的裝置憑證檔案。

**為 Raspberry Pi 建立並下載裝置憑證檔案**



1. 在本機主機電腦的終端機視窗中輸入下列命令，為裝置建立裝置憑證檔案。

   ```
   mkdir ~/certs/pubsub
   aws iot create-keys-and-certificate \
   --set-as-active \
   --certificate-pem-outfile "~/certs/pubsub/device.pem.crt" \
   --public-key-outfile "~/certs/pubsub/public.pem.key" \
   --private-key-outfile "~/certs/pubsub/private.pem.key"
   ```

   此命令會傳回類似以下的回應。儲存 `certificateArn` 值，供之後使用。

   ```
   {
   "certificateArn": "arn:aws:iot:us-west-2:57EXAMPLE833:cert/76e7e4edb3e52f52334be2f387a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificateId": "76e7e4edb3e52f5233EXAMPLE7a06145b2aa4c7fcd810f3aea2d92abc227d269",
   "certificatePem": "-----BEGIN CERTIFICATE-----\nMIIDWTCCAkGgAwIBAgI_SHORTENED_FOR_EXAMPLE_Lgn4jfgtS\n-----END CERTIFICATE-----\n",
   "keyPair": {
       "PublicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BA_SHORTENED_FOR_EXAMPLE_ImwIDAQAB\n-----END PUBLIC KEY-----\n",
       "PrivateKey": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQE_SHORTENED_FOR_EXAMPLE_T9RoDiukY\n-----END RSA PRIVATE KEY-----\n"
   }
   }
   ```

1. 輸入下列命令來設定憑證目錄及其檔案的許可。

   ```
   chmod 700 ~/certs/pubsub
   chmod 644 ~/certs/pubsub/*
   chmod 600 ~/certs/pubsub/private.pem.key
   ```

1. 執行此命令來檢閱憑證目錄和檔案的許可。

   ```
   ls -l ~/certs/pubsub
   ```

   命令的輸出應該與您在此處看到的相同，但檔案日期和時間會有所不同。

   ```
   -rw-r--r-- 1 pi pi 1220 Oct 28 13:02 device.pem.crt
   -rw------- 1 pi pi 1675 Oct 28 13:02 private.pem.key
   -rw-r--r-- 1 pi pi  451 Oct 28 13:02 public.pem.key
   ```

1. 輸入這些命令來建立記錄檔案的目錄。

   ```
   mkdir ~/.aws-iot-device-client
   mkdir ~/.aws-iot-device-client/log
   chmod 745 ~/.aws-iot-device-client/log
   echo " " > ~/.aws-iot-device-client/log/aws-iot-device-client.log
   echo " " > ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   chmod 600 ~/.aws-iot-device-client/log/*
   ```

## 佈建裝置來示範 MQTT 通訊
<a name="iot-dc-testconn-provision-aws"></a>

本節會建立在 中佈建 Raspberry Pi AWS IoT 的資源 AWS IoT。

**若要在 AWS IoT中佈建裝置：**

1. 在本機主機電腦的終端機視窗中輸入下列命令，取得 AWS 帳戶裝置資料端點的地址。

   ```
   aws iot describe-endpoint --endpoint-type IoT:Data-ATS
   ```

   自您依照上一個教學課程執行此命令後，端點值便未發生變更。此處再次執行命令是為了輕鬆找到資料端點值並將其貼入本教學課程中使用的組態檔。

   先前步驟的命令會傳回類似以下的回應：記錄 `endpointAddress` 值，供之後使用。

   ```
   {
   "endpointAddress": "a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com"
   }
   ```

1. 輸入此命令來為您的 Raspberry Pi 建立新的 AWS IoT 物件資源。

   ```
   aws iot create-thing --thing-name "PubSubTestThing"
   ```

   由於 AWS IoT 物件資源是您在雲端中裝置的*虛擬*表示法，因此我們可以在 中建立多個物件資源 AWS IoT ，以用於不同的用途。這些資源都可以由同一個實體 IoT 裝置使用，用以代表裝置的不同面向。

   這些教學課程一次只會使用一個物件資源來表示 Raspberry Pi。如此一來，在這些教學課程中，它們代表不同的示範，因此在您為示範建立 AWS IoT 資源之後，您可以返回並使用您專門為每個示範建立的資源重複示範。

   如果您的 AWS IoT 物件資源已建立，命令會傳回類似這樣的回應。

   ```
   {
   "thingName": "PubSubTestThing",
   "thingArn": "arn:aws:iot:us-west-2:57EXAMPLE833:thing/PubSubTestThing",
   "thingId": "8ea78707-32c3-4f8a-9232-14bEXAMPLEfd"
   }
   ```

1. 在終端機視窗中：

   1. 開啟文字編輯器，例如 `nano`。

   1. 複製此 JSON 文件並將其貼入開啟的文字編輯器中。  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Connect"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:client/PubSubTestThing"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/pubtopic"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topicfilter/test/dc/subtopic"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-west-2:123456789012:topic/test/dc/subtopic"
                  ]
              }
          ]
      }
      ```

   1. 在編輯器中，在政策文件的每個`Resource`區段中，將 *us-west-2：57EXAMPLE833* 取代為 AWS 區域、冒號字元 (：) 和 12 位數字 AWS 帳戶 。

   1. 將文字編輯器中的檔案儲存為 **\$1/policies/pubsub\$1test\$1thing\$1policy.json**。

1. 執行此命令以使用先前步驟中的政策文件來建立 AWS IoT 政策。

   ```
   aws iot create-policy \
   --policy-name "PubSubTestThingPolicy" \
   --policy-document "file://~/policies/pubsub_test_thing_policy.json"
   ```

   如果建立此政策，此命令會傳回類似以下的回應。

   ```
   {
                                       "policyName": "PubSubTestThingPolicy",
                                       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy",
                                       "policyDocument": "{\n\"Version\": \"2012-10-17\",		 	 	 \n\"Statement\": [\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Connect\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Publish\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Subscribe\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic\"\n]\n},\n{\n\"Effect\": \"Allow\",\n\"Action\": [\n\"iot:Receive\"\n],\n\"Resource\": [\n\"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n]\n}\n]\n}\n",
                                       "policyVersionId": "1"
                                       }
   ```

1. 執行此命令，將此政策連接至裝置憑證。使用之前在本節儲存的 `certificateArn` 值來取代 `certificateArn`

   ```
   aws iot attach-policy \
   --policy-name "PubSubTestThingPolicy" \
   --target "certificateArn"
   ```

   若成功，此命令不會傳回任何內容。

1. 執行此命令，將裝置憑證連接至 AWS IoT 物件資源。使用之前在本節儲存的 `certificateArn` 值來取代 `certificateArn`

   ```
   aws iot attach-thing-principal \
   --thing-name "PubSubTestThing" \
   --principal "certificateArn"
   ```

   若成功，此命令不會傳回任何內容。

成功在 中佈建裝置後 AWS IoT，您就可以繼續 [設定 AWS IoT Device Client 組態檔案和 MQTT 測試用戶端，以示範 MQTT 通訊](#iot-dc-testconn-provision-dc-config)。

## 設定 AWS IoT Device Client 組態檔案和 MQTT 測試用戶端，以示範 MQTT 通訊
<a name="iot-dc-testconn-provision-dc-config"></a>

此程序會建立組態檔案來測試 AWS IoT 裝置用戶端。

**建立組態檔案以測試 AWS IoT 裝置用戶端**

1. 在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中：

   1. 開啟文字編輯器，例如 `nano`。

   1. 複製此 JSON 文件並將其貼入開啟的文字編輯器中。

      ```
      {
        "endpoint": "a3qEXAMPLEaffp-ats.iot.us-west-2.amazonaws.com",
        "cert": "~/certs/pubsub/device.pem.crt",
        "key": "~/certs/pubsub/private.pem.key",
        "root-ca": "~/certs/AmazonRootCA1.pem",
        "thing-name": "PubSubTestThing",
        "logging": {
          "enable-sdk-logging": true,
          "level": "DEBUG",
          "type": "STDOUT",
          "file": ""
        },
        "jobs": {
          "enabled": false,
          "handler-directory": ""
        },
        "tunneling": {
          "enabled": false
        },
        "device-defender": {
          "enabled": false,
          "interval": 300
        },
        "fleet-provisioning": {
          "enabled": false,
          "template-name": "",
          "template-parameters": "",
          "csr-file": "",
          "device-key": ""
        },
        "samples": {
          "pub-sub": {
            "enabled": true,
            "publish-topic": "test/dc/pubtopic",
            "publish-file": "",
            "subscribe-topic": "test/dc/subtopic",
            "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
          }
        },
        "config-shadow": {
          "enabled": false
        },
        "sample-shadow": {
          "enabled": false,
          "shadow-name": "",
          "shadow-input-file": "",
          "shadow-output-file": ""
        }
      }
      ```

   1. 將*端點*值取代為您 AWS 帳戶 在 中找到之 的裝置資料端點[在 中佈建您的裝置 AWS IoT Core](iot-dc-install-provision.md#iot-dc-install-dc-provision)。

   1. 將文字編輯器中的檔案儲存為 **\$1/dc-configs/dc-pubsub-config.json**。

   1. 執行此命令來設定新組態檔的許可。

      ```
      chmod 644 ~/dc-configs/dc-pubsub-config.json
      ```

1. 若要準備 **MQTT test client** (MQTT 測試用戶端) 來訂閱所有 MQTT 訊息：

   1. 在 [AWS IoT 主控台](https://console.aws.amazon.com//iot/home#/test)的本機主機電腦上，選擇 **MQTT test client** (MQTT 測試用戶端)。

   1. 在 **Subscribe to a topic** (訂閱主題) 索引標籤的 **Topic filter** (主題篩選條件) 中，輸入 **\$1** (單個井字符號)，然後選擇 **Subscribe** (訂閱)。

   1. 在 **Subscriptions** (訂閱) 標籤下方，請確認看到 **\$1** (單個井字符號)。

   在繼續進行此教學課程時，請讓有 **MQTT test client** (MQTT 測試用戶端) 的視窗保持開啟。

在儲存檔案並設定 **MQTT test client** (MQTT 測試用戶端)之後，您就可以繼續進行 [示範使用 AWS IoT 裝置用戶端發佈訊息](iot-dc-testconn-publish.md)。

# 示範使用 AWS IoT 裝置用戶端發佈訊息
<a name="iot-dc-testconn-publish"></a>

本節中的程序示範 AWS IoT 裝置用戶端如何傳送預設和自訂 MQTT 訊息。

在上一個步驟為這些練習建立的此政策中的政策陳述式，會授予 Raspberry Pi 執行這些動作的許可：
+ 

**`iot:Connect`**  
提供名為 的用戶端`PubSubTestThing`進行連線，也就是執行 AWS IoT 裝置用戶端的 Raspberry Pi。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Connect"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing"
        ]
      }
  ```
+ 

**`iot:Publish`**  
授予 Raspberry Pi 許可來發佈擁有 `test/dc/pubtopic` MQTT 主題的訊息。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Publish"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic"
        ]
      }
  ```

  此 `iot:Publish` 動作會授予許可來發佈至資源陣列中列出的 MQTT 主題。這些訊息的*內容*不受政策陳述式的控制。

## 使用 AWS IoT 裝置用戶端發佈預設訊息
<a name="iot-dc-testconn-publish-default"></a>

此程序會執行 AWS IoT Device Client，以便發佈 MQTT **測試用戶端接收和顯示的單一預設 MQTT** 訊息。

**從 AWS IoT 裝置用戶端傳送預設 MQTT 訊息**

1. 請確保這兩個連接到 Raspberry Pi 的本機主機電腦終端機視窗和有 **MQTT test client** (MQTT 測試用戶端) 的視窗，會在您執行此程序時顯示出來。

1. 在終端機視窗中，輸入這些命令，以使用在 中建立的組態檔案執行 AWS IoT 裝置用戶端[建立組態檔](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-config.json
   ```

   在終端機視窗中， AWS IoT 裝置用戶端會顯示資訊訊息，以及執行時發生的任何錯誤。

   如果終端機視窗中未顯示任何錯誤，請檢閱 **MQTT test client** (MQTT 測試用戶端)。

1. 在 **MQTT test client** (MQTT 測試用戶端) 的 **Subscriptions** (訂閱) 視窗中，請參閱傳送至 `test/dc/pubtopic` 訊息主題的 *Hello World\$1* 訊息。

1. 如果 AWS IoT Device Client 未顯示錯誤，而且您在 **MQTT 測試用戶端**看到 *Hello World！* 傳送至`test/dc/pubtopic`訊息，表示連線成功。

1. 在終端機視窗中，輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

在您示範 AWS IoT Device Client 已發佈預設 MQTT 訊息之後，您可以繼續前往 [使用 AWS IoT 裝置用戶端發佈自訂訊息](#iot-dc-testconn-publish-custom)。

## 使用 AWS IoT 裝置用戶端發佈自訂訊息
<a name="iot-dc-testconn-publish-custom"></a>

本節中的程序會建立自訂 MQTT 訊息，然後執行 AWS IoT 裝置用戶端，以便它發佈一次自訂 MQTT 訊息，供 **MQTT test client** (MQTT 測試用戶端) 接收和顯示。

### 為 AWS IoT 裝置用戶端建立自訂 MQTT 訊息
<a name="iot-dc-testconn-publish-custom-create"></a>

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中執行這些步驟。

**為 AWS IoT 要發佈的裝置用戶端建立自訂訊息**

1. 在終端機視窗中，開啟文字編輯器，例如 `nano`。

1. 在文字編輯器中複製並貼入以下 JSON 文件。這將是 AWS IoT 裝置用戶端發佈的 MQTT 訊息承載。

   ```
   {
     "temperature": 28,
     "humidity": 80,
     "barometer": 1013,
     "wind": {
       "velocity": 22,
       "bearing": 255
     }
   }
   ```

1. 將文字編輯器的內容儲存為 **\$1/messages/sample-ws-message.json**。

1. 輸入下列命令，為剛建立的訊息檔案設定許可。

   ```
   chmod 600 ~/messages/*
   ```

**為 AWS IoT 裝置用戶端建立組態檔案，以用來傳送自訂訊息**

1. 在終端機視窗中，在 等文字編輯器中`nano`，開啟現有的 AWS IoT Device Client 組態檔案：**\$1/dc-configs/dc-pubsub-config.json**。

1. 按如下所示編輯 `samples` 物件。無需變更此檔案的其他部分。

   ```
     "samples": {
       "pub-sub": {
         "enabled": true,
         "publish-topic": "test/dc/pubtopic",
         "publish-file": "~/messages/sample-ws-message.json",
         "subscribe-topic": "test/dc/subtopic",
         "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
   ```

1. 將文字編輯器的內容儲存為 **\$1/dc-configs/dc-pubsub-custom-config.json**。

1. 執行此命令來設定新組態檔的許可。

   ```
   chmod 644 ~/dc-configs/dc-pubsub-custom-config.json
   ```

### 使用 AWS IoT 裝置用戶端發佈自訂 MQTT 訊息
<a name="iot-dc-testconn-publish-custom-publish"></a>

此項變更只會影響 MQTT 訊息承載的*內容*，因此目前的政策會繼續運作。不過，如果 *MQTT 主題* (如 `~/dc-configs/dc-pubsub-custom-config.json` 中定義的 `publish-topic` 值) 已變更，`iot::Publish` 政策陳述式也需要進行修改，以允許 Raspberry Pi 發佈至新的 MQTT 主題。

**從 AWS IoT 裝置用戶端傳送 MQTT 訊息**

1. 請確保這兩個終端機視窗和有 **MQTT test client** (MQTT 測試用戶端) 的視窗，會在您執行此程序時顯示出來。此外，請確保 **MQTT test client** (MQTT 測試用戶端) 仍然訂閱了 **\$1** 主題篩選條件。如果未訂閱，請訂閱 **\$1** 主題篩選條件。

1. 在終端機視窗中輸入這些命令，使用在 [建立組態檔](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1) 中建立的組態檔來執行 AWS IoT 裝置用戶端。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json
   ```

   在終端機視窗中， AWS IoT 裝置用戶端會顯示資訊訊息，以及執行時發生的任何錯誤。

   如果終端機視窗中未顯示任何錯誤，請檢閱 MQTT test client (MQTT 測試用戶端)。

1. 在 **MQTT test client** (MQTT 測試用戶端) 的 **Subscriptions** (訂閱) 視窗中，參閱傳送至 `test/dc/pubtopic` 訊息主題的自訂訊息承載。

1. 如果 AWS IoT Device Client 沒有顯示錯誤，而且您在 **MQTT 測試用戶端**中看到發佈至`test/dc/pubtopic`訊息的自訂訊息承載，表示您已成功發佈自訂訊息。

1. 在終端機視窗中，輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

在您示範 AWS IoT Device Client 已發佈自訂訊息承載之後，您可以繼續 [示範使用 AWS IoT 裝置用戶端訂閱訊息](iot-dc-testconn-subscribe.md)。

# 示範使用 AWS IoT 裝置用戶端訂閱訊息
<a name="iot-dc-testconn-subscribe"></a>

在本節中，您會示範兩種類型的訊息訂閱：
+ 單一主題訂閱
+ 萬用字元主題訂閱

為這些練習建立的此政策中的政策陳述式會授予 Raspberry Pi 執行這些動作的許可：
+ 

**`iot:Receive`**  
授予 AWS IoT Device Client 許可，以接收符合`Resource`物件中名為 的 MQTT 主題。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Receive"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/subtopic"
        ]
      }
  ```
+ 

**`iot:Subscribe`**  
授予 AWS IoT Device Client 許可，以訂閱符合`Resource`物件中名為 的 MQTT 主題篩選條件。

  ```
      {
        "Effect": "Allow",
        "Action": [
          "iot:Subscribe"
        ],
        "Resource": [
          "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/subtopic"
        ]
      }
  ```

## 訂閱單一 MQTT 訊息主題
<a name="iot-dc-testconn-subscribe-simple-topic"></a>

此程序示範 AWS IoT 裝置用戶端如何訂閱和記錄 MQTT 訊息。

在連接至 Raspberry Pi 本機主機電腦上的終端機視窗中，列出 **\$1/dc-configs/dc-pubsub-custom-config.json** 的內容或在文字編輯器中開啟檔案來檢閱其內容。找到 `samples` 物件，它應該如下所示。

```
  "samples": {
    "pub-sub": {
      "enabled": true,
      "publish-topic": "test/dc/pubtopic",
      "publish-file": "~/messages/sample-ws-message.json",
      "subscribe-topic": "test/dc/subtopic",
      "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
```

請注意 `subscribe-topic` 值是 MQTT 主題， AWS IoT 裝置用戶端會在執行時訂閱該主題。 AWS IoT Device Client 會將從此訂閱收到的訊息承載寫入 `subscribe-file`值中名為 的檔案。

**從 AWS IoT 裝置用戶端訂閱 MQTT 訊息主題**

1. 請確保這兩個終端機視窗和有 MQTT test client (MQTT 測試用戶端) 的視窗，會在您執行此程序時顯示出來。此外，請確保 **MQTT test client** (MQTT 測試用戶端) 仍然訂閱了 **\$1** 主題篩選條件。如果未訂閱，請訂閱 **\$1** 主題篩選條件。

1. 在終端機視窗中，輸入這些命令，以使用在 中建立的組態檔案執行 AWS IoT 裝置用戶端[建立組態檔](iot-dc-install-configure.md#iot-dc-install-dc-configure-step1)。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-custom-config.json
   ```

   在終端機視窗中， AWS IoT 裝置用戶端會顯示資訊訊息，以及執行時發生的任何錯誤。

   如果終端機視窗中未顯示任何錯誤，請在 AWS IoT 主控台中繼續進行。

1. 在 AWS IoT 主控台的 **MQTT 測試用戶端**中，選擇**發佈至主題**索引標籤。

1. 在 **Topic name** (主題名稱) 中輸入 **test/dc/subtopic**。

1. 在 **Message payload** (訊息承載) 中，檢閱郵件內容。

1. 請選擇 **Publish** (發佈) 來發佈 MQTT 訊息。

1. 在終端機視窗中，請留意從 AWS IoT Device Client *接收的訊息*項目，如下所示。

   ```
   2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
   ```

1. 在您看到顯示訊息已接收*的訊息*項目後，請輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

1. 輸入此命令來檢視訊息日誌檔案的結尾，查看您從 **MQTT test client** (MQTT 測試用戶端) 發佈的訊息。

   ```
   tail ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```

藉由檢視日誌檔案中的訊息，您示範了 AWS IoT 裝置用戶端收到您從 MQTT 測試用戶端發佈的訊息。

## 使用萬用字元訂閱多個 MQTT 訊息主題
<a name="iot-dc-testconn-subscribe-wild-topic"></a>

這些程序示範 AWS IoT 裝置用戶端如何使用萬用字元訂閱和記錄 MQTT 訊息。若要做到這一點，您必須：

1. 更新 AWS IoT Device Client 用來訂閱 MQTT 主題的主題篩選條件。

1. 更新裝置所使用的政策，以允許新的訂閱。

1. 執行 AWS IoT 裝置用戶端，並從 MQTT 測試主控台發佈訊息。

**使用萬用字元 MQTT 主題篩選條件建立用於訂閱多個 MQTT 訊息主題的組態檔**

1. 在連接至 Raspberry Pi 本機主機電腦的終端機視窗中，開啟 **\$1/dc-configs/dc-pubsub-custom-config.json** 進行編輯，並找出 `samples` 物件。

1. 在文字編輯器中，找出 `samples` 物件並更新 `subscribe-topic` 值，如下所示。

   ```
     "samples": {
       "pub-sub": {
         "enabled": true,
         "publish-topic": "test/dc/pubtopic",
         "publish-file": "~/messages/sample-ws-message.json",
         "subscribe-topic": "test/dc/#",
         "subscribe-file": "~/.aws-iot-device-client/log/pubsub_rx_msgs.log"
   ```

   新 `subscribe-topic` 值是末尾具有 MQTT 萬用字元的 [MQTT 主題篩選條件](topics.md#topicfilters)。本節說明訂閱所有以 `test/dc/` 為開頭的 MQTT 主題。 AWS IoT Device Client 會將從此訂閱收到的訊息承載寫入 中名為 的檔案`subscribe-file`。

1. 將修改的組態檔儲存為 **\$1/dc-configs/dc-pubsub-wild-config.json**，然後退出編輯器。

**修改 Raspberry Pi 使用的政策，以允許訂閱和接收多個 MQTT 消息主題**

1. 在連接至 Raspberry Pi 的本機主機電腦上的終端機視窗中，於最喜歡的文字編輯器中開啟 **\$1/policies/pubsub\$1test\$1thing\$1policy.json** 進行編輯，然後找出檔案中的 `iot::Subscribe` 和 `iot::Receive` 政策陳述式。

1. 在 `iot::Subscribe` 政策陳述式中，更新資源物件中的字串，用 `*` 取代 `subtopic`，使其如下所示。

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Subscribe"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*"
         ]
       }
   ```
**注意**  
此 [MQTT 主題篩選條件萬用字元](topics.md#topicfilters) 是 `+` (加號) 和 `#` (井號)。結尾帶有 `#` 的訂閱請求會訂閱所有以 `#` 字元前面的字串為開頭的主題 (例如本例中的 `test/dc/`)。  
不過，政策陳述式中授權此訂閱的資源值必須在主題篩選條件 ARN 中使用 `*` (星號) 取代 `#` (井號)。這是因為政策處理器使用的萬用字元與 MQTT 使用的不同。  
如需有關在政策中為主題和主題篩選條件使用萬用字元的詳細資訊，請參閱 [在 MQTT 和 AWS IoT Core 政策中使用萬用字元](pub-sub-policy.md#pub-sub-policy-cert)。

1. 在 `iot::Receive` 政策陳述式中，更新資源物件中的字串，用 `*` 取代 `subtopic`，使其如下所示。

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Receive"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*"
         ]
       }
   ```

1. 將更新後的政策文件儲存為 **\$1/policies/pubsub\$1wild\$1test\$1thing\$1policy.json**，然後退出編輯器。

1. 輸入此指令來更新此教學課程的政策，以使用新的資源定義。

   ```
   aws iot create-policy-version \
   --set-as-default \
   --policy-name "PubSubTestThingPolicy" \
   --policy-document "file://~/policies/pubsub_wild_test_thing_policy.json"
   ```

   如果命令成功，它會傳回類似這樣的回應。請注意，`policyVersionId` 現在是 `2`，表示這是此政策的第二個版本。

   如果成功更新了政策，您可以繼續進行下一個程序。

   ```
   {
       "policyArn": "arn:aws:iot:us-west-2:57EXAMPLE833:policy/PubSubTestThingPolicy",
       "policyDocument": "{\n  \"Version\": \"2012-10-17\",		 	 	 \n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Connect\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:client/PubSubTestThing\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Publish\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/pubtopic\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Subscribe\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*\"\n      ]\n    },\n    {\n      \"Effect\": \"Allow\",\n      \"Action\": [\n        \"iot:Receive\"\n      ],\n      \"Resource\": [\n        \"arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*\"\n      ]\n    }\n  ]\n}\n",
       "policyVersionId": "2",
       "isDefaultVersion": true
   }
   ```

   如果收到因政策版本過多而無法儲存新政策的錯誤，請輸入此命令來列出政策的目前版本。檢閱此命令傳回的清單，找出可以刪除的政策版本。

   ```
   aws iot list-policy-versions --policy-name "PubSubTestThingPolicy"
   ```

   輸入此命令來刪除不再需要的版本。請注意，您無法刪除預設政策版本。預設政策版本的 `isDefaultVersion` 值為 `true`。

   ```
   aws iot delete-policy-version \
   --policy-name "PubSubTestThingPolicy" \
   --policy-version-id policyId
   ```

   刪除政策版本後，請重試此步驟。

使用更新的組態檔案和政策，您就可以使用 AWS IoT 裝置用戶端示範萬用字元訂閱。

**示範 AWS IoT 裝置用戶端如何訂閱和接收多個 MQTT 訊息主題**

1. 在 **MQTT test client** (MQTT 測試用戶端) 中，檢查訂閱。如果 **MQTT test client** (MQTT 測試用戶端) 訂閱了 **\$1** 主題篩選條件，請繼續下一個步驟。如果沒有，進入 **MQTT test client** (MQTT 測試用戶端)，在 **Subscribe to a topic** (訂閱主題) 索引標籤的 **Topic filter** (主題篩選條件) 中，輸入 **\$1** (井號字元)，然後選擇 **Subscribe** (訂閱) 進行訂閱。

1. 在連接至 Raspberry Pi 的本機主機電腦終端機視窗中，輸入這些命令來啟動 AWS IoT 裝置用戶端。

   ```
   cd ~/aws-iot-device-client/build
   ./aws-iot-device-client --config-file ~/dc-configs/dc-pubsub-wild-config.json
   ```

1. 在本機主機電腦上的終端機視窗中觀看 AWS IoT Device Client 輸出時，請返回 **MQTT 測試用戶端**。在 **Publish to a topic** (發佈至主題) 索引標籤中的 **Topic name** (主題名稱) 輸入 **test/dc/subtopic**，然後選擇 **Publish** (發佈)。

1. 在終端機視窗中，尋找如下訊息來確認已收到訊息：

   ```
   2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
   ```

1. 在本機主機電腦的終端機視窗中觀看 AWS IoT Device Client 輸出時，請返回 **MQTT 測試用戶端**。在 **Publish to a topic** (發佈至主題) 索引標籤中的 **Topic name** (主題名稱) 輸入 **test/dc/subtopic2**，然後選擇 **Publish** (發佈)。

1. 在終端機視窗中，尋找如下訊息來確認已收到訊息：

   ```
   2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
   ```

1. 在您看到確認收到兩個訊息的訊息後，請輸入 **^C**(Ctrl-C) 以停止 AWS IoT 裝置用戶端。

1. 輸入此命令來檢視訊息日誌檔案的結尾，查看您從 **MQTT test client** (MQTT 測試用戶端) 發佈的訊息。

   ```
   tail -n 20 ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```
**注意**  
記錄檔案僅包含訊息承載。訊息主題不會記錄在接收到的訊息日誌檔案中。  
您也可以在收到的日誌中看到 AWS IoT 裝置用戶端發佈的訊息。這是因為萬用字元主題篩選條件會包含該訊息主題，有時候，訂閱請求可能由訊息代理程式處理，然後才將發佈的訊息傳送給訂閱者。

日誌檔案中的項目會示範已收到訊息。您可以使用其他主題名稱重複此程序。所有主題名稱以 `test/dc/` 為開頭的訊息應該會被接收並記錄。主題名稱以任何其他文字為開頭的訊息都會被忽略。

在示範 AWS IoT 裝置用戶端如何發佈和訂閱 MQTT 訊息之後，請繼續 [教學課程：使用 AWS IoT 裝置用戶端示範遠端動作 （任務）](iot-dc-runjobs.md)。