翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
チュートリアル: MQTT メッセージの再発行
このチュートリアルでは、指定されたMQTTメッセージが受信されたときにMQTTメッセージを発行する AWS IoT ルールを作成する方法を示します。受信メッセージペイロードは、発行前にルールによって変更できます。これにより、デバイスやそのファームウェアを変更することなく、特定のアプリケーションに合わせたメッセージを作成できます。また、ルールのフィルタリング機能を使用して、特定の条件が満たされた場合にのみメッセージを発行することもできます。
ルールによって再発行されたメッセージは、他の AWS IoT デバイスまたはクライアントによって送信されたメッセージと同様に動作します。デバイスは、他のメッセージトピックをサブスクライブするのと同じ方法で、再公開されたMQTTメッセージをサブスクライブできます。
このチュートリアルでは、次の内容を学習します。
-
ルールSQLクエリステートメントで単純なクエリと関数を使用する方法
-
MQTT クライアントを使用して AWS IoT ルールをテストする方法
このチュートリアルの完了には 30 分ほどかかります。
このチュートリアルでは、次の作業を行います。
このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
-
セットアップ AWS アカウント
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。
-
クライアントでMQTT AWS IoT MQTTメッセージを表示する を確認したこと
MQTT クライアントを使用してトピックをサブスクライブして公開できることを確認してください。この手順では、MQTTクライアントを使用して新しいルールをテストします。
MQTT トピックと AWS IoT ルールを確認する
AWS IoT ルールについて話す前に、MQTTプロトコルを理解するのに役立ちます。IoT ソリューションでは、 MQTT プロトコルは などの他のネットワーク通信プロトコルよりもいくつかの利点がありHTTP、IoT デバイスで使用できるように人気があります。このセクションでは、このチュートリアルに適用される MQTT の主要な側面を確認します。と MQTTの比較についてはHTTP、「」を参照してくださいデバイス通信用のアプリケーションプロトコルの選択。
MQTT プロトコル
MQTT プロトコルは、ホストとのパブリッシュ/サブスクライブ通信モデルを使用します。データを送信するには、デバイスはトピックによって識別された AWS IoT メッセージをメッセージブローカーに発行します。メッセージブローカーからメッセージを受信するために、デバイスは、サブスクリプションリクエストでトピックフィルターをメッセージブローカーに送信することにより、受信するトピックにサブスクライブします。ルールエンジンは AWS IoT MQTT、メッセージブローカーからメッセージを受信します。
AWS IoT ルール
AWS IoT ルールは、ルールクエリステートメントと 1 つ以上のルールアクションで構成されます。 AWS IoT ルールエンジンがMQTTメッセージを受信すると、これらの要素は次のようにメッセージに対して動作します。
-
ルールクエリステートメント
ルールのクエリステートメントは、使用するMQTTトピックを記述し、メッセージペイロードからのデータを解釈し、一般的なSQLデータベースで使用されるSQLステートメントに似たステートメントで説明されているようにデータをフォーマットします。クエリステートメントの結果は、ルールのアクションに送信されるデータです。
-
ルールアクション
ルール内の各ルールアクションは、ルールのクエリステートメントから得られるデータに対して動作します。 は、多くのルールアクション AWS IoT をサポートしています。ただし、このチュートリアルでは、特定のトピックを含むMQTTメッセージとしてクエリステートメントの結果を発行するRepublishルールアクションに焦点を当てます。
ステップ 1: MQTT メッセージを再発行する AWS IoT ルールを作成する
このチュートリアルで作成する AWS IoT ルールは、 device/
MQTTdevice_id
/datadevice_id
は、メッセージを送信したデバイスの ID です。これらのトピックは、device/+/data
として トピックフィルターによって記述されます。ここで、+
は、2 つのスラッシュ文字の間の任意の文字列に一致するワイルドカードです。
ルールは、一致するトピックからメッセージを受信すると、 device_id
および temperature
値をdevice/data/temp
トピックを含む新しいMQTTメッセージとして再発行します。
例えば、 device/22/data
トピックを含むMQTTメッセージのペイロードは次のようになります。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
ルールは、メッセージペイロードから temperature
値を取得し、トピックdevice_id
から 値を取得し、device/data/temp
トピックと次のようなメッセージペイロードを含むMQTTメッセージとして再発行します。
{ "device_id": "22", "temperature": 28 }
このルールでは、デバイスの ID と温度データのみを必要とするデバイスは、device/data/temp
トピックにサブスクライブして、その情報のみを受信します。
MQTT メッセージを再発行するルールを作成するには
-
AWS IoT コンソール のルールハブ
を開きます。 -
[Rules] (ルール) で、[Create] (作成) を選択して、新しいルールの作成を開始します。
-
[Create a rule] (ルールを作成) の上部で、次のように操作します。
-
[Name] (名前) で、ルールの名前を入力します。このチュートリアルでは、
republish_temp
という名前を付けます。ルール名は、アカウントとリージョン内で一意である必要があります。また、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。
-
[Description] (説明) で、ルールの説明を入力します。
わかりやすい説明を使用すると、このルールの動作と作成した理由を思い出すのに役立ちます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。
-
-
[Create a rule] (ルールを作成) の [Rule query statement] (ルールクエリステートメント) で、以下を実行します。
-
SQL バージョン の使用で、 を選択します
2016-03-23
。 -
[Rule query statement] (ルールクエリステートメント) 編集ボックスで、ステートメントを入力します。
SELECT topic(2) as device_id, temperature FROM 'device/+/data'
このステートメント:
-
トピックフィルターに一致する
device/+/data
トピックを含むMQTTメッセージをリッスンします。 -
トピック文字列から 2 番目の要素を選択し、
device_id
フィールドに割り当てます。 -
メッセージペイロードから値
temperature
フィールドを選択し、temperature
フィールドに割り当てます。
-
-
-
[Set one or more actions] (1 つ以上のアクションを設定) で、以下を実行します。
-
このルールのルールアクションのリストを開くには、[Add action] (アクションの追加) を選択します。
-
アクションを選択 で、 AWS IoT 「トピック へのメッセージの再発行」を選択します。
-
アクションリストの一番下で、[Configure action] (アクションを設定) を選択すると、選択したアクションの設定ページが開きます。
-
-
[Configure action] (アクションの設定) で、次のとおり実行します。
-
[Topic] (トピック) で、
device/data/temp
と入力します。これは、このルールが発行するメッセージのMQTTトピックです。 -
[Quality of Service] (サービスの品質) で、[0 - The message is delivered zero or more times] (0 - メッセージは 0 回以上配信されます。) を選択します。
-
で、このアクションを実行するための AWS IoT アクセスを許可するロールを選択または作成します。
-
[ロールの作成] を選択します。[Create a new role] (新しいロールを作成) ダイアログボックスが開きます。
-
新しいロールを説明する名前を入力します。このチュートリアルでは、
republish_role
を使用します。新しいロールを作成すると、ルールアクションを実行するための正しいポリシーが作成され、新しいロールにアタッチされます。このルールアクションのトピックを変更するか、別のルールアクションでこのロールを使用する場合は、そのロールのポリシーを更新して、新しいトピックまたはアクションを承認する必要があります。既存のロールを更新するには、このセクションで [Update role] (ロールの更新) を選択します。
-
[Create Role] (ロールの作成) を選択してロールを作成し、ダイアログボックスを閉じます。
-
-
[Add action] (アクションの追加) を選択してアクションをルールに追加し、[Create a rule] (ルールの作成) ページに戻ります。
-
-
AWS IoT トピックアクションにメッセージを再発行する が 1 つ以上のアクションを設定する にリストされるようになりました。
新しいアクションのタイルの [Republish a message to an AWS IoT topic] (IoT トピックにメッセージを再発行する) をクリックすると、再発行アクションが発行されるトピックが表示されます。
このルールに追加するルールアクションはこれだけです。
-
[Create a rule] (ルールの作成) で、一番下までスクロールし、[Create rule] (ルールの作成) を選択してルールを作成し、この手順を完了します。
ステップ 2: 新しいルールをテストする
新しいルールをテストするには、MQTTクライアントを使用して、このルールで使用されるMQTTメッセージを公開およびサブスクライブします。
MQTT コンソールで AWS IoT クライアント
MQTT クライアントを使用してルールをテストするには
-
MQTT コンソール の AWS IoT クライアントで
、入力トピックをサブスクライブします。この場合は です device/+/data
。-
MQTT クライアントで、サブスクリプション で、トピック にサブスクライブを選択します。
-
[Subscription topic] (サブスクリプショントピック) で、入力トピックフィルター
device/+/data
のトピックを入力します。 -
残りのフィールドはデフォルト設定のままにします。
-
[Subscribe to topic] を選択します。
[Subscriptions] (サブスクリプション) 列の [Publish to a topic] (トピックへの発行) の下に
device/+/data
が表示されます。
-
-
ルールが発行するトピックをサブスクライブします:
device/data/temp
。-
[Subscriptions] (サブスクリプション) で、[Subscribe to a topic] (トピックへサブスクライブする) を再度選択し、[Subscription topic] (サブスクリプショントピック) で、再発行されたメッセージのトピック
device/data/temp
を入力します。 -
残りのフィールドはデフォルト設定のままにします。
-
[Subscribe to topic] を選択します。
[Subscriptions] (サブスクリプション) 列の [device/+/data] の下に
device/data/temp
が表示されます。
-
-
特定のデバイス ID
device/22/data
を使用して入力トピックにメッセージを発行します。ワイルドカード文字を含むMQTTトピックに公開することはできません。-
MQTT クライアントで、サブスクリプション で、トピック に発行 を選択します。
-
[Publish] (発行) フィールドに、入力トピック名
device/22/data
を入力します。 -
ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
MQTT メッセージを送信するには、「トピック に発行」を選択します。
-
-
送信されたメッセージを確認します。
-
MQTT クライアントでは、サブスクリプション の下に、以前にサブスクライブした 2 つのトピックの横に緑色のドットがあります。
緑のドットは、最後に表示した後に 1 つ以上の新しいメッセージを受信したことを示します。
-
[Subscriptions] (サブスクリプション) で [device/+/data] を選択して、メッセージペイロードが今発行したものと一致し、次のようになっていることを確認します。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
[Subscriptions] (サブスクリプション) で、[device/data/temp] を選択して、再発行されたメッセージペイロードが次のようになっていることを確認します。
{ "device_id": "22", "temperature": 28 }
device_id
値は引用符で囲まれた文字列で、temperature
値は数値であることに注意してください。これは、topic()
関数が入力メッセージのトピック名から文字列を抽出している一方で、temperature
値は入力メッセージのペイロードの数値を使用することによるものです。device_id
値を数値にしたい場合は、ルールクエリステートメントでtopic(2)
を次のように置き換えます。cast(topic(2) AS DECIMAL)
topic(2)
値を数値にキャストすることは、トピックのその部分に数字のみが含まれている場合にのみ機能することに注意してください。
-
-
正しいメッセージが device/data/temp トピックに発行されたことが確認できれば、ルールは機能しています。再発行ルールアクションの詳細については、次のセクションを参照してください。
device/+/data または device/data/temp トピックのいずれかに正しいメッセージが発行されたことが確認できない場合は、トラブルシューティングのヒントを確認してください。
再発行メッセージルールのトラブルシューティング
想定する結果が表示されない場合に備えて、確認すべき事項をいくつかご紹介します。
-
エラーバナーが表示された
入力メッセージの発行時にエラーが発生した場合は、まずそのエラーを修正してください。次の手順は、このエラーを修正するのに役立つ場合があります。
-
MQTT クライアントに入力メッセージが表示されない
入力メッセージを
device/22/data
トピックに発行するたびに、手順で説明されているようにdevice/+/data
トピックフィルターにサブスクライブすると、そのメッセージがMQTTクライアントに表示されるはずです。確認すべき事項
-
サブスクライブしたトピックフィルターを確認する
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。
メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
-
メッセージ発行機能を確認する
MQTT クライアントで、サブスクリプション で device/+/data を選択し、発行メッセージのトピックを確認してから、トピック に発行を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
-
-
MQTT クライアントに再公開されたメッセージが表示されない
ルールが機能するには、メッセージを受信および再発行することを許可する正しいポリシーを有しており、メッセージを受信する必要があります。
確認すべき事項
-
AWS リージョン MQTT クライアントの と作成したルールを確認する
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
-
ルールクエリステートメントの入力メッセージのトピックを確認する
ルールが機能するには、ルールクエリステートメントの FROM句のトピックフィルターに一致するトピック名を含むメッセージを受信する必要があります。
ルールクエリステートメントのトピックフィルターのスペルを、MQTTクライアント内のトピックのスペルで確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
-
入力メッセージペイロードの内容を確認する
ルールが機能するには、SELECTステートメントで宣言されたメッセージペイロードのデータフィールドを見つける必要があります。
ルールクエリステートメントの
temperature
フィールドのスペルと、MQTTクライアント内のメッセージペイロードのスペルを確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントのtemperature
フィールドはメッセージペイロードのtemperature
フィールドと同じである必要があります。メッセージペイロード内のJSONドキュメントが正しくフォーマットされていることを確認します。にカンマの欠落などのエラーJSONがある場合、ルールはそれを読み取ることができません。
-
ルールアクションで再発行されたメッセージトピックを確認する
ルールの再発行アクションが新しいメッセージを公開するトピックは、MQTTクライアントでサブスクライブしたトピックと一致する必要があります。
コンソールで作成したルールを開き、ルールアクションがメッセージを再発行するトピックを確認します。
-
ルールによって使用されているロールを確認する
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。
ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。
これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。
-
ステップ 3: 結果と次のステップを確認する
このチュートリアルでは、次の作業を行いました。
-
ルールSQLクエリステートメントで単純なクエリといくつかの関数を使用して、新しいMQTTメッセージを生成しました。
-
新しいメッセージを再発行するルールを作成しました。
-
MQTT クライアントを使用して AWS IoT ルールをテストしました。
次のステップ
このルールでいくつかのメッセージを再発行した後、チュートリアルのいくつかの側面を変更すると、再発行メッセージにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。
-
の変更
device_id
入力メッセージのトピックで、再公開されたメッセージペイロードの効果を観察します。 -
ルールクエリステートメントで選択したフィールドを変更し、再発行されたメッセージペイロードに生じる影響を確認します。
-
このシリーズの次のチュートリアルを試して、チュートリアル: Amazon SNS通知の送信 の方法を学びましょう。
このチュートリアルで使用する [Republish] (再発行) ルールアクションも、ルールクエリステートメントのデバッグに役立ちます。例えば、このアクションをルールに追加して、ルールクエリステートメントがルールアクションで使用されるデータをどのようにフォーマットしているかを確認できます。