翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
チュートリアル: Device SDK AWS IoT Core を使用して AWS IoT デバイスを に接続する
このチュートリアルでは、デバイスを に接続 AWS IoT Core して、データを送受信する方法を示します AWS IoT。このチュートリアルを完了する AWS IoT Core と、デバイスが に接続するように設定され、デバイスが と通信する方法を理解できます AWS IoT。
トピック
前提条件
このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。
-
AWS IoT Core チュートリアルの開始方法 を完了していること
デバイスを設定する する必要があるチュートリアルのセクションで、デバイスの Raspberry Pi または他のデバイスを接続する オプションを選択し、Python 言語オプションを使用してデバイスを設定します。
注記
このチュートリアルでも使用するため、そのチュートリアルで使用するターミナルウィンドウは開いたままにします。
-
Device SDK v2 for 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 SDK の AWS IoT
configureEndpoint
メソッドを使用して、ホスト名とポート番号を設定できます。myAWSIoTMQTTClient.configureEndpoint("random.iot.region.amazonaws.com", 8883)
-
のデバイスを準備します。 AWS IoT
AWS IoT Core チュートリアルの開始方法 では、デバイスと AWS アカウントが通信できるように準備しました。このセクションでは、 とのデバイス接続に適用される準備の側面を確認します AWS IoT Core。
デバイスの AWS IoT Core接続に際して
-
AWS アカウント が必要です。
の手順セットアップ AWS アカウントでは、 をまだ作成 AWS アカウント していない場合に を作成する方法について説明します。
-
そのアカウントでは、 AWS アカウント および リージョンのデバイスに次のAWS IoT リソースを定義する必要があります。
AWS IoT リソースの作成 の手順では、 AWS アカウント とリージョンのデバイス用にこれらのリソースを作成する方法が示されています。
-
AWS IoT に登録され、デバイスを認証するために有効化されたデバイス証明書。
多くの場合、証明書は AWS IoT モノのオブジェクトを使用して作成され、そのオブジェクトにアタッチされます。モノのオブジェクトはデバイスが に接続するためには必要ありませんが AWS IoT、追加の AWS IoT 機能がデバイスで利用可能になります。
-
デバイス証明書にアタッチされたポリシーで、接続 AWS IoT Core して必要なすべてのアクションを実行することを許可します。
-
-
AWS アカウントのデバイスエンドポイントにアクセスできるインターネット接続。
デバイスエンドポイントは で説明AWS IoT デバイスデータとサービスエンドポイントされており、AWS IoT コンソールの設定ページ
に表示されます。 -
通信ソフトウェア ( 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 Python の pubsub.py
サンプルアプリケーションを確認します。ここでは、 に接続 AWS IoT Core して MQTT メッセージを発行およびサブスクライブする方法を確認します。次のセクションでは、デバイスが接続および通信する方法を調べるのに役立ついくつかの演習を示します AWS IoT Core。
pubsub.py サンプルアプリケーションは、 との MQTT 接続のこれらの側面を示しています AWS IoT Core。
通信プロトコル
pubsub.py
サンプルは、MQTT および MQTT over WSS プロトコルを使用した MQTT 接続を示しています。AWS 共通ランタイム (AWS CRT)
MQTT
pubsub.py
サンプルは、 で mtls_from_path
(ここに示す) を呼び出しmqtt_connection_builder
mtls_from_path
は X.509 証明書と TLS v1.2 を使用してデバイスを認証します。CRT AWS ライブラリは、その接続の下位レベルの詳細を処理します。
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_builder
websockets_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
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 MQTT メッセージとして解釈するように、HTTPS AWS IoT Core を使用して にメッセージを送信します。
はデバイスからの 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 レベルの定数を定義します。
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 テストクライアントpubsub.py
このセクションでは、以下を行います。
これらの演習では、pubsub.py
サンプルプログラムから始めます。
注記
これらの演習では、AWS IoT Core チュートリアルの開始方法 のチュートリアルを完了しており、そのチュートリアルのデバイスのターミナルウィンドウを使用していることを前提としています。
ワイルドカードトピックフィルターをサブスクライブする
この演習では、pubsub.py
を呼び出してワイルドカードトピックフィルターをサブスクライブするために使用するコマンドラインを変更し、メッセージのトピックに基づいて受信したメッセージを処理します。
演習手順
この演習では、デバイスに温度制御と照明制御が含まれていると想像してください。これらのトピック名を使用して、トピックに関するメッセージを識別します。
-
演習を開始する前に、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
開始方法のチュートリアルで見たのと同じ出力が表示されるはずです。
-
この演習では、これらのコマンドラインパラメータを変更します。
アクション
コマンドラインパラメータ
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
で終わるメッセージをリッスンしています。それでは、それをテストしてみましょう。 -
デバイスが受信する可能性のあるメッセージをいくつか示します。
トピック名
メッセージペイロード
device/temp/details
{ "desiredTemp": 20, "currentTemp": 15 }
device/light/details
{ "desiredLight": 100, "currentLight": 50 }
-
AWS IoT コンソールで MQTT テストクライアントを使用して、前のステップで説明したメッセージをデバイスに送信します。
-
AWS IoT コンソールで MQTT テストクライアント
を開きます。 -
[Subscribe to topic] (トピックへのサブスクライブ) の [Subscription topic] (トピックのサブスクリプション) フィールドで、トピックフィルター
device/+/details
を入力して、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。 -
MQTT テストクライアントの [Subscriptions] (サブスクリプション) 列で、[device/+/details] を選択します。
-
上記の表の各トピックについて、MQTT テストクライアントで次の操作を行います。
-
[Publish] (発行) で、テーブルの [Topic name] (トピック名) 列の値を入力します。
-
トピック名の下のメッセージペイロードフィールドに、表の [Message payload] (メッセージペイロード) 列の値を入力します。
-
pubsub.py
が実行されているターミナルウィンドウを確認し、MQTT テストクライアントで [Publish to topic] (トピックに発行) を選択します。
ターミナルウィンドウで
pubsub.py
によってメッセージが受信されたことがわかります。 -
-
演習結果
これにより、pubsub.py
は、ワイルドカードトピックフィルターを使用してメッセージをサブスクライブし、それらを受信し、ターミナルウィンドウに表示しました。単一のトピックフィルターをサブスクライブし、2 つの異なるトピックを持つメッセージを処理するためにコールバック関数が呼び出されたことに注意してください。
トピックフィルターのサブスクリプションを処理する
前の演習に基づいて、pubsub.py
サンプルアプリケーションを変更してメッセージトピックを評価し、トピックに基づいてサブスクライブされたメッセージを処理します。
演習手順
メッセージトピックを評価するには
-
pubsub.py
をpubsub2.py
にコピーします。 -
お好きなテキストエディタまたは IDE で
pubsub2.py
を開きます。 -
pubsub2.py
で、on_message_received
関数を見つけます。 -
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.")
-
このコマンドラインを使用して、変更を保存し、変更したプログラムを実行します。
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
-
AWS IoT コンソールで、MQTT テストクライアント
を開きます。 -
[Subscribe to topic] (トピックへのサブスクライブ) の [Subscription topic] (トピックのサブスクリプション) フィールドで、トピックフィルター
device/+/details
を入力して、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。 -
MQTT テストクライアントの [Subscriptions] (サブスクリプション) 列で、[device/+/details] を選択します。
-
この表の各トピックについて、MQTT テストクライアントで次の操作を行います。
トピック名
メッセージペイロード
device/temp/details
{ "desiredTemp": 20, "currentTemp": 15 }
device/light/details
{ "desiredLight": 100, "currentLight": 50 }
-
[Publish] (発行) で、テーブルの [Topic name] (トピック名) 列の値を入力します。
-
トピック名の下のメッセージペイロードフィールドに、表の [Message payload] (メッセージペイロード) 列の値を入力します。
-
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 ドキュメントとして読み取ることはできません。この演習では、読み取り可能なメッセージペイロードに JSON ドキュメントを発行できるようにサンプルアプリを変更します AWS IoT Core。
演習手順
この演習では、次のメッセージが device/data
トピックとともに送信されます。
{ "timestamp": 1601048303, "sensorId": 28, "sensorData": [ { "sensorName": "Wind speed", "sensorValue": 34.2211224 } ] }
この演習のメッセージを監視するように MQTT テストクライアントを準備するには
-
[Subscribe to topic] (トピックへのサブスクライブ)の[Subscription topic field] (トピックのサブスクリプションフィールド)で、topic filter(トピックフィルター)
device/data
を入力して、[Subscribe to topic] (トピックへのサブスクライブ) を選択します。 -
MQTT テストクライアントの [Subscriptions] (サブスクリプション) 列で、[device/data] (デバイス/データ) を選択します。
-
MQTT テストクライアントウィンドウを開いたままにして、デバイスからのメッセージを待ちます。
pubsub.py サンプルアプリケーションで JSON ドキュメントを送信するには
-
デバイスで、
pubsub.py
をpubsub3.py
にコピーします。 -
pubsub3.py
を編集して、発行するメッセージのフォーマット方法を変更します。-
テキストエディタで
pubsub3.py
を開きます。 -
次のコード行を見つけます。
message = "{} [{}]".format(message_string, publish_count)
-
次のように変更します。
message = "{}".format(message_string)
-
次のコード行を見つけます。
message_json = json.dumps(message)
-
次のように変更します。
message = "{}".json.dumps(json.loads(message))
-
変更を保存します。
-
-
デバイス上でこのコマンドを実行して、メッセージを 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
-
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 、以下のチュートリアルを試してください。