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

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

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

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

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

シミュレーションの設定

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

シミュレーション環境を設定するには

  1. AWS アカウント を作成するか、すでにこのシミュレーションで使用するアカウントがある場合は、この手順を省略できます。

    このトピックの例を自分で実行するには、AWS アカウント が必要です。AWS アカウント をお持ちでない場合は、「AWS アカウント のセットアップ」の説明に従ってアカウントを作成します。

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

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

[Test] (テスト) ページの AWS IoT コンソールとコマンドラインプロンプトの 2 つのウィンドウを開いておく必要があります。

デバイスの初期化

このシミュレーションでは、mySimulatedThing という名前の Thing オブジェクトと、SimShadow1 という名前のシャドウを使って作業します。

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

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

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

  2. モノがリストされている場合は [Create] (作成) ボタンをクリックします。それ以外の場合は、[Register a single thing] (単一のモノを登録) をクリックして、単一の 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 トピックを発行するには

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

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 クライアントで、[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 クライアントで、[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 状態と一致するように状態を更新した後、更新メッセージを発行して、新しい reported 状態を 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" }

デバイスの reported 状態を正常に更新すると、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 ソリューションをモデル化します。