デバイスシャドウサービス通信のシミュレーション - 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 つはコマンドラインプロンプトです。

デバイスの初期化

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

モノのオブジェクトとその 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 クライアント で、[Subscribe to topic] (トピックのサブスクライブ) を選択します。

  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の 、 という名前の simShadow1 というモノのオブジェクトをサポートします。

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 client] (MQTT クライアント) で、[Publish to a topic] (トピックへの発行) を選択し、このトピックを入力します。

    $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 クライアント で、サブスクリプション列の $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 ソリューションをモデル化します。