

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

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