チュートリアル: AWS IoT Device SDK を使用してデバイスを AWS IoT Core に接続する - AWS IoT Core

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

チュートリアル: AWS IoT Device SDK を使用してデバイスを AWS IoT Core に接続する

このチュートリアルでは、AWS IoT との間でデータを送受信できるように、デバイスを AWS IoT Core に接続する方法を示します。このチュートリアルを完了すると、デバイスが AWS IoT Core に接続するように設定され、デバイスが AWS IoT と通信する方法を理解できるようになります。

このチュートリアルでは、次の作業を行います。

このチュートリアルの完了には 1 時間ほどかかります。

このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
  • はじめてみる AWS IoT Core を完了していること

    デバイスを設定する する必要があるチュートリアルのセクションで、デバイスの Raspberry Pi または他のデバイスを接続する オプションを選択し、Python 言語オプションを使用してデバイスを設定します。

    このチュートリアルでも使用するため、そのチュートリアルで使用するターミナルウィンドウは開いたままにします。

  • AWS IoT Device SDK v2 for Python を実行できるデバイス。

    このチュートリアルでは、Python コード例を使用してデバイスを AWS IoT Core に接続する方法を示します。これらの例では、比較的強力なデバイスが必要です。

    リソースに制約のあるデバイスを使用している場合は、これらのコード例が機能しない可能性があります。その場合、チュートリアル: の使用 AWS IoT Device SDK for Embedded C チュートリアルでより多くの成功する可能性があります。

AWS IoT 用にデバイスを準備する

はじめてみる AWS IoT Core では、デバイスと AWS アカウントが通信できるように準備しました。このセクションでは、AWS IoT Core とのデバイス接続に適用されるその準備の側面を確認します。

デバイスの AWS IoT Core 接続に際して

  1. AWS アカウント が必要です。

    以下をセットアップします。 AWS アカウント の手順では、AWS アカウント を作成する方法が記載されています (まだ持っていない場合)。

  2. そのアカウントでは、AWS アカウント とリージョンのデバイス用に次の AWS IoT リソースが定義されている必要があります。

    AWS IoT リソースを作成してください。 の手順では、AWS アカウント とリージョンのデバイス用にこれらのリソースを作成する方法が示されています。

    • AWS IoT に登録され、デバイスを認証するために有効化されたデバイス証明書

      多くの場合、証明書は AWS IoT モノのオブジェクトを使用して作成され、そのオブジェクトにアタッチされます。デバイスが AWS IoT に接続するためにモノのオブジェクトは必要ありませんが、モノのオブジェクトがあることで、追加の AWS IoT 機能がデバイスで利用可能になります。

    • AWS IoT Core に接続し、必要なすべてのアクションを実行することを許可するデバイス証明書にアタッチされたポリシー

  3. AWS アカウント のデバイスエンドポイントにアクセスできるインターネット接続

    デバイスのエンドポイントは、AWS IoT デバイスデータおよびサービスエンドポイント で説明され、AWS IoT コンソールの設定ページで表示できます。

  4. 通信ソフトウェア (AWS IoT Device SDK が提供するものなど)。このチュートリアルでは、AWS IoT Device SDK v2 for Python を使用します。

MQTT プロトコルを確認する

サンプルアプリケーションについて説明する前に、MQTT プロトコルを理解しておくと役立ちます。MQTT プロトコルには、HTTP などの他のネットワーク通信プロトコルに比べていくつかの利点があり、IoT デバイスで一般的な選択肢となっています。このセクションでは、このチュートリアルに適用される MQTT の主要な側面を確認します。MQTT と HTTP を比較する方法の詳細については、「デバイス通信用のプロトコルの選択」を参照してください。

MQTT は、発行/サブスクライブ通信モデルを使用します

MQTT プロトコルは、ホストとの発行/サブスクライブ通信モデルを使用します。このモデルは、HTTP が使用するリクエスト/応答モデルとは異なります。MQTT では、デバイスは一意のクライアント ID によって識別されるホストとのセッションを確立します。データを送信するために、デバイスはトピックによって識別されたメッセージをホストのメッセージブローカーに発行します。メッセージブローカーからメッセージを受信するために、デバイスは、サブスクリプションリクエストでトピックフィルターをメッセージブローカーに送信することにより、トピックをサブスクライブします。

MQTT サポート永続セッション

メッセージブローカーは、デバイスからメッセージを受信し、サブスクライブしているデバイスにメッセージを発行します。永続セッション (開始デバイスが切断されている場合でもアクティブなセッション) では、デバイスは、切断中に発行されたメッセージを取得できます。デバイス側では、MQTT は、デバイスによって送信されたメッセージをホストが確実に受信できるようにするサービス品質レベル (QoS) をサポートします。

pubsub.py Device SDK サンプルアプリケーションを確認する

このセクションでは、このチュートリアルで使用されている AWS IoT Device SDK v2 for Pythonpubsub.py サンプルアプリケーションを確認します。ここでは、AWS IoT Core に接続して MQTT メッセージを発行およびサブスクライブする方法を確認します。次のセクションでは、デバイスが AWS IoT Core に接続して通信する方法を詳しく知るのに役立ついくつかの演習を紹介します。

pubsub.py サンプルアプリケーションは、AWS IoT Core を使用した MQTT 接続の次の側面を示しています。

通信プロトコル

pubsub.py サンプルは、MQTT および MQTT over WSS プロトコルを使用した MQTT 接続を示しています。AWS 共通ランタイム (AWS CRT) ライブラリは、低レベルの通信プロトコルサポートを提供し、AWS IoT Device SDK v2 for Python に含まれています。

MQTT

pubsub.py サンプルでは、mqtt_connection_buildermtls_from_path (ここに表示されています) を呼び出して、MQTT プロトコルを使用して AWS IoT Core との接続を確立します。mtls_from_path は、X.509 証明書と TLS v1.2 を使用してデバイスを認証します。AWS CRT ライブラリは、その接続の下位レベルの詳細を処理します。

mqtt_connection = mqtt_connection_builder.mtls_from_path( endpoint=args.endpoint, cert_filepath=args.cert, pri_key_filepath=args.key, ca_filepath=args.ca_file, client_bootstrap=client_bootstrap, on_connection_interrupted=on_connection_interrupted, on_connection_resumed=on_connection_resumed, client_id=args.client_id, clean_session=False, keep_alive_secs=6 )
endpoint

AWS アカウント の IoT デバイスエンドポイント

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

cert_filepath

デバイスの証明書ファイルへのパス

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

pri_key_filepath

証明書ファイルで作成されたデバイスのプライベートキーファイルへのパス

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

ca_filepath

Root CA ファイルへのパス。MQTT サーバーがまだトラストストアにない証明書を使用する場合にのみ必要です。

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

client_bootstrap

ソケット通信アクティビティを処理する共通ランタイムオブジェクト

サンプルアプリケーションでは、このオブジェクトは mqtt_connection_builder.mtls_from_path の呼び出しの前にインスタンス化されます。

on_connection_interrupted
on_connection_resumed

デバイスの接続が中断され、再開されたときに呼び出すコールバック関数

client_id

AWS リージョン でこのデバイスを一意に識別する ID

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

clean_session

新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合)

keep_alive_secs

CONNECT リクエストで送信するキープアライブ値 (秒単位)。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

MQTT over WSS

pubsub.py サンプルでは、mqtt_connection_builderwebsockets_with_default_aws_signing (ここに表示されています) を呼び出して、WSS 経由で MQTT プロトコルを使用して AWS IoT Core との接続を確立します。websockets_with_default_aws_signing は、署名 V4 を使用して WSS 経由で MQTT 接続を作成し、デバイスを認証します。

mqtt_connection = mqtt_connection_builder.websockets_with_default_aws_signing( endpoint=args.endpoint, client_bootstrap=client_bootstrap, region=args.signing_region, credentials_provider=credentials_provider, websocket_proxy_options=proxy_options, ca_filepath=args.ca_file, on_connection_interrupted=on_connection_interrupted, on_connection_resumed=on_connection_resumed, client_id=args.client_id, clean_session=False, keep_alive_secs=6 )
endpoint

AWS アカウント の IoT デバイスエンドポイント

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

client_bootstrap

ソケット通信アクティビティを処理する共通ランタイムオブジェクト

サンプルアプリケーションでは、このオブジェクトは mqtt_connection_builder.websockets_with_default_aws_signing の呼び出しの前にインスタンス化されます。

region

署名 V4 認証で使用される AWS 署名リージョン。pubsub.py では、コマンドラインに入力されたパラメータを渡します。

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

credentials_provider

認証に使用するために提供される AWS 認証情報

サンプルアプリケーションでは、このオブジェクトは mqtt_connection_builder.websockets_with_default_aws_signing の呼び出しの前にインスタンス化されます。

websocket_proxy_options

HTTP プロキシオプション (プロキシホストを使用している場合)

サンプルアプリケーションでは、この値は mqtt_connection_builder.websockets_with_default_aws_signing の呼び出しの前に初期化されます。

ca_filepath

Root CA ファイルへのパス。MQTT サーバーがまだトラストストアにない証明書を使用する場合にのみ必要です。

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

on_connection_interrupted
on_connection_resumed

デバイスの接続が中断され、再開されたときに呼び出すコールバック関数

client_id

AWS リージョン でこのデバイスを一意に識別する ID。

サンプルアプリケーションでは、この値はコマンドラインから渡されます。

clean_session

新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合)

keep_alive_secs

CONNECT リクエストで送信するキープアライブ値 (秒単位)。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

HTTPS

HTTPS について説明します。AWS IoT Core は、HTTPS リクエストを発行するデバイスをサポートしています。プログラミングの観点からは、デバイスは他のアプリケーションと同様に HTTPS リクエストを AWS IoT Core に送信します。デバイスから HTTP メッセージを送信する Python プログラムの例については、Python の requests ライブラリを使用した HTTPS コード例を参照してください。この例では、AWS IoT Core が MQTT メッセージとして解釈できるように、HTTPS を使用して AWS IoT Core にメッセージを送信します。

AWS IoT Core はデバイスからの HTTPS リクエストをサポートしていますが、デバイスの通信に使用するプロトコルを十分な情報に基づいて決定できるように、デバイス通信用のプロトコルの選択 に関する情報を必ず確認してください。

永続セッション

サンプルアプリケーションでは、clean_session パラメータを False に設定して、接続を永続化する必要があることを示します。実際には、これは、この呼び出しによって開かれた接続が、既存の永続セッション (存在する場合) に再接続することを意味します。そうでなければ、新しい永続セッションを作成して接続します。

永続セッションでは、デバイスに送信されたメッセージは、デバイスが接続されていない間、メッセージブローカーによって保存されます。デバイスが永続セッションに再接続すると、メッセージブローカーは、サブスクライブしている保存済みメッセージをデバイスに送信します。

永続セッションがない場合、デバイスは、デバイスが接続されていないときに送信されたメッセージを受信しません。どのオプションを使用するかは、アプリケーションと、デバイスが接続されていないときに発生するメッセージを通信する必要があるかどうかによって異なります。詳細については、「」を参照してくださいMQTT 永続的セッション

サービスの品質

デバイスがメッセージを発行してサブスクライブする際に優先される Quality of Service (QoS、サービスの品質) を設定できます。AWS IoT は、発行およびサブスクライブの操作について、QoS レベル 0 および 1 をサポートしています。AWS IoT の QoS レベルの詳細については、MQTTサービス (QoS) 品質オプション を参照してください。

Python 用の AWS CRT ランタイムは、サポートする QoS レベル用に次の定数を定義します。

Python サービス品質レベル
MQTT QoS レベル SDK で使用される Python シンボリック値 説明
QoS レベル 0 mqtt.QoS.AT_MOST_ONCE メッセージの送信は、受信されたかどうかにかかわらず、1 回だけ行われます。例えば、デバイスが接続されていない場合やネットワークエラーがある場合など、メッセージがまったく送信されない場合があります。
QoS レベル 1 mqtt.QoS.AT_LEAST_ONCE メッセージは、PUBACK 確認応答を受信するまで繰り返し送信されます。

サンプルアプリケーションでは、発行およびサブスクライブのリクエストは QoS レベル 1 (mqtt.QoS.AT_LEAST_ONCE) で行われます。

  • 発行での QoS

    デバイスが QoS レベル 1 のメッセージを発行すると、メッセージブローカーからの PUBACK 応答を受信するまでメッセージが繰り返し送信されます。デバイスが接続されていない場合、メッセージは再接続後に送信されるようにキューに入れられます。

  • サブスクライブでの QoS

    デバイスが QoS レベル 1 のメッセージをサブスクライブすると、メッセージブローカーは、デバイスに送信できるようになるまで、デバイスがサブスクライブしているメッセージを保存します。メッセージブローカーは、デバイスから PUBACK 応答を受信するまでメッセージを再送信します。

メッセージの発行

AWS IoT Core への接続が正常に確立された後、デバイスはメッセージを発行できます。pubsub.py サンプルでは、mqtt_connection オブジェクトの publish オペレーションを呼び出してこれを行います。

mqtt_connection.publish( topic=args.topic, payload=message, qos=mqtt.QoS.AT_LEAST_ONCE )
topic

メッセージを識別するメッセージのトピック名

サンプルアプリケーションでは、これはコマンドラインから渡されます。

payload

文字列としてフォーマットされたメッセージペイロード (例: JSON ドキュメント)

サンプルアプリケーションでは、これはコマンドラインから渡されます。

JSON ドキュメントは一般的なペイロード形式であり、他の AWS IoT サービスによって認識される形式です。ただし、メッセージペイロードのデータ形式は、パブリッシャーとサブスクライバーが合意するものであれば何でも構いません。ただし、他の AWS IoT サービスでは、いくつかのケースにおいて、ほとんどのオペレーションで JSON と CBOR のみが認識されます。

qos

このメッセージの QoS レベル

メッセージのサブスクリプション

AWS IoT やその他のサービスおよびデバイスからメッセージを受信するために、デバイスはトピック名でそれらのメッセージをサブスクライブします。デバイスは、トピック名を指定して個々のメッセージをサブスクライブし、ワイルドカード文字を含めることができるトピックフィルターを指定してメッセージのグループをサブスクライブできます。この pubsub.py サンプルでは、ここに示すコードを使用してメッセージをサブスクライブし、受信後にメッセージを処理するためのコールバック関数を登録します。

subscribe_future, packet_id = mqtt_connection.subscribe( topic=args.topic, qos=mqtt.QoS.AT_LEAST_ONCE, callback=on_message_received ) subscribe_result = subscribe_future.result()
topic

サブスクライブするトピック。これは、トピック名またはトピックフィルターにすることができます。

サンプルアプリケーションでは、これはコマンドラインから渡されます。

qos

デバイスが切断されている間、メッセージブローカーがこれらのメッセージを保存する必要があるかどうか。

mqtt.QoS.AT_LEAST_ONCE (QoS レベル 1) の値では、接続の作成時に永続セッションを指定する必要があります (clean_session=False)。

callback

サブスクライブされたメッセージを処理するために呼び出す関数。

mqtt_connection.subscribe 関数は、future とパケット ID を返します。サブスクリプションリクエストが正常に開始された場合、返されるパケット ID は 0 より大きくなります。サブスクリプションがメッセージブローカーによって受信され、登録されたことを確認するには、コード例に示すように、非同期オペレーションの結果が返されるまで待機する必要があります。

コールバック関数

pubsub.py サンプルのコールバックは、デバイスがサブスクライブされたメッセージを受信したときに処理します。

def on_message_received(topic, payload, **kwargs): print("Received message from topic '{}': {}".format(topic, payload)) global received_count received_count += 1 if received_count == args.count: received_all_event.set()
topic

メッセージのトピック

これは、トピックフィルターにサブスクライブしている場合でも、受信したメッセージの特定のトピック名です。

payload

メッセージペイロード

このフォーマットはアプリケーション固有です。

kwargs

mqtt.Connection.subscribe で説明されている可能な追加の引数。

pubsub.py サンプルでは、on_message_received はトピックとそのペイロードのみを表示します。また、制限に達した後、プログラムを終了するために受信したメッセージもカウントします。

アプリケーションはトピックとペイロードを評価して、実行するアクションを決定します。

デバイスの切断と再接続

pubsub.py サンプルには、デバイスが切断されたときと接続が再確立されたときに呼び出されるコールバック関数が含まれています。これらのイベントに対してデバイスが実行するアクションは、アプリケーション固有です。

デバイスが初めて接続するとき、受信するトピックをサブスクライブする必要があります。再接続時にデバイスのセッションが存在する場合、そのサブスクリプションが復元され、それらのサブスクリプションから保存されたメッセージは再接続後にデバイスに送信されます。

再接続時にデバイスのセッションが存在しない場合は、サブスクリプションを再サブスクライブする必要があります。永続セッションには有効期限があり、デバイスが切断されている時間が長すぎると期限切れになる可能性があります。

デバイスを接続して AWS IoT Core と通信する

このセクションでは、デバイスの AWS IoT Core への接続のさまざまな側面を詳しく知るのに役立ついくつかの演習を紹介します。これらの演習では、AWS IoT コンソールで MQTT テストクライアントを使用して、デバイスが発行する内容を確認し、デバイスにメッセージを発行します。これらの演習では、AWS IoT Device SDK v2 for Pythonpubsub.py サンプルを使用し、はじめてみる AWS IoT Core のチュートリアルの経験に基づいて構築します。

これらの演習では、pubsub.py サンプルプログラムから始めます。

注記

これらの演習では、はじめてみる AWS IoT Core のチュートリアルを完了しており、そのチュートリアルのデバイスのターミナルウィンドウを使用していることを前提としています。

ワイルドカードトピックフィルターをサブスクライブする

この演習では、pubsub.py を呼び出してワイルドカードトピックフィルターをサブスクライブするために使用するコマンドラインを変更し、メッセージのトピックに基づいて受信したメッセージを処理します。

演習手順

この演習では、デバイスに温度制御と照明制御が含まれていると想像してください。これらのトピック名を使用して、トピックに関するメッセージを識別します。

  1. 演習を開始する前に、はじめてみる AWS IoT Core のチュートリアルのこのコマンドをデバイスで実行して、演習の準備がすべて整っていることを確認してください。

    cd ~/aws-iot-device-sdk-python-v2/samples python3 pubsub.py --topic topic_1 --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint

    開始方法のチュートリアルで見たのと同じ出力が表示されるはずです。

  2. この演習では、これらのコマンドラインパラメータを変更します。

    アクション

    コマンドラインパラメータ

    Effect

    追加

    --message ""

    リッスンのみを実行するように pubsub.py を設定する

    追加

    --count 2

    2 通のメッセージを受信した後にプログラムを終了する

    変更

    --topic device/+/details

    にサブスクライブするトピックフィルターを定義する

    これらの変更を最初のコマンドラインに加えると、このコマンドラインになります。デバイスのターミナルウィンドウにこのコマンドを入力します。

    python3 pubsub.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint

    プログラムは次のように表示されます。

    Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-24d7cdcc-cc01-458c-8488-2d05849691e1'... Connected! Subscribing to topic 'device/+/details'... Subscribed with QoS.AT_LEAST_ONCE Waiting for all messages to be received...

    ターミナルにこのように表示された場合、デバイスは準備ができており、トピック名が deviceで始まり /detailで終わるメッセージをリッスンしています。それでは、それをテストしてみましょう。

  3. デバイスが受信する可能性のあるメッセージをいくつか示します。

    トピック名

    メッセージペイロード

    device/temp/details

    { "desiredTemp": 20, "currentTemp": 15 }

    device/light/details

    { "desiredLight": 100, "currentLight": 50 }

  4. AWS IoT コンソールで MQTT テストクライアントを使用して、前のステップで説明したメッセージをデバイスに送信します。

    1. AWS IoT コンソールで MQTT テストクライアントを開きます。

    2. [Subscribe to topic] (トピックへのサブスクライブ) の [Subscription topic] (トピックのサブスクリプション) フィールドで、トピックフィルター device/+/details を入力して、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。

    3. MQTT テストクライアントの [Subscriptions] (サブスクリプション) 列で、[device/+/details] を選択します。

    4. 上記の表の各トピックについて、MQTT テストクライアントで次の操作を行います。

      1. [Publish] (発行) で、テーブルの [Topic name] (トピック名) 列の値を入力します。

      2. トピック名の下のメッセージペイロードフィールドに、表の [Message payload] (メッセージペイロード) 列の値を入力します。

      3. pubsub.py が実行されているターミナルウィンドウを確認し、MQTT テストクライアントで [Publish to topic] (トピックに発行) を選択します。

      ターミナルウィンドウで pubsub.py によってメッセージが受信されたことがわかります。

演習結果

これにより、pubsub.py は、ワイルドカードトピックフィルターを使用してメッセージをサブスクライブし、それらを受信し、ターミナルウィンドウに表示しました。単一のトピックフィルターをサブスクライブし、2 つの異なるトピックを持つメッセージを処理するためにコールバック関数が呼び出されたことに注意してください。

トピックフィルターのサブスクリプションを処理する

前の演習に基づいて、pubsub.py サンプルアプリケーションを変更してメッセージトピックを評価し、トピックに基づいてサブスクライブされたメッセージを処理します。

演習手順

メッセージトピックを評価するには
  1. pubsub.pypubsub2.py にコピーします。

  2. お好きなテキストエディタまたは IDE で pubsub2.py を開きます。

  3. pubsub2.py で、on_message_received 関数を見つけます。

  4. on_message_received で、次のコードを print("Received message で始まる行の後、および global received_count で始まる行の前に挿入します。

    topic_parsed = False if "/" in topic: parsed_topic = topic.split("/") if len(parsed_topic) == 3: # this topic has the correct format if (parsed_topic[0] == 'device') and (parsed_topic[2] == 'details'): # this is a topic we care about, so check the 2nd element if (parsed_topic[1] == 'temp'): print("Received temperature request: {}".format(payload)) topic_parsed = True if (parsed_topic[1] == 'light'): print("Received light request: {}".format(payload)) topic_parsed = True if not topic_parsed: print("Unrecognized message topic.")
  5. このコマンドラインを使用して、変更を保存し、変更したプログラムを実行します。

    python3 pubsub2.py --message "" --count 2 --topic device/+/details --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint
  6. AWS IoT コンソールで MQTT テストクライアントを開きます。

  7. [Subscribe to topic] (トピックへのサブスクライブ) の [Subscription topic] (トピックのサブスクリプション) フィールドで、トピックフィルター device/+/details を入力して、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。

  8. MQTT テストクライアントの [Subscriptions] (サブスクリプション) 列で、[device/+/details] を選択します。

  9. この表の各トピックについて、MQTT テストクライアントで次の操作を行います。

    トピック名

    メッセージペイロード

    device/temp/details

    { "desiredTemp": 20, "currentTemp": 15 }

    device/light/details

    { "desiredLight": 100, "currentLight": 50 }

    1. [Publish] (発行) で、テーブルの [Topic name] (トピック名) 列の値を入力します。

    2. トピック名の下のメッセージペイロードフィールドに、表の [Message payload] (メッセージペイロード) 列の値を入力します。

    3. pubsub.py が実行されているターミナルウィンドウを確認し、MQTT テストクライアントで [Publish to topic] (トピックに発行) を選択します。

    ターミナルウィンドウで pubsub.py によってメッセージが受信されたことがわかります。

ターミナルウィンドウに、このような内容が表示されます。

Connecting to a3qexamplesffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-af794be0-7542-45a0-b0af-0b0ea7474517'... Connected! Subscribing to topic 'device/+/details'... Subscribed with QoS.AT_LEAST_ONCE Waiting for all messages to be received... Received message from topic 'device/light/details': b'{ "desiredLight": 100, "currentLight": 50 }' Received light request: b'{ "desiredLight": 100, "currentLight": 50 }' Received message from topic 'device/temp/details': b'{ "desiredTemp": 20, "currentTemp": 15 }' Received temperature request: b'{ "desiredTemp": 20, "currentTemp": 15 }' 2 message(s) received. Disconnecting... Disconnected!

演習結果

この演習では、サンプルアプリケーションがコールバック関数で複数のメッセージを認識して処理するようにコードを追加しました。これにより、デバイスはメッセージを受信し、それに基づいてアクションを実行できます。

デバイスが複数のメッセージを受信して処理する別の方法は、異なるメッセージを個別にサブスクライブし、各サブスクリプションを独自のコールバック関数に割り当てることです。

デバイスからメッセージを発行する

pubsub.py サンプルアプリケーションを使用して、デバイスからメッセージを発行できます。メッセージをそのまま発行しますが、メッセージを JSON ドキュメントとして読み取ることはできません。この演習では、AWS IoT Core で読み取ることができるメッセージペイロードで JSON ドキュメントを発行できるようにサンプルアプリケーションを変更します。

演習手順

この演習では、次のメッセージが device/dataトピックとともに送信されます。

{ "timestamp": 1601048303, "sensorId": 28, "sensorData": [ { "sensorName": "Wind speed", "sensorValue": 34.2211224 } ] }
この演習のメッセージを監視するように MQTT テストクライアントを準備するには
  1. [Subscribe to topic] (トピックへのサブスクライブ)の[Subscription topic field] (トピックのサブスクリプションフィールド)で、topic filter(トピックフィルター) device/data を入力して、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。

  2. MQTT テストクライアントの [Subscriptions] (サブスクリプション) 列で、[device/data] (デバイス/データ) を選択します。

  3. MQTT テストクライアントウィンドウを開いたままにして、デバイスからのメッセージを待ちます。

pubsub.py サンプルアプリケーションで JSON ドキュメントを送信するには
  1. デバイスで、pubsub.pypubsub3.py にコピーします。

  2. pubsub3.py を編集して、発行するメッセージのフォーマット方法を変更します。

    1. テキストエディタで pubsub3.py を開きます。

    2. 次のコード行を見つけます。

      message = "{} [{}]".format(message_string, publish_count)

    3. 次のように変更します。

      message = "{}".format(message_string)

    4. 次のコード行を見つけます。

      message_json = json.dumps(message)

    5. 次のように変更します。

      message = "{}".json.dumps(json.loads(message))

    6. 変更を保存します。

  3. デバイス上でこのコマンドを実行して、メッセージを 2 回送信します。

    python3 pubsub3.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --topic device/data --count 2 --message '{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}' --endpoint your-iot-endpoint
  4. MQTT テストクライアントで、次のようにメッセージペイロード内の JSON ドキュメントを解釈してフォーマットしたことを確認します。

    
                                AWS IoT コンソールの MQTT クライアントに JSON メッセージペイロードがどのように表示されるかを示す画像。

デフォルトでは、pubsub3.py は送信するメッセージもサブスクライブします。アプリの出力でメッセージを受信したことがわかります。ターミナルウィンドウは次のようになります。

Connecting to a3qEXAMPLEsffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-5cff18ae-1e92-4c38-a9d4-7b9771afc52f'... Connected! Subscribing to topic 'device/data'... Subscribed with QoS.AT_LEAST_ONCE Sending 2 message(s) Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]} Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}' Publishing message to topic 'device/data': {"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]} Received message from topic 'device/data': b'{"timestamp":1601048303,"sensorId":28,"sensorData":[{"sensorName":"Wind speed","sensorValue":34.2211224}]}' 2 message(s) received. Disconnecting... Disconnected!

演習結果

これにより、デバイスは AWS IoT Core に送信するメッセージを生成して基本的な接続をテストし、AWS IoT Core が処理するためのデバイスメッセージを提供できます。例えば、このアプリケーションを使用してデバイスからテストデータを送信し、AWS IoT ルールアクションをテストできます。

結果を確認する

このチュートリアルの例では、デバイスが AWS IoT ソリューションの基本部分である AWS IoT Core と通信する方法の基本を実践的に体験できます。デバイスが AWS IoT Core と通信できる場合、AWS のサービスや、デバイスがアクションを実行できる他のデバイスにメッセージを渡すことができます。同様に、AWS のサービスやその他のデバイスは情報を処理して、その結果デバイスにメッセージが返されます。

AWS IoT Core をさらに詳しく学習する準備ができたら、次のチュートリアルを試してください。