チュートリアル: デバイス AWS IoT Core を使用した への AWS IoT デバイスの接続 SDK - AWS IoT Core

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

チュートリアル: デバイス AWS IoT Core を使用した への AWS IoT デバイスの接続 SDK

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

前提条件

このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。

  • AWS IoT Core チュートリアルの開始方法 を完了していること

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

    注記

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

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

    このチュートリアルでは、比較的強力なデバイスを必要とする Python コード例 AWS IoT Core を使用して、デバイスを に接続する方法を示します。リソースに制約のあるデバイスを使用している場合は、これらのコード例が機能しない可能性があります。その場合、チュートリアル: AWS IoT Device SDK for Embedded C の使用チュートリアルでさらに成功する可能性があります。

  • デバイスに接続するために必要な情報を取得しました

    デバイスを に接続するには AWS IoT、モノの名前、ホスト名、ポート番号に関する情報が必要です。

    注記

    カスタム認証を使用してデバイスを接続することもできます AWS IoT Core。オーソライザーの Lambda 関数に渡す接続データは、使用するプロトコルによって異なります。

    • モノの名前: 接続する AWS IoT モノの名前。デバイスとして AWS IoT モノとして登録されている必要があります。詳細については、「によるデバイスの管理 AWS IoT」を参照してください。

    • ホスト名: アカウント固有の IoT エンドポイントのホスト名。

    • ポート番号: 接続先のポート番号。

    Python の AWS IoT configureEndpointメソッドを使用してSDK、ホスト名とポート番号を設定できます。

    myAWSIoTMQTTClient.configureEndpoint("random.iot.region.amazonaws.com", 8883)

用のデバイスを準備する 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. Device AWS IoT などの通信ソフトウェアSDKsが提供するもの。このチュートリアルでは、 AWS IoT Device SDK v2 for Python を使用します。

MQTT プロトコルを確認する

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

MQTT がパブリッシュ/サブスクライブ通信モデルを使用する

MQTT プロトコルは、 がHTTP使用するpublish/subscribe communication model with its host. This model differs from the request/responseモデルを使用します。ではMQTT、デバイスは一意のクライアント ID で識別されるホストとのセッションを確立します。データを送信するために、デバイスはトピックによって識別されたメッセージをホストのメッセージブローカーに発行します。メッセージブローカーからメッセージを受信するために、デバイスは、サブスクリプションリクエストでトピックフィルターをメッセージブローカーに送信することにより、トピックをサブスクライブします。

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

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

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

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

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

通信プロトコル

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

MQTT

pubsub.py サンプルは、 で mtls_from_path (ここに示す) を呼び出しmqtt_connection_builderて、 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 経由 WSS

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

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

AWS 署名 V4 認証で使用される署名リージョン。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? は、HTTPSリクエストを発行するデバイス AWS IoT Core をサポートしています。プログラミングの観点から見ると、デバイスは他のアプリケーションと同様に にHTTPS AWS IoT Core リクエストを送信します。デバイスからHTTPメッセージを送信する Python プログラムの例については、Python の requestsライブラリを使用したHTTPSコード例を参照してください。この例では、 AWS IoT Core を使用して にメッセージを送信しHTTPS、 AWS IoT Core がMQTTメッセージを解釈します。

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

永続セッション

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

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

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

サービスの品質

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

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

Python サービス品質レベル
MQTT QoS レベル で使用される Python シンボリック値 SDK 説明
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 サービスは、ほとんどの場合CBOR、JSON、、および のみを認識します。

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 Python pubsub.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 field] (トピックのサブスクリプションフィールド)で、topic filter(トピックフィルター) device/+/details を入力して、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。

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

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

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

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

      3. pubsub.py が実行されているターミナルウィンドウを監視し、MQTTテストクライアントでトピックに発行を選択します。

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

演習結果

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

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

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

演習手順

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

  2. 任意のテキストエディタまたは pubsub2.pyで を開きますIDE。

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

  8. MQTT テストクライアントのサブスクリプション列で、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テストクライアントでトピックに発行を選択します。

    ターミナルウィンドウで 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ドキュメントとして読み取ることはできません。この演習では、読み取り可能なメッセージペイロードにJSONドキュメントを発行できるようにサンプルアプリケーションを変更します AWS IoT Core。

演習手順

この演習では、次のメッセージが 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 テストクライアントのサブスクリプション列で、デバイス/データを選択します。

  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 、以下のチュートリアルを試してください。