チュートリアル: Device SDK のインストールと Device Shadows のサンプルアプリケーションの実行 - AWS IoT Core

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

チュートリアル: Device SDK のインストールと Device Shadows のサンプルアプリケーションの実行

このセクションでは、必要なソフトウェアと AWS IoT Device SDK for Python をインストールし、shadow.py サンプルアプリケーションを実行して Shadow ドキュメントを編集し、Shadow の状態を制御する方法を示します。

このチュートリアルの学習内容は次のとおりです。
  • インストールされたソフトウェアと AWS IoT Device SDK for Python を使用して、サンプルアプリケーションを実行します。

  • サンプルアプリケーションを使用して値を入力すると、どのように AWS IoT コンソールで目的の値が発行されるかについて説明します。

  • shadow.py サンプルアプリケーションと、MQTT プロトコルを使用してシャドウの状態を更新する方法を確認してください。

このチュートリアルを実行する前に:

AWS アカウント を設定し、Raspberry Pi デバイスを設定し、Device Shadow サービスの MQTT 予約トピックを発行およびサブスクライブするためのアクセス許可をデバイスに与える AWS IoT モノとポリシーを作成しておく必要があります。詳細については、「」を参照してくださいチュートリアル: シャドウアプリケーションを実行するための Raspberry Pi の準備

Git、Python、AWS IoT Device SDK for Python もインストールされている必要があります。このチュートリアルは、チュートリアル Raspberry Pi または他のデバイスを接続する で提示された概念に基づいています。そのチュートリアルをまだ試していない場合は、そのチュートリアルで説明されている手順に従って証明書ファイルと Device SDK をインストールしてから、このチュートリアルに戻って shadow.py サンプルアプリケーションを実行することをお勧めします。

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

ステップ 1: shadow.py サンプルアプリケーションを実行する

shadow.py サンプルアプリケーションを実行する前に、インストールした証明書ファイルの名前と場所に加えて、次の情報が必要です。

アプリケーションパラメータ値

Parameter

値がある場所

your-iot-thing-name

ステップ 2: モノのリソースを作成し、ポリシーをモノにアタッチする で以前に作成した AWS IoT モノの名前。

この値を見つけるには、AWS IoT コンソールで [Manage] (管理) を選択し、[Things] (モノ) を選択します。

your-iot-endpoint

your-iot-endpoint 値の形式は endpoint_id-ats.iot.region.amazonaws.com です (例: a3qj468EXAMPLE-ats.iot.us-west-2.amazonaws.com)。この値を検索するには:

  1. AWS IoT コンソールで、[Manage] (管理)、[Things] (モノ) の順に選択します。

  2. デバイス用に作成した IoT モノである My_light_bulb (以前に使用しました) を選択してから、[Interact] (操作) を選択します。モノの詳細ページで エンドポイントは、[HTTPS] セクションに表示されます。

サンプルアプリケーションをインストールして実行する
  1. サンプルアプリディレクトリに移動します。

    cd ~/aws-iot-device-sdk-python-v2/samples
  2. コマンドラインウィンドウで、示されているように your-iot-endpointyour-iot-thing-name を置き換えて、このコマンドを実行します。

    python3 shadow.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint --thing_name your-iot-thing-name
  3. サンプルアプリケーションが次のようになっていることを観察します。

    1. アカウントの AWS IoT サービスに接続します。

    2. Delta イベントと Update および Get 応答をサブスクライブします。

    3. ターミナルに必要な値を入力するように求められます。

    4. 次のような出力を表示します。

    Connecting to a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-0c8ae2ff-cc87-49d2-a82a-ae7ba1d0ca5a'... Connected! Subscribing to Delta events... Subscribing to Update responses... Subscribing to Get responses... Requesting current shadow state... Launching thread to read user input... Finished getting initial shadow state. Shadow contains reported value 'off'. Enter desired value:
注記

shadow.py サンプルアプリケーションの実行に問題がある場合は、ステップ 3: shadow.py サンプルアプリケーションの問題をトラブルシューティングする を確認してください。問題の修正に役立つ可能性のある追加情報を取得するには、コマンドラインに --verbosity debug パラメータを追加して、サンプルアプリケーションが実行内容に関する詳細メッセージを表示するようにします。

値を入力し、Shadow ドキュメントの更新を観察する

ターミナルに desired 値を入力して値を指定すると、reported 値も更新されます。ターミナルで色 yellow を入力するとします。reported 値も色 yellow に更新されます。ターミナルに表示されるメッセージを次に示します。

Enter desired value: yellow Changed local shadow value to 'yellow'. Updating reported shadow value to 'yellow'... Update request published. Finished updating reported shadow value to 'yellow'.

この更新リクエストを発行すると、AWS IoT はモノのリソースのデフォルトのクラシックシャドウを作成します。作成したモノのリソース (例: My_light_bulb) の Shadow ドキュメントを参照することで、AWS IoT コンソールの reported および desired 値に発行した更新リクエストを確認できます。Shadow ドキュメントで更新を表示するには、次の操作を行います。

  1. AWS IoT コンソールで、[Manage] (管理)、[Things] (モノ) の順に選択します。

  2. 表示されるモノのリストで、作成したモノを選択し、[Shadows] (シャドウ) を選択してから、[Classic Shadow] (クラシックシャドウ) を選択します。

Shadow ドキュメントは次のようになり、色 yellow に設定された reporteddesired の値が表示されます。これらの値は、ドキュメントの [Shadow の状態] のセクションに表示されます。

{ "desired": { "welcome": "aws-iot", "color": "yellow" }, "reported": { "welcome": "aws-iot", "color": "yellow" } }

リクエストのタイムスタンプ情報とバージョン番号を含む [メタデータ] セクションも表示されます。

状態ドキュメントのバージョンを使用して、デバイスのシャドウのドキュメントの最新バージョンを更新していることを確認できます。別の更新リクエストを送信すると、バージョン番号が 1 ずつ増えます。更新リクエストでバージョンを渡したとき、そのバージョンと状態ドキュメントの現在のバージョンとが一致しない場合、サービスは HTTP 409 conflict レスポンスコードでリクエストを拒否します。

{ "metadata": { "desired": { "welcome": { "timestamp": 1620156892 }, "color": { "timestamp": 1620156893 } }, "reported": { "welcome": { "timestamp": 1620156892 }, "color": { "timestamp": 1620156893 } } }, "version": 10 }

Shadow ドキュメントについてさらに学び、状態情報の変化を観察するには、このチュートリアルの ステップ 4: 結果と次のステップを確認する セクションで説明されている次のチュートリアル チュートリアル: サンプルアプリケーションと MQTT テストクライアントを使用した Device Shadow とのやり取り に進んでください。必要に応じて、次のセクションで shadow.py サンプルコードとそれが MQTT プロトコルを使用する方法について学ぶこともできます。

ステップ 2: shadow.py Device SDK サンプルアプリケーションを確認する

このセクションでは、このチュートリアルで使用されている AWS IoT Device SDK v2 for Pythonshadow.py サンプルアプリケーションを確認します。ここでは、MQTT および MQTT over WSS プロトコルを使用して AWS IoT Core に接続する方法を確認します。AWS 共通ランタイム (AWS-CRT) ライブラリは、低レベルの通信プロトコルサポートを提供し、AWS IoT Device SDK v2 for Python に含まれています。

このチュートリアルでは MQTT と MQTT over WSS を使用していますが、AWS IoT は HTTPS リクエストを発行するデバイスをサポートしています。デバイスから HTTP メッセージを送信する Python プログラムの例については、Python の requests ライブラリを使用した HTTPS コード例を参照してください。

デバイス通信に使用するプロトコルについて十分な情報に基づいた決定を行う方法については、デバイス通信用のアプリケーションプロトコルの選択 を確認してください。

MQTT

shadow.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 エンドポイントであり、client_id は、AWS リージョン でこのデバイスを一意に識別する ID です。

  • cert_filepathpri_key_filepath、および ca_filepath は、デバイスの証明書とプライベートキーファイル、およびルート CA ファイルへのパスです。

  • client_bootstrap は、ソケット通信アクティビティを処理する共通のランタイムオブジェクトであり、mqtt_connection_builder.mtls_from_path の呼び出しの前にインスタンス化されます。

  • on_connection_interrupted および on_connection_resumed は、デバイスの接続が中断されて再開されるときに呼び出すコールバック関数です。

  • clean_session は、新しい永続セッションを開始するか、既存のセッションに再接続するか (存在する場合) です。keep_alive_secsCONNECT リクエストで送信するキープアライブ値 (秒単位) です。この間隔で ping が自動的に送信されます。サーバーは、この値の 1.5 倍の時間が経過しても ping を受信しなかった場合、接続が失われたとみなします。

この shadow.py サンプルでは、WSS 経由で MQTT プロトコルを使用して AWS IoT Core との接続を確立するために mqtt_connection_builderwebsockets_with_default_aws_signing も呼び出します。MQTT over WSS も MQTT と同じパラメータを使用し、次の追加パラメータを受け取ります。

  • region は、署名 V4 認証で使用される AWS 署名リージョンであり、credentials_provider は、認証に使用するために提供される AWS 認証情報です。リージョンはコマンドラインから渡され、credentials_provider オブジェクトは mqtt_connection_builder.websockets_with_default_aws_signing の呼び出しの直前にインスタンス化されます。

  • websocket_proxy_options は、プロキシホストを使用する場合の HTTP プロキシオプションです。shadow.py サンプルアプリケーションでは、この値は mqtt_connection_builder.websockets_with_default_aws_signing の呼び出しの直前にインスタンス化されます。

Shadow トピックとイベントをサブスクライブする

shadow.py サンプルは接続の確立を試み、完全に接続されるまで待機します。接続されていない場合、コマンドはキューに入れられます。接続されると、サンプルはデルタイベントをサブスクライブし、メッセージを更新および取得し、サービスの品質 (QoS) レベル 1 (mqtt.QoS.AT_LEAST_ONCE) でメッセージを発行します。

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

MQTT プロトコルの詳細については、MQTT プロトコルを確認する および MQTT を参照してください。

このチュートリアルで使用される MQTT、MQTT over WSS、永続セッション、および QoS レベルの詳細については、「pubsub.py Device SDK サンプルアプリケーションを確認する」を参照してください。

ステップ 3: shadow.py サンプルアプリケーションの問題をトラブルシューティングする

shadow.py サンプルアプリケーションを実行すると、ターミナルにいくつかのメッセージが表示され、desired 値を入力するように求められます。プログラムがエラーをスローした場合、エラーをデバッグするには、まずシステムに対して正しいコマンドを実行したかどうかを確認します。

場合によっては、エラーメッセージは接続の問題を示し、Host name was invalid for dns resolution または Connection was closed unexpectedly のようになることがあります。このような場合、次のことを確認してみてください。

  • コマンド内のエンドポイントアドレスを確認する

    サンプルアプリケーションを実行するために入力したコマンドの endpoint 引数 (例: a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com) を確認し、AWS IoT コンソールでこの値を確認します。

    正しい値を使用したかどうかを確認するには、次の手順に従います。

    1. AWS IoT コンソールで、[Manage] (管理)、[Things] (モノ) の順に選択します。

    2. サンプルアプリケーション用に作成したモノ (例: My_light_bulb) を選択してから、[Interact] (操作) を選択します。

    モノの詳細ページで エンドポイントは、[HTTPS] セクションに表示されます。また、以下を記載したメッセージも表示されます: This thing already appears to be connected.

  • 証明書の有効化を確認する

    証明書は、AWS IoT Core でデバイスを認証します。

    証明書がアクティブかどうかを確認するには、次の手順に従います。

    1. AWS IoT コンソールで、[Manage] (管理)、[Things] (モノ) の順に選択します。

    2. サンプルアプリケーション用に作成したモノ (例: My_light_bulb) を選択してから、[Security] (セキュリティ) を選択します。

    3. 証明書を選択し、証明書の詳細ページで [証明書の選択] を選択してから、証明書の詳細ページで [アクション] を選択します。

    ドロップダウンリストで [有効化] が使用できず、[無効化] しか選択できない場合、証明書は有効です。そうでない場合は、[有効化] を選択し、サンプルプログラムを再実行します。

    それでもプログラムが実行されない場合は、certs フォルダ内の証明書ファイル名を確認してください。

  • モノのリソースにアタッチされているポリシーを確認する

    証明書がデバイスを認証している間、AWS IoT ポリシーはデバイスが MQTT 予約トピックへのサブスクライブや発行などの AWS IoT オペレーションを実行することを許可します。

    正しいポリシーがアタッチされているかどうかを確認するには、次の手順に従います。

    1. 前述したとおりに証明書を検索し、[ポリシー] を選択します。

    2. 表示されたポリシーを選択し、デバイスに MQTT 予約トピックへ発行およびサブスクライブするためのアクセス許可を付与する connectsubscribereceive、および publish アクションが説明されているかどうかを確認します。

      サンプルポリシーについては、ステップ 1: Device Shadow の AWS IoT ポリシーを作成する を参照してください。

    AWS IoT への接続に問題があることを示すエラーメッセージが表示される場合は、ポリシーに使用しているアクセス許可が原因である可能性があります。その場合は、AWS IoT リソースへのフルアクセスを提供するポリシーから始めて、サンプルプログラムを再実行することをお勧めします。現在のポリシーを編集するか、現在のポリシーを選択して [Detach] (デタッチ) を選択し、フルアクセスを提供する別のポリシーを作成してモノのリソースにアタッチすることができます。後で、プログラムの実行に必要なアクションとポリシーのみにポリシーを制限できます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:*" ], "Resource": "*" } ] }
  • Device SDK のインストールを確認する

    それでもプログラムが実行されない場合は、Device SDK を再インストールして、SDK のインストールが完了していて正しいことを確認できます。

ステップ 4: 結果と次のステップを確認する

このチュートリアルで学習した内容は次のとおりです。
  • 必要なソフトウェア、ツール、AWS IoT Device SDK for Python をインストールします。

  • サンプルアプリケーション shadow.py が、シャドウの現在の状態を取得および更新するために MQTT プロトコルを使用する方法を理解します。

  • Device Shadows のサンプルアプリケーションを実行し、AWS IoT コンソールで Shadow ドキュメントの更新を確認します。また、プログラムの実行時に問題をトラブルシューティングし、エラーを修正する方法も学びました。

次のステップ

これで、shadow.py サンプルアプリケーションを実行し、Device Shadow を使用して状態を制御できます。AWS IoT コンソールで Shadow ドキュメントの更新を観察し、サンプルアプリケーションが応答するデルタイベントを観察できます。MQTT テストクライアントを使用して、予約済みのシャドウトピックにサブスクライブし、サンプルプログラムの実行時にトピックが受信するメッセージを観察できます。このチュートリアルの実行方法の詳細については、チュートリアル: サンプルアプリケーションと MQTT テストクライアントを使用した Device Shadow とのやり取り を参照してください。