チュートリアル: MQTT メッセージの再発行
このチュートリアルでは、指定した MQTT メッセージを受信したときに MQTT メッセージを発行する AWS IoT ルールを作成する方法を示します。受信メッセージペイロードは、発行前にルールによって変更できます。これにより、デバイスやそのファームウェアを変更することなく、特定のアプリケーションに合わせたメッセージを作成できます。また、ルールのフィルタリング機能を使用して、特定の条件が満たされた場合にのみメッセージを発行することもできます。
ルールによって再発行されるメッセージは、他の AWS IoT デバイスまたはクライアントから送信されたメッセージのように機能します。デバイスは、他の MQTT メッセージトピックにサブスクライブできるのと同様に、再発行されたメッセージにサブスクライブできます。
このチュートリアルでは、次の内容を学習します。
-
ルールクエリステートメントでシンプルな SQL クエリと関数を使用する方法
-
MQTT クライアントを使用して AWS IoT ルールをテストする方法
このチュートリアルの完了には 30 分ほどかかります。
このチュートリアルでは、次の作業を行います。
このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
-
AWS アカウント を設定する
このチュートリアルを完了するには、AWS アカウント と AWS IoT コンソールが必要です。
-
AWS IoT MQTT クライアントでデバイスの 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 は多くのルールアクションをサポートしています。ただし、このチュートリアルでは、Republish ルールアクションに焦点を当てます。このアクションは、クエリステートメントの結果を特定のトピックを持つ MQTT メッセージとして発行します。
ステップ 1: MQTT メッセージを再発行するための AWS IoT ルールを作成する
このチュートリアルで作成する AWS IoT ルールは、device_id
がメッセージを送信したデバイスの ID である device/
MQTT トピックをサブスクライブします。これらのトピックは、device_id
/datadevice/+/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 メッセージを再発行するルールを作成するには
-
[Rules] (ルール) で、[Create] (作成) を選択して、新しいルールの作成を開始します。
-
[Create a rule] (ルールを作成) の上部で、次のように操作します。
-
[Name] (名前) で、ルールの名前を入力します。このチュートリアルでは、
republish_temp
という名前を付けます。ルール名は、アカウントとリージョン内で一意である必要があります。また、スペースを含めることはできません。この名前にアンダースコア文字を使用して、ルールの名前の 2 つの単語を区切りました。
-
[Description] (説明) で、ルールの説明を入力します。
わかりやすい説明を使用すると、このルールの動作と作成した理由を思い出すのに役立ちます。説明は必要なだけ長くすることができるので、できるだけ詳述してください。
-
-
[Create a rule] (ルールを作成) の [Rule query statement] (ルールクエリステートメント) で、以下を実行します。
-
[Using SQL version] (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] (アクションの追加) を選択します。
-
[Select an action] (アクションの選択) で、[Republish a message to an AWS IoT topic] (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] (ルールの作成) ページに戻ります。
-
-
[Republish a message to an AWS IoT topic] (IoT トピックにメッセージを再発行する) アクションが [Set one or more actions] (1 つ以上のアクションを設定する) に表示されるようになりました。
新しいアクションのタイルの [Republish a message to an AWS IoT topic] (IoT トピックにメッセージを再発行する) をクリックすると、再発行アクションが発行されるトピックが表示されます。
このルールに追加するルールアクションはこれだけです。
-
[Create a rule] (ルールの作成) で、一番下までスクロールし、[Create rule] (ルールの作成) を選択してルールを作成し、この手順を完了します。
ステップ 2: 新しいルールをテストする
新しいルールをテストするには、MQTT クライアントを使用して、このルールで使用される MQTT メッセージを発行して、これにサブスクライブします。
新しいウィンドウの AWS IoT コンソールで MQTT クライアント
MQTT クライアントを使用してルールをテストするには
-
AWS IoT コンソールの MQTT クライアント
で、入力トピック (この場合は device/+/data
) をサブスクライブします。-
MQTT クライアントの [Subscription] (サブスクリプション) で、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。
-
[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 クライアントの [Subscription] (サブスクリプション) で、[Publish to topic] (トピックに発行) を選択します。
-
[Publish] (発行) フィールドに、入力トピック名
device/22/data
を入力します。 -
ここに表示されているサンプルデータをコピーし、トピック名の下にある編集ボックスにサンプルデータを貼り付けます。
{ "temperature": 28, "humidity": 80, "barometer": 1013, "wind": { "velocity": 22, "bearing": 255 } }
-
MQTT メッセージを送信するには、[Publish to topic] (トピックに発行) を選択します。
-
-
送信されたメッセージを確認します。
-
MQTT クライアントの [Subscriptions] (サブスクリプション) で、以前にサブスクライブした 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
トピックにサブスクライブすると、そのメッセージは MQTT クライアントに表示されます。device/+/data
トピックフィルターを選択します。確認すべき事項
-
サブスクライブしたトピックフィルターを確認する
手順の説明に従って入力メッセージのトピックをサブスクライブした場合は、発行するたびに入力メッセージのコピーが表示されます。
メッセージが表示されない場合は、サブスクライブしたトピック名を確認し、発行したトピックと比較します。トピック名は大文字と小文字が区別されます。サブスクライブしたトピックは、メッセージペイロードを発行したトピックと同一である必要があります。
-
メッセージ発行機能を確認する
MQTT クライアントの [Subscriptions] (サブスクリプション) で、[device/+/data] を選択し、パブリッシュ メッセージのトピックを確認してから、[Publish to topic] (トピックに発行) を選択します。トピックの下にある編集ボックスからメッセージペイロードがメッセージリストに表示されるのを確認できるはずです。
-
-
MQTT クライアントに再発行されたメッセージが表示されない
ルールが機能するには、メッセージを受信および再発行することを許可する正しいポリシーを有しており、メッセージを受信する必要があります。
確認すべき事項
-
MQTT クライアントの AWS リージョン と作成したルールを確認する
MQTT クライアントを実行しているコンソールは、作成したルールと同じ AWS リージョンにある必要があります。
-
ルールクエリステートメントの入力メッセージのトピックを確認する
ルールが機能するためには、ルールクエリステートメントの FROM 句のトピックフィルターに一致するトピック名を持つメッセージを受信する必要があります。
ルールクエリステートメントのトピックフィルターの綴りを、MQTT クライアントのトピックフィルターの綴りと照らし合わせて確認します。トピック名では大文字と小文字が区別され、メッセージのトピックはルールクエリステートメントのトピックフィルターと一致する必要があります。
-
入力メッセージペイロードの内容を確認する
ルールが機能するためには、SELECT ステートメントで宣言されているメッセージペイロード内のデータフィールドを見つける必要があります。
ルールクエリステートメントの
temperature
フィールドの綴りを、MQTT クライアントのメッセージペイロードの綴りと照らし合わせて確認します。フィールド名では大文字と小文字が区別され、ルールクエリステートメントのtemperature
フィールドはメッセージペイロードのtemperature
フィールドと同じである必要があります。メッセージペイロード内の JSON ドキュメントが正しくフォーマットされていることを確認します。JSON にコンマがないなどのエラーがある場合、ルールはそれを読み取ることができません。
-
ルールアクションで再発行されたメッセージトピックを確認する
再発行ルールアクションが新しいメッセージを発行するトピックは、MQTT クライアントでサブスクライブしたトピックと一致する必要があります。
コンソールで作成したルールを開き、ルールアクションがメッセージを再発行するトピックを確認します。
-
ルールによって使用されているロールを確認する
ルールのアクションには、元のトピックを受け取り、新しいトピックを発行するためのアクセス許可が必要です。
ルールがメッセージデータを受信して再発行することを許可するポリシーは、使用されるトピックに固有です。メッセージデータの再発行に使用するトピックを変更する場合は、ルールアクションのロールを更新して、現在のトピックに一致するようにポリシーを更新する必要があります。
これが問題であると思われる場合は、再発行ルールアクションを編集して、新しいロールを作成します。ルールアクションによって作成された新しいロールは、これらのアクションを実行するために必要な権限を受け取ります。
-
ステップ 3: 結果と次のステップを確認する
このチュートリアルでは、次の作業を行いました。
-
新しい MQTT メッセージを生成するために、ルールクエリステートメントでシンプルな SQL クエリといくつかの関数を使用しました。
-
新しいメッセージを再発行するルールを作成しました。
-
MQTT クライアントを使用して AWS IoT ルールをテストしました。
次のステップ
このルールでいくつかのメッセージを再発行した後、チュートリアルのいくつかの側面を変更すると、再発行メッセージにどのように影響するかを試してみてください。手始めにいくつかアイデアをご紹介します。
-
入力メッセージのトピックで
device_id
を変更し、再発行されたメッセージ ペイロードの影響を観察します。 -
ルールクエリステートメントで選択したフィールドを変更し、再発行されたメッセージペイロードに生じる影響を確認します。
-
このシリーズの次のチュートリアルを試して、チュートリアル: Amazon SNS 通知の送信 の方法を学びましょう。
このチュートリアルで使用する [Republish] (再発行) ルールアクションも、ルールクエリステートメントのデバッグに役立ちます。例えば、このアクションをルールに追加して、ルールクエリステートメントがルールアクションで使用されるデータをどのようにフォーマットしているかを確認できます。