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" ] }

単一の 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 test client] (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。また、[MQTT test client] (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 メッセージを発行するには、[Publish] (発行) をクリックします。

  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 test client] (MQTT テストクライアント) から発行したメッセージを表示します。

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

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

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

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

複数の MQTT メッセージトピックをサブスクライブして受信できるように Raspberry Pi が使用するポリシーを変更するには
  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 test client] (MQTT テストクライアント) で、サブスクリプションを確認します。[MQTT test client] (MQTT テストクライアント) で「#」トピックフィルターがサブスクライブされていれば、次のステップに進みます。そうでない場合は、[MQTT test client] (MQTT テストクライアント) の [Subscribe to a topic] (トピックをサブスクライブする) タブで、[Topic filter] (トピックのフィルター) に# (# 記号) を入力し、[Subscribe] (サブスクライブ) をクリックします。

  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 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 でのリモートアクション (ジョブ) をデモンストレーションする