AWS IoT Device Client でメッセージをサブスクライブするデモンストレーション - AWS IoT Core

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

AWS IoT Device Client でメッセージをサブスクライブするデモンストレーション

このセクションでは、次の 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" ] }

1 つのMQTTメッセージトピックをサブスクライブする

この手順では、 AWS IoT Device Client がMQTTメッセージをサブスクライブしてログに記録する方法を示します。

Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、~/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テストクライアントを含むウィンドウの両方が表示されていることを確認します。また、MQTTテストクライアントがまだ # トピックフィルターにサブスクライブしていることを確認してください。そうでない場合は、[#] トピックフィルターのサブスクリプションに戻します。

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

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

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

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

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

  6. 発行を選択してMQTTメッセージを公開します。

  7. ターミナルウィンドウで、 AWS IoT Device Client から受信した、次のようなエントリを確認します。

    2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
  8. メッセージが受信されたことを示すメッセージ受信エントリが表示されたら、 ^C (Ctrl-C) と入力して AWS IoT Device Client を停止します。

  9. このコマンドを入力して、メッセージログファイルの末尾を表示し、MQTTテストクライアント から発行したメッセージを表示します。

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

ログファイルでメッセージを表示することで、 AWS IoT Device Client がMQTTテストクライアントから発行したメッセージを受け取ったことが実証されました。

ワイルドカード文字を使用して複数のMQTTメッセージトピックをサブスクライブする

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

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

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

  3. AWS IoT Device Client を実行し、MQTTテストコンソールからメッセージを公開します。

ワイルドカードトピックフィルターを使用して、複数のMQTTメッセージMQTTトピックをサブスクライブする設定ファイルを作成するには
  1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、~/dc-configs/dc-pubsub-custom-config.json を開いて編集し、samples オブジェクトを見つけます。

  2. テキストエディタで、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トピックフィルターです。これは、 で始まるすべてのMQTTトピックへのサブスクリプションについて説明しますtest/dc/。 AWS IoT Device Client は、このサブスクリプションから受信したメッセージペイロードを という名前のファイルに書き込みますsubscribe-file

  3. 変更された設定ファイルを ~/dc-configs/dc-pubsub-wild-config.json として保存し、エディタを終了します。

Raspberry Pi で使用されるポリシーを変更して、複数のMQTTメッセージトピックのサブスクライブと受信を許可するには
  1. Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、任意のテキストエディタで ~/policies/pubsub_test_thing_policy.json を編集するために開き、ファイル内のポリシーステートメント iot::Subscribeiot::Receive を見つけます。

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

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

    MQTT トピックフィルターのワイルドカード文字は、 + (プラス記号) と # (ポンド記号) です。末尾に # が付いたサブスクリプションリクエストは、# 文字の前にある文字列 (例えば、この場合「test/dc/」) で始まるすべてのトピックをサブスクライブします。

    ただし、このサブスクリプションを承認するポリシーステートメントのリソース値は、トピックフィルター の * (シャープ記号) の代わりに # (アスタリスク) を使用する必要がありますARN。これは、ポリシープロセッサが とは異なるワイルドカード文字MQTTを使用するためです。

    ポリシーでトピックおよびトピックフィルターにワイルドカード文字を使用する方法の詳細については、「MQTT および AWS IoT Core ポリシーでのワイルドカード文字の使用」を参照してください。

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

    { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/*" ] }
  4. 更新されたポリシードキュメントを ~/policies/pubsub_wild_test_thing_policy.json として保存し、エディタを終了します。

  5. 次のコマンドを入力して、このチュートリアルのポリシーを更新して、新しいリソース定義を使用します。

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

    コマンドが成功すると、次のようなレスポンスが返されます。policyVersionId2 になったことに注意してください。これがこのポリシーの 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 テストクライアント で、サブスクリプションを確認します。MQTT テストクライアント#トピックフィルターの にサブスクライブされている場合は、次のステップに進みます。そうでない場合は、MQTTテストクライアントトピックをサブスクライブタブのトピックフィルター # (シャープ記号) を入力し、サブスクライブを選択してサブスクライブします。

  2. 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
  3. ローカルホストコンピュータのターミナルウィンドウで AWS IoT Device Client の出力を見ながら、MQTTテストクライアント に戻ります。[Publish to a topic] (トピックに公開する) タブで、[Topic name] (トピック名) に「test/dc/subtopic」と入力し、[Publish] (発行) をクリックします。

  4. ターミナルウィンドウで、次のようなメッセージを検索して、メッセージが受信されたことを確認します。

    2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
  5. ローカルホストコンピュータのターミナルウィンドウで AWS IoT Device Client の出力を見ながら、MQTTテストクライアント に戻ります。[Publish to a topic] (トピックに公開する) タブで、[Topic name] (トピック名) に「test/dc/subtopic2」と入力し、[Publish] (発行) をクリックします。

  6. ターミナルウィンドウで、次のようなメッセージを検索して、メッセージが受信されたことを確認します。

    2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
  7. 両方のメッセージが受信されたことを確認するメッセージが表示されたら、 ^C (Ctrl-C) と入力して AWS IoT Device Client を停止します。

  8. このコマンドを入力して、メッセージログファイルの末尾を表示し、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 でのリモートアクション (ジョブ) をデモンストレーションする