翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
このセクションでは、次の 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 メッセージトピックをサブスクライブするには
-
この手順を実行する際に、ターミナルウィンドウと、[MQTT test client] (MQTT テストクライアント) のウィンドウが両方とも表示できることを確認します。また、[MQTT test client] (MQTT テストクライアント) のサブスクリプションが、引き続き[#] トピックフィルターであることを確認してください。そうでない場合は、[#] トピックフィルターのサブスクリプションに戻します。
-
ターミナルウィンドウで次のコマンドを入力して、設定ファイルを作成する で作成した設定ファイルを使用する 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 で操作を続行します。
-
AWS IoT コンソールの [MQTT test client] (MQTT テストクライアント) で、[Publish to a topic] (トピックに公開する) タブを選択します。
-
[Topic name] (トピック名) に
test/dc/subtopic
と入力します。 -
[Message payload] (メッセージペイロード) で、メッセージの内容を確認します。
-
MQTT メッセージを発行するには、[Publish] (発行) をクリックします。
-
ターミナルウィンドウで、AWS IoT Device Client からの次のような message received (受信したメッセージ) エントリを確認します。
2021-11-10T16:02:20.890Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 45 bytes
-
メッセージが受信されたことを示す message received (受信したメッセージ) エントリが表示されたら、
^C
(Ctrl-C) を入力して AWS IoT Device Client を停止します。 -
次のコマンドを入力して、メッセージログファイルの末尾を表示し、[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 メッセージをサブスクライブしてログに記録する方法をデモンストレーションします。これを行うには、次の操作を行います。
-
AWS IoT Device Client が MQTT トピックをサブスクライブするのに使用するトピックフィルターを更新します。
-
デバイスが使用するポリシーを更新して、新しいサブスクリプションができるようにします。
-
AWS IoT Device Client を実行して MQTT テストコンソールからメッセージを発行します。
ワイルドカード MQTT トピックフィルターを使用して複数の MQTT メッセージトピックをサブスクライブする設定ファイルを作成するには
-
Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、
~/dc-configs/dc-pubsub-custom-config.json
を開いて編集し、samples
オブジェクトを見つけます。 -
テキストエディタで、
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
に指定されたファイルに書き込みます。 -
変更された設定ファイルを
~/dc-configs/dc-pubsub-wild-config.json
として保存し、エディタを終了します。
複数の MQTT メッセージトピックをサブスクライブして受信できるように Raspberry Pi が使用するポリシーを変更するには
-
Raspberry Pi に接続されているローカルホストコンピュータのターミナルウィンドウで、任意のテキストエディタで
~/policies/pubsub_test_thing_policy.json
を編集するために開き、ファイル内のポリシーステートメントiot::Subscribe
とiot::Receive
を見つけます。 -
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 ポリシーでのワイルドカード文字の使用」を参照してください。
-
iot::Receive
ポリシーステートメントで、Resource オブジェクトの文字列を更新して、次のようにsubtopic
を*
に置き換えます。{ "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-west-2:57EXAMPLE833:topic/test/dc/
*
" ] } -
更新されたポリシードキュメントを
~/policies/pubsub_wild_test_thing_policy.json
として保存し、エディタを終了します。 -
次のコマンドを入力して、このチュートリアルのポリシーを更新して、新しいリソース定義を使用します。
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 メッセージトピックをサブスクライブして受信する方法をデモンストレーションするには
-
[MQTT test client] (MQTT テストクライアント) で、サブスクリプションを確認します。[MQTT test client] (MQTT テストクライアント) で「
#
」トピックフィルターがサブスクライブされていれば、次のステップに進みます。そうでない場合は、[MQTT test client] (MQTT テストクライアント) の [Subscribe to a topic] (トピックをサブスクライブする) タブで、[Topic filter] (トピックのフィルター) に#
(# 記号) を入力し、[Subscribe] (サブスクライブ) をクリックします。 -
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
-
ローカルホストコンピュータのターミナルウィンドウで AWS IoT Device Client の出力を確認しながら、[MQTT test client] (MQTT テストクライアント) に戻ります。[Publish to a topic] (トピックに公開する) タブで、[Topic name] (トピック名) に「
test/dc/subtopic
」と入力し、[Publish] (発行) をクリックします。 -
ターミナルウィンドウで、次のようなメッセージを検索して、メッセージが受信されたことを確認します。
2021-11-10T16:34:20.101Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 76 bytes
-
ローカルホストコンピュータのターミナルウィンドウで AWS IoT Device Client の出力を確認しながら、[MQTT test client] (MQTT テストクライアント) に戻ります。[Publish to a topic] (トピックに公開する) タブで、[Topic name] (トピック名) に「
test/dc/subtopic2
」と入力し、[Publish] (発行) をクリックします。 -
ターミナルウィンドウで、次のようなメッセージを検索して、メッセージが受信されたことを確認します。
2021-11-10T16:34:32.078Z [DEBUG] {samples/PubSubFeature.cpp}: Message received on subscribe topic, size: 77 bytes
-
両方のメッセージが受信されたことを確認するメッセージが表示されたら、
^C
(Ctrl-C) 入力して AWS IoT Device Client を停止します。 -
次のコマンドを入力して、メッセージログファイルの末尾を表示し、[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 でのリモートアクション (ジョブ) をデモンストレーションする に進みます。