デバイスシャドウサービス通信のシミュレーション - AWS IoT Core

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

デバイスシャドウサービス通信のシミュレーション

このトピックでは、Device Shadow サービスが仲介として動作する方法を示し、デバイスおよびアプリはシャドウを使用してデバイスの状態を更新、保存、取得できます。

このトピックで説明されているインタラクションをデモンストレーションし、さらに詳しく調べるには、 AWS アカウント と を実行するシステムが必要です AWS CLI。これらがない場合は、コード例で相互作用を確認できます。

この例では、 AWS IoT コンソールはデバイスを表します。は、シャドウを介してデバイスにアクセスするアプリケーションまたはサービス AWS CLI を表します。 AWS CLI インターフェイスは、アプリケーションAPIが との通信に使用する と非常に似ています AWS IoT。この例のデバイスはスマート電球で、アプリは電球の状態を表示し、電球の状態を変更できます。

シミュレーションの設定

これらの手順では、デバイスをシミュレートする AWS IoT コンソールと、アプリをシミュレートするコマンドラインウィンドウを開いてシミュレーションを初期化します。

シミュレーション環境を設定するには
  1. このトピックの例を自分で実行 AWS アカウント するには、 が必要です。がない場合は AWS アカウント、「」の説明に従って作成しますセットアップ AWS アカウント

  2. AWS IoT コンソール を開き、左側のメニューでテストを選択してMQTTクライアント を開きます。

  3. 別のウィンドウで、 AWS CLI がインストールされているシステムでターミナルウィンドウを開きます。

2 つのウィンドウを開く必要があります。1 つはテストページの AWS IoT コンソール、もう 1 つはコマンドラインプロンプトです。

デバイスの初期化

このシミュレーションでは、 という名前のモノのオブジェクトとmySimulatedThing、そのシャドウ simShadow1 を使用します。

モノのオブジェクトとその IoT ポリシーを作成する

AWS IoT コンソールでモノのオブジェクトを作成するには

  1. [Manage] (管理) を選択し、[Things] (モノ) を選択します。

  2. モノが一覧表示されている場合は、作成ボタンをクリックします。それ以外の場合は、単一のモノを登録するをクリックして、単一の AWS IoT モノを作成します。

  3. 名前 mySimulatedThing を入力し、その他の設定はデフォルトのままにして、[Next] (次へ) をクリックします。

  4. ワンクリックの証明書作成を使用して、 AWS IoTへのデバイスの接続を認証する証明書を生成します。[Activate] (有効化) をクリックして証明書を有効化します。

  5. 予約済みMQTTトピックを発行およびサブスクライブするアクセス許可をデバイスに付与My_IoT_Policyするポリシーをアタッチできます。 AWS IoT モノの作成方法とこのポリシーの作成方法の詳細については、「」を参照してくださいモノのオブジェクトを作成する

モノのオブジェクトの名前の付いたシャドウを作成する

以下に示すように、トピック $aws/things/mySimulatedThing/shadow/name/simShadow1/update に更新リクエストを発行することで、モノの名前付きシャドウを作成できます。

または、名前付きシャドウを作成するには:

  1. AWS IoT コンソールで、表示されたモノのリストから自分のモノオブジェクトを選択し、[Shadows] (シャドウ) を選択します。

  2. [Add a shadow] (シャドウの追加) を選択し、名前 simShadow1 を入力してから、[Create] (作成) を選択して名前付きシャドウを追加します。

予約済みMQTTトピックにサブスクライブして公開する

コンソールで、リザーブドシャMQTTドウトピックをサブスクライブします。これらのトピックは getupdatedelete アクションに対するレスポンスです。これにより、デバイスがアクションを発行した後にレスポンスを受信できます。

MQTT クライアントでMQTTトピックをサブスクライブするには
  1. MQTT クライアント で、トピック をサブスクライブを選択します。

  2. サブスクライブする getupdate、および delete トピックを入力します。次のリストから一度に 1 つのトピックをコピーして [Topic filter] (トピックフィルター) フィールドに貼り付け、[Subscribe] (サブスクライブ) をクリックします。[Subscriptions] (サブスクリプション) の下にトピックが表示されます。

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/delete/accepted

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/delete/rejected

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejected

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta

    • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/documents

    この時点で、シミュレートされたデバイスは、 AWS IoTによって発行されるトピックを受信する準備が整いました。

MQTT クライアントのMQTTトピックに発行するには

デバイス自体を初期化してレスポンストピックにサブスクライブした後、サポートしているシャドウを照会する必要があります。このシミュレーションでは、1 つのシャドウのみをサポートします。シャドウは、、、mySimulatedThing、 という名前のモノのオブジェクトをサポートしますsimShadow

MQTT クライアントから現在のシャドウ状態を取得するには
  1. MQTT クライアント で、トピック に発行 を選択します。

  2. [Publish] (発行) で、次のトピックを入力し、取得するトピックを入力した下のメッセージ本文ウィンドウからコンテンツを削除します。その後、[Publish to topic] (トピックに発行) を選択してリクエストを発行できます。$aws/things/mySimulatedThing/shadow/name/simShadow1/get

    名前付きシャドウ 、simShadow1 、を作成していない場合は、$aws/things/mySimulatedThing/shadow/name/simShadow1/get/rejectedトピックでメッセージを受信し、code404 の場合 (この例のように)、シャドウは作成されていないため、次に作成します。

    { "code": 404, "message": "No shadow exists with name: 'simShadow1'" }
デバイスの現在のステータスを持つシャドウを作成するには
  1. MQTT クライアント で、トピックに発行 を選択し、このトピックを入力します。

    $aws/things/mySimulatedThing/shadow/name/simShadow1/update
  2. トピックを入力した以下のメッセージ本文ウィンドウで、このシャドウドキュメントを入力して、デバイスが ID と現在の色をRGB値で報告していることを示します。[Publish] (発行) を選択してリクエストを発行します。

    { "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6" }

トピックでメッセージを受信した場合は、次のようになります。

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted: これは、シャドウが作成され、メッセージ本文に現在のシャドウドキュメントが含まれていることを意味します。

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/update/rejected: メッセージ本文内のエラーを確認します。

  • $aws/things/mySimulatedThing/shadow/name/simShadow1/get/accepted: シャドウは既に存在し、この例のようにメッセージ本文には現在のシャドウ状態があります。これにより、デバイスを設定したり、シャドウ状態と一致していることを確認したりできます。

    { "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 3, "timestamp": 1591140517, "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6" }

アプリからアップデートを送信する

このセクションでは AWS CLI 、 を使用して、アプリがシャドウとやり取りする方法を示します。

を使用してシャドウの現在の状態を取得するには AWS CLI

コマンドラインで、次のコマンドを入力します。

aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout

Windows プラットフォームでは、/dev/stdoutの代わりに con を使用できます。

aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con

シャドウが存在し、デバイスによって現在の状態を反映するように初期化されているため、次のシャドウドキュメントが返されます。

{ "state": { "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 3, "timestamp": 1591141111 }

アプリはこのレスポンスを使用して、デバイスの状態の表現を初期化できます。

エンドユーザーがスマート電球の色を黄色に変更した場合など、アプリが状態を更新した場合、アプリは update-thing-shadow コマンドを送信します。このコマンドは UpdateThingShadow REST に対応しますAPI。

アプリからシャドウを更新するには

コマンドラインで、次のコマンドを入力します。

AWS CLI v2.x
aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \ --cli-binary-format raw-in-base64-out \ --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout
AWS CLI v1.x
aws iot-data update-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 \ --payload '{"state":{"desired":{"ColorRGB":[255,255,0]}},"clientToken":"21b21b21-bfd2-4279-8c65-e2f697ff4fab"}' /dev/stdout

成功した場合、このコマンドは次のシャドウドキュメントを返します。

{ "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] } }, "version": 4, "timestamp": 1591141596, "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab" }

デバイスでの更新に応答

AWS コンソールでMQTTクライアントに戻ると、前のセクションで発行された更新コマンドを反映するために AWS IoT 発行されたメッセージが表示されます。

MQTT クライアントで更新メッセージを表示するには

MQTT クライアント でSubscriptions 列で $aws/things/mySimulatedThing/shadow/name/simShadow1/update/delta を選択します。トピック名が切り詰められている場合は、トピック名を一時停止してトピック全体を表示できます。このトピックのトピックログには、次のような /delta メッセージが表示されます。

{ "version": 4, "timestamp": 1591141596, "state": { "ColorRGB": [ 255, 255, 0 ] }, "metadata": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "clientToken": "21b21b21-bfd2-4279-8c65-e2f697ff4fab" }

デバイスはこのメッセージの内容を処理して、デバイスの状態がメッセージ内の desired 状態と一致するように設定します。

デバイスがメッセージ内の状態と一致するようにdesired状態を更新した後、更新メッセージを公開 AWS IoT して、新しいレポートされた状態を に送信する必要があります。この手順では、MQTTクライアント でこれをシミュレートします。

デバイスからシャドウを更新するには
  1. MQTT クライアント で、トピック に発行 を選択します。

  2. メッセージ本文ウィンドウで、メッセージ本文ウィンドウの上にあるトピックフィールドに、シャドウのトピックを入力し、その後に /update アクションを入力します: $aws/things/mySimulatedThing/shadow/name/simShadow1/updateとメッセージ本文に、デバイスの現在の状態を説明するこの更新されたシャドウドキュメントを入力します。[Publish] (発行) をクリックして、更新されたデバイス状態を発行します。

    { "state": { "reported": { "ColorRGB": [255,255,0] } }, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }

    メッセージが によって正常に受信された場合 AWS IoTは、この例のように、シャドウの現在の状態を持つMQTTクライアントの $aws/things/mySimulatedThing/shadow/name/simShadow1/update/accepted メッセージログに新しいレスポンスが表示されます。

    { "state": { "reported": { "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "reported": { "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5, "timestamp": 1591142747, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }

デバイスの報告された状態が正常に更新されると AWS IoT 、 は、前述の手順でデバイスによって実行されたシャドウ更新に起因するこのメッセージ本文など、メッセージ内のシャドウ状態の包括的な説明をトピックに送信します。

{ "previous": { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 128, 128, 128 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591140517 }, { "timestamp": 1591140517 }, { "timestamp": 1591140517 } ] } }, "version": 4 }, "current": { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5 }, "timestamp": 1591142747, "clientToken": "a4dc2227-9213-4c6a-a6a5-053304f60258" }

アプリで更新を確認する

アプリは、デバイスによって報告された現在の状態をシャドウに照会できるようになりました。

を使用してシャドウの現在の状態を取得するには AWS CLI
  1. コマンドラインで、次のコマンドを入力します。

    aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 /dev/stdout

    Windows プラットフォームでは、/dev/stdoutの代わりに conを使用できます。

    aws iot-data get-thing-shadow --thing-name mySimulatedThing --shadow-name simShadow1 con
  2. シャドウは現在の状態を反映するようにデバイスによって更新されたばかりなので、次のシャドウドキュメントを返します。

    { "state": { "desired": { "ColorRGB": [ 255, 255, 0 ] }, "reported": { "ID": "SmartLamp21", "ColorRGB": [ 255, 255, 0 ] } }, "metadata": { "desired": { "ColorRGB": [ { "timestamp": 1591141596 }, { "timestamp": 1591141596 }, { "timestamp": 1591141596 } ] }, "reported": { "ID": { "timestamp": 1591140517 }, "ColorRGB": [ { "timestamp": 1591142747 }, { "timestamp": 1591142747 }, { "timestamp": 1591142747 } ] } }, "version": 5, "timestamp": 1591143269 }

シミュレーションを超える

AWS CLI (アプリを表す) とコンソール (デバイスを表す) の間の相互作用を試して、IoT ソリューションをモデル化します。