

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: AWS IoT Device Client との MQTT メッセージ通信のデモンストレーション
<a name="iot-dc-testconn"></a>

このチュートリアルでは、 AWS IoT デバイスクライアントが IoT ソリューションで一般的に使用される MQTT メッセージをサブスクライブして発行する方法を示します。

**このチュートリアルを開始するには、以下を行います。**
+ ローカルホストコンピュータと Raspberry Pi は、[前のセクション](iot-dc-install-dc.md)で使用したのと同じ設定にします。

   AWS IoT Device Client のインストール後に microSD カードイメージを保存した場合は、Raspberry Pi でそのイメージに microSD カードを使用できます。
+ このデモを以前に実行したことがある場合は、リソースエラーが重複しないように[ステップ 2: AWS IoT Device Client でデモを構築 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 Device Client を使用したメッセージの発行のデモンストレーション](iot-dc-testconn-publish.md)
+ [AWS IoT Device Client を使用したメッセージのサブスクライブのデモンストレーション](iot-dc-testconn-subscribe.md)

# Raspberry Pi を準備して MQTT メッセージ通信のデモンストレーションをする
<a name="iot-dc-testconn-provision"></a>

この手順では、 AWS IoT と Raspberry Pi にリソースを作成し、 AWS IoT Device Client を使用した MQTT メッセージ通信を示します。

**Topics**
+ [MQTT 通信をデモンストレーションするための証明書ファイルを作成する](#iot-dc-testconn-provision-certs)
+ [MQTT 通信をデモンストレーションするためにデバイスをプロビジョニングする](#iot-dc-testconn-provision-aws)
+ [MQTT 通信を示すように AWS IoT Device Client 設定ファイルと 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 を表すために一度に 1 つのモノのリソースのみを使用します。このように、これらのチュートリアルでは、デモの 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、 に進む準備が整います[MQTT 通信を示すように AWS IoT Device Client 設定ファイルと MQTT テストクライアントを設定する](#iot-dc-testconn-provision-dc-config)。

## MQTT 通信を示すように AWS IoT Device Client 設定ファイルと MQTT テストクライアントを設定する
<a name="iot-dc-testconn-provision-dc-config"></a>

この手順では、 AWS IoT Device Client をテストするための設定ファイルを作成します。

**AWS IoT Device Client をテストする設定ファイルを作成するには**

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**」(単一の \$1 記号) を入力し、**[Subscribe]** (サブスクライブ) をクリックします。

   1. **[Subscriptions]** (サブスクリプション) ラベルの下に、「**\$1**」(単一の \$1 記号) が表示されることを確認します。

   このチュートリアルを進めている間は、ウィンドウで **[MQTT test client]** (MQTT テストクライアント) を開いたままにします。

ファイルを保存し、**[MQTT test client]** (MQTT テストクライアント) を設定したら、[AWS IoT Device Client を使用したメッセージの発行のデモンストレーション](iot-dc-testconn-publish.md) に進む準備が整いました。

# AWS IoT Device Client を使用したメッセージの発行のデモンストレーション
<a name="iot-dc-testconn-publish"></a>

このセクションの手順では、 AWS IoT Device Client がデフォルトおよびカスタム MQTT メッセージを送信する方法を示します。

前のステップでこれらの演習用に作成したポリシー内のポリシーステートメントでは、以下のアクションを実行するアクセス許可が Raspberry Pi に付与されます。
+ 

**`iot:Connect`**  
Device Client を実行`PubSubTestThing`している Raspberry Pi である という名前の AWS IoT クライアントに接続を許可します。

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

**`iot:Publish`**  
Raspberry Pi に MQTT トピック `test/dc/pubtopic` でメッセージを発行するアクセス許可を付与します。

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

  `iot:Publish` アクションで、リソース配列にリストされている MQTT トピックに発行するアクセス許可が付与されます。これらのメッセージの*内容*は、ポリシーステートメントによって制御されません。

## AWS IoT Device Client を使用してデフォルトのメッセージを発行する
<a name="iot-dc-testconn-publish-default"></a>

この手順では、 AWS IoT Device Client を実行して、MQTT **テストクライアントが受信して表示する単一のデフォルトの MQTT** メッセージを発行します。

**AWS IoT Device Client からデフォルトの MQTT メッセージを送信するには**

1. この手順を実行する際に、Raspberry Pi に接続されている、ローカルホストコンピュータ上のターミナルウィンドウと、**[MQTT test client]** (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。

1. ターミナルウィンドウで、これらのコマンドを入力して、 で作成された設定ファイルを使用して AWS IoT Device Client を実行します[設定ファイルを作成する](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 Device Client は情報メッセージと実行時に発生するエラーを表示します。

   ターミナルウィンドウにエラーが表示されない場合は、**[MQTT test client]** (MQTT テストクライアント) を確認します。

1. **[MQTT テストクライアント]** の **[サブスクリプション]** ウィンドウで、`test/dc/pubtopic` メッセージトピックに送信された「*Hello World\$1*」メッセージを確認します。

1.  AWS IoT Device Client にエラーが表示されず、**MQTT テストクライアントの**`test/dc/pubtopic`メッセージに *Hello World\$1* が送信されたと表示される場合は、接続が成功したことを示しています。

1. ターミナルウィンドウで、 **^C** (Ctrl-C) と入力して AWS IoT Device Client を停止します。

 AWS IoT Device Client がデフォルトの MQTT メッセージを発行したことを証明したら、 に進むことができます[AWS IoT Device Client を使用してカスタムメッセージを発行する](#iot-dc-testconn-publish-custom)。

## AWS IoT Device Client を使用してカスタムメッセージを発行する
<a name="iot-dc-testconn-publish-custom"></a>

このセクションの手順では、カスタム MQTT メッセージを作成し、 AWS IoT Device Client を実行して、カスタム MQTT メッセージを 1 回発行させて、**[MQTT test client]** (MQTT テストクライアント) が受信して表示するようにします。

### AWS IoT Device Client のカスタム MQTT メッセージを作成する
<a name="iot-dc-testconn-publish-custom-create"></a>

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次の手順を実行します。

**AWS IoT Device Client が発行するカスタムメッセージを作成するには**

1. ターミナルウィンドウで、`nano` などのテキストエディタを開きます。

1. テキストエディタに次の JSON ドキュメントをコピーして貼り付けます。これは、 AWS IoT Device Client が発行する MQTT メッセージペイロードです。

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

1. テキストエディタの内容を **\$1/messages/sample-ws-message.json** として保存します。

1. 次のコマンドを入力して、作成したメッセージファイルのアクセス許可を設定します。

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

**Device AWS IoT Client がカスタムメッセージを送信するために使用する設定ファイルを作成するには**

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 Device Client を使用してカスタム MQTT メッセージを発行する
<a name="iot-dc-testconn-publish-custom-publish"></a>

この変更は、MQTT メッセージペイロードの*内容*のみに影響するので、現在のポリシーは引き続き機能します。ただし、*MQTT トピック* (`~/dc-configs/dc-pubsub-custom-config.json` の `publish-topic` 値で定義されたもの) が変更されている場合、Raspberry Pi が新しい MQTT トピックに発行できるように `iot::Publish` ポリシーステートメントも変更する必要があります。

**AWS IoT Device Client から 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 Device Client を実行します。

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

   ターミナルウィンドウに、 AWS IoT Device Client は情報メッセージと実行時に発生するエラーを表示します。

   ターミナルウィンドウにエラーが表示されない場合は、[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 Device Client を停止します。

 AWS IoT Device Client がカスタムメッセージペイロードを発行したことを証明したら、 に進むことができます[AWS IoT Device Client を使用したメッセージのサブスクライブのデモンストレーション](iot-dc-testconn-subscribe.md)。

# AWS IoT Device Client を使用したメッセージのサブスクライブのデモンストレーション
<a name="iot-dc-testconn-subscribe"></a>

このセクションでは、次の 2 種類のメッセージサブスクリプションについて説明します。
+ 単一トピックのサブスクリプション
+ ワイルドカードトピックのサブスクリプション

これらの演習用に作成したポリシー内のポリシーステートメントでは、以下のアクションを実行するアクセス許可が Raspberry Pi に付与されます。
+ 

**`iot:Receive`**  
`Resource` オブジェクト内の名前と一致する MQTT トピックを受信するアクセス許可を AWS IoT Device Client に付与します。

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

**`iot:Subscribe`**  
`Resource` オブジェクト内の という名前のものに一致する MQTT トピックフィルターをサブスクライブするアクセス許可を AWS IoT Device Client に付与します。

  ```
      {
        "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 Device Client が 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` の値は AWS IoT Device Client が実行時にサブスクライブする MQTT トピックであることに注意します。 AWS IoT Device Client は、このサブスクリプションから受信したメッセージペイロードを `subscribe-file`値内の という名前のファイルに書き込みます。

**AWS IoT Device Client から MQTT メッセージトピックをサブスクライブするには**

1. この手順を実行する際に、ターミナルウィンドウと、[MQTT test client] (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。また、**[MQTT test client]** (MQTT テストクライアント) のサブスクリプションが、引き続き**[\$1]** トピックフィルターであることを確認してください。そうでない場合は、**[\$1]** トピックフィルターのサブスクリプションに戻します。

1. ターミナルウィンドウで、これらのコマンドを入力して、 で作成された設定ファイルを使用して AWS IoT Device Client を実行します[設定ファイルを作成する](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 Device Client は情報メッセージと実行時に発生するエラーを表示します。

   ターミナルウィンドウにエラーが表示されない場合は、 AWS IoT で操作を続行します。

1.  AWS IoT コンソールの **MQTT テストクライアント**で、**トピックへの発行**タブを選択します。

1. **[Topic name]** (トピック名) に **test/dc/subtopic** と入力します。

1. **[Message payload]** (メッセージペイロード) で、メッセージの内容を確認します。

1. MQTT メッセージを発行するには、**[Publish]** (発行) をクリックします。

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 Device Client を停止します。

1. 次のコマンドを入力して、メッセージログファイルの末尾を表示し、**[MQTT test client]** (MQTT テストクライアント) から発行したメッセージを表示します。

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

ログファイル内のメッセージを表示することで、MQTT テストクライアントから公開したメッセージを AWS IoT Device Client が受信したことを実証しました。

## ワイルドカード文字を使用して複数の MQTT メッセージトピックをサブスクライブする
<a name="iot-dc-testconn-subscribe-wild-topic"></a>

これらの手順は、 AWS IoT Device Client がワイルドカード文字を使用して MQTT メッセージをサブスクライブおよびログに記録する方法を示しています。これを行うには、次の操作を行います。

1.  AWS IoT Device Client が MQTT トピックのサブスクライブに使用するトピックフィルターを更新します。

1. デバイスが使用するポリシーを更新して、新しいサブスクリプションができるようにします。

1.  AWS IoT Device Client を実行し、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** として保存し、エディタを終了します。

**複数の MQTT メッセージトピックをサブスクライブして受信できるように Raspberry Pi が使用するポリシーを変更するには**

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、任意のテキストエディタで **\$1/policies/pubsub\$1test\$1thing\$1policy.json** を編集するために開き、ファイル内のポリシーステートメント `iot::Subscribe` と `iot::Receive` を見つけます。

1. `iot::Subscribe` ポリシーステートメントで、Resource オブジェクトの文字列を更新して、次のように `subtopic` を `*` に置き換えます。

   ```
       {
         "Effect": "Allow",
         "Action": [
           "iot:Subscribe"
         ],
         "Resource": [
           "arn:aws:iot:us-west-2:57EXAMPLE833:topicfilter/test/dc/*"
         ]
       }
   ```
**注記**  
[MQTT トピックフィルターワイルドカード文字](topics.md#topicfilters)「`+`」(プラス記号) と「`#`」(\$1 記号) です。末尾に `#` が付いたサブスクリプションリクエストは、`#` 文字の前にある文字列 (例えば、この場合「`test/dc/`」) で始まるすべてのトピックをサブスクライブします。  
ただし、このサブスクリプションを承認するポリシーステートメントのリソース値には、トピックフィルター ARN では `#` (\$1 記号) の代わりに `*` (アスタリスク) を使用する必要があります。これは、ポリシープロセッサが MQTT が使用するとは別のワイルドカード文字を使用するためです。  
ポリシーでトピックおよびトピックフィルターにワイルドカード文字を使用する方法の詳細については、「[MQTT および AWS IoT Core ポリシーでのワイルドカード文字の使用](pub-sub-policy.md#pub-sub-policy-cert)」を参照してください。

1. `iot::Receive` ポリシーステートメントで、Resource オブジェクトの文字列を更新して、次のように `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` になったことに注意してください。これがこのポリシーの 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 Device Client でワイルドカードサブスクリプションをデモンストレーションする準備が整いました。

**AWS IoT Device Client が複数の MQTT メッセージトピックをサブスクライブおよび受信する方法を示すには**

1. **[MQTT test client]** (MQTT テストクライアント) で、サブスクリプションを確認します。**[MQTT test client]** (MQTT テストクライアント) で「**\$1**」トピックフィルターがサブスクライブされていれば、次のステップに進みます。そうでない場合は、**[MQTT テストクライアント]** の **[トピックへのサブスクライブ]** タブで、**[トピックフィルター]** に **\$1**(ハッシュ記号文字) を入力し、**[サブスクライブ]** を選択してサブスクライブします。

1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、次のコマンドを入力して AWS IoT Device Client を起動します。

   ```
   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 Device Client を停止します。

1. 次のコマンドを入力して、メッセージログファイルの末尾を表示し、**[MQTT test client]** (MQTT テストクライアント) から発行したメッセージを表示します。

   ```
   tail -n 20 ~/.aws-iot-device-client/log/pubsub_rx_msgs.log
   ```
**注記**  
ログファイルには、メッセージペイロードのみが含まれます。メッセージトピックは、受信したメッセージログファイルに記録されません。  
 AWS IoT Device Client によって発行されたメッセージは、受信したログに表示される場合もあります。これは、ワイルドカードトピックフィルターにそのメッセージトピックが含まれており、発行されたメッセージがサブスクライバーに送信される前にメッセージブローカーがサブスクリプションリクエストを処理することがあるためです。

ログファイルのエントリは、メッセージが受信されたことを示しています。この手順は、他のトピック名を使用して繰り返すことができます。`test/dc/` で始まるトピック名を持つメッセージはすべて受信されてログ記録されます。他の文字列で始まるトピック名のメッセージは無視されます。

 AWS IoT Device Client が MQTT メッセージを発行およびサブスクライブする方法を示したら、「」に進みます[チュートリアル: AWS IoT Device Client を使用したリモートアクション (ジョブ) のデモンストレーション](iot-dc-runjobs.md)。