シャドウとの相互作用
このトピックでは、シャドウを操作するために AWS IoT が提供する 3 つの方法のそれぞれに関連するメッセージについて説明します。これらの方法には、次のものがあります。
UPDATE-
存在しない場合はシャドウを作成します。メッセージ本文に指定された状態情報で既存のシャドウの内容を更新します。AWS IoT は、更新ごとにタイムスタンプを記録して、状態が最後に更新された日時を示します。シャドウの状態が変化すると、AWS IoT はすべての MQTT サブスクライバに
/delta状態とdesired状態の違いを示すreportedメッセージを送信します。/deltaメッセージを受信するデバイスまたはアプリは、違いに基づいてアクションを実行できます。たとえば、デバイスは自らの状態を desired 状態に更新でき、アプリケーションはデバイスの状態の変更を表示するようにその UI を更新できます。 GET-
メタデータを含むシャドウの完全な状態を含む現在のシャドウドキュメントを取得します。
DELETE-
デバイスシャドウとそのコンテンツを削除します。
削除したデバイスシャドウドキュメントを復元することはできませんが、削除したデバイスシャドウドキュメントの名前で新しいデバイスシャドウを作成することはできます。過去 48 時間以内に削除されたものと同じ名前のデバイスシャドウドキュメントを作成した場合、新しいデバイスシャドウドキュメントのバージョン番号は、削除されたデバイスのシャドウドキュメントのバージョン番号の続きになります。デバイスシャドウドキュメントが 48 時間より前に削除されている場合、同じ名前の新しいデバイスシャドウドキュメントのバージョン番号は 0 になります。
プロトコルサポート
AWS IoT は、MQTT
状態の要求と報告
AWS IoT とシャドウを使用して IoT ソリューションを設計する場合、変更を要求するアプリやデバイスと、それらを実装するアプリやデバイスを決定する必要があります。通常、デバイスは変更をシャドウに実装して報告し、アプリとサービスはシャドウの変更に応答して要求します。ソリューションは異なる場合がありますが、このトピックの例では、クライアントアプリまたはサービスがシャドウの変更を要求し、デバイスがその変更を実行してシャドウに報告することを前提としています。
シャドウの更新
アプリまたはサービスは、UpdateThingShadow API を使用するか、/update トピックに発行することで、シャドウの状態を更新できます。更新は、リクエストで指定したフィールドにのみ反映されます。
クライアントが状態の変更を要求したときのシャドウの更新
クライアントが MQTT プロトコルを使用してシャドウの状態の変更を要求した場合
-
クライアントには、変更するプロパティを識別できるように、現在のシャドウドキュメントが必要です。現在のシャドウドキュメントを取得する方法については、/get アクションを参照してください。
-
クライアントは、次の MQTT トピックにサブスクライブします。
-
$aws/things/thingName/shadow/name/shadowName/update/accepted -
$aws/things/thingName/shadow/name/shadowName/update/rejected -
$aws/things/thingName/shadow/name/shadowName/update/delta -
$aws/things/thingName/shadow/name/shadowName/update/documents
-
-
クライアントは、シャドウの desired 状態を含む状態ドキュメントを持つ
$aws/things/リクエストトピックを発行します。変更するプロパティのみをドキュメントに含める必要があります。これは、desired 状態のドキュメントの例です。thingName/shadow/name/shadowName/update{ "state": { "desired": { "color": { "r": 10 }, "engine": "ON" } } } -
更新リクエストが有効な場合、AWS IoT はシャドウ内の desired 状態を更新し、次のトピックに関するメッセージを発行します。
-
$aws/things/thingName/shadow/name/shadowName/update/accepted -
$aws/things/thingName/shadow/name/shadowName/update/delta
/update/acceptedメッセージには /accepted レスポンス状態ドキュメント シャドウドキュメントが含まれ、/update/deltaメッセージには /delta レスポンス状態ドキュメント シャドウドキュメントが含まれます。 -
-
更新リクエストが有効でない場合、AWS IoT は、エラーを説明する エラーレスポンスドキュメント シャドウドキュメントとともに
$aws/things/トピックを含むメッセージを発行します。thingName/shadow/name/shadowName/update/rejected
クライアントが API を使用してシャドウの状態の変更を要求した場合
-
クライアントは、
UpdateThingShadowAPI と リクエスト状態ドキュメント 状態ドキュメントをメッセージ本文として使用します。 -
リクエストが有効な場合、AWS IoT はレスポンスメッセージ本文として HTTP 成功レスポンスコードと /accepted レスポンス状態ドキュメント シャドウドキュメントを返します。
AWS IoT は、サブスクライブするデバイスまたはクライアントの /delta レスポンス状態ドキュメント シャドウドキュメントを含む MQTT メッセージも
$aws/things/トピックに発行します。thingName/shadow/name/shadowName/update/delta -
リクエストが有効でない場合、AWS IoT はレスポンスメッセージ本文として HTTP エラーレスポンスコード エラーレスポンスドキュメント を返します。
デバイスが /desired トピックに関する /update/delta 状態を受信すると、デバイス内で必要な変更を行います。次に、/update トピックにメッセージが送信され、現在の状態がシャドウに報告されます。
デバイスが現在の状態を報告したときにシャドウを更新する
デバイスが MQTT プロトコルを使用して現在の状態をシャドウに報告する場合
-
デバイスは、シャドウを更新する前に、次の MQTT トピックにサブスクライブする必要があります。
-
$aws/things/thingName/shadow/name/shadowName/update/accepted -
$aws/things/thingName/shadow/name/shadowName/update/rejected -
$aws/things/thingName/shadow/name/shadowName/update/delta -
$aws/things/thingName/shadow/name/shadowName/update/documents
-
-
デバイスは、この例のように、現在の状態を報告する
$aws/things/トピックにメッセージを発行することによって、現在の状態を報告します。thingName/shadow/name/shadowName/update{ "state": { "reported" : { "color" : { "r" : 10 }, "engine" : "ON" } } } -
AWS IoT が更新を受け入れると、/accepted レスポンス状態ドキュメント シャドウドキュメントを含むメッセージを
$aws/things/トピックに発行します。thingName/shadow/name/shadowName/update/accepted -
更新リクエストが有効でない場合、AWS IoT は、エラーを説明する エラーレスポンスドキュメント シャドウドキュメントとともに
$aws/things/トピックを含むメッセージを発行します。thingName/shadow/name/shadowName/update/rejected
デバイスが API を使用して現在の状態をシャドウに報告する場合
-
デバイスは、リクエスト状態ドキュメント 状態ドキュメントをメッセージ本文として使用して
UpdateThingShadowAPI を呼び出します。 -
リクエストが有効な場合、AWS IoT はシャドウを更新し、レスポンスメッセージ本文として /accepted レスポンス状態ドキュメント シャドウドキュメントを含む HTTP 成功レスポンスコードを返します。
AWS IoT は、サブスクライブするデバイスまたはクライアントの /delta レスポンス状態ドキュメント シャドウドキュメントを含む MQTT メッセージも
$aws/things/トピックに発行します。thingName/shadow/name/shadowName/update/delta -
リクエストが有効でない場合、AWS IoT はレスポンスメッセージ本文として HTTP エラーレスポンスコード エラーレスポンスドキュメント を返します。
オプティミスティックロック
状態ドキュメントのバージョンを使用して、デバイスのシャドウドキュメントの最新バージョンを更新していることを確認できます。更新リクエストでバージョンを渡したとき、そのバージョンと状態ドキュメントの現在のバージョンとが一致しない場合、サービスは HTTP 409 conflict レスポンスコードでリクエストを拒否します。競合レスポンスコードは、ThingShadow を変更するすべての API (DeleteThingShadow を含む) でも発生する可能性があります。
以下に例を示します。
初期ドキュメント:
{ "state": { "desired": { "colors": [ "RED", "GREEN", "BLUE" ] } }, "version": 10 }
更新: (バージョンが一致しないと、リクエストは拒否される)
{ "state": { "desired": { "colors": [ "BLUE" ] } }, "version": 9 }
結果:
{ "code": 409, "message": "Version conflict", "clientToken": "426bfd96-e720-46d3-95cd-014e3ef12bb6" }
更新: (バージョンが一致すると、リクエストは受け入れられる)
{ "state": { "desired": { "colors": [ "BLUE" ] } }, "version": 10 }
最終状態:
{ "state": { "desired": { "colors": [ "BLUE" ] } }, "version": 11 }
シャドウキュメントの取得
シャドウドキュメントは、GetThingShadow API を使用するか、/get トピックをサブスクライブして発行することによって取得できます。これにより、desired 状態と reported 状態の間の delta を含む、完全なシャドウドキュメントが取得されます。このタスクの手順は、デバイスまたはクライアントがリクエストを行っているかどうかにかかわらず同じです。
MQTT プロトコルを使用してシャドウドキュメントを取得するには
-
デバイスまたはクライアントは、シャドウを更新する前に、次の MQTT トピックにサブスクライブする必要があります。
-
$aws/things/thingName/shadow/name/shadowName/get/accepted -
$aws/things/thingName/shadow/name/shadowName/get/rejected
-
-
デバイスまたはクライアントは、空のメッセージ本文を持つ
$aws/things/トピックにメッセージを発行します。thingName/shadow/name/shadowName/get -
リクエストが成功すると、AWS IoT はメッセージ本文に /accepted レスポンス状態ドキュメント を含むメッセージを
$aws/things/トピックに発行します。thingName/shadow/name/shadowName/get/accepted -
リクエストが有効でなかった場合、AWS IoT はメッセージ本文に エラーレスポンスドキュメント を含むメッセージを
$aws/things/トピックに発行します。thingName/shadow/name/shadowName/get/rejected
REST API を使用してシャドウドキュメントを取得するには
-
デバイスまたはクライアントは、空のメッセージ本文で
GetThingShadowAPI を呼び出します。 -
リクエストが有効な場合、AWS IoT はレスポンスメッセージ本文として /accepted レスポンス状態ドキュメント シャドウドキュメントを含む HTTP 成功レスポンスコードを返します。
-
リクエストが有効でない場合、AWS IoT はレスポンスメッセージ本文として HTTP エラーレスポンスコード エラーレスポンスドキュメント を返します。
シャドウデータの削除
シャドウデータを削除するには、シャドウドキュメント内の特定のプロパティを削除する方法と、シャドウを完全に削除する方法の 2 つがあります。
-
シャドウから特定のプロパティを削除するには、シャドウを更新します。ただし、削除するプロパティの値を
nullに設定します。値がnullのフィールドは、シャドウドキュメントから削除されます。 -
シャドウ全体を削除するには、DeleteThingShadow API を使用するか、/delete トピックに発行します。
注記
シャドウを削除しても、すぐにバージョン番号がゼロにリセットされるわけではありません。48 時間後にゼロにリセットされます。
シャドウドキュメントからのプロパティの削除
MQTT プロトコルを使用してシャドウからプロパティを削除するには
-
デバイスまたはクライアントには、変更するプロパティを識別できるように、現在のシャドウドキュメントが必要です。現在のシャドウドキュメントを取得する方法については、シャドウキュメントの取得 を参照してください。
-
デバイスまたはクライアントは、次の MQTT トピックにサブスクライブします。
-
$aws/things/thingName/shadow/name/shadowName/update/accepted -
$aws/things/thingName/shadow/name/shadowName/update/rejected
-
-
デバイスまたはクライアントは、削除するシャドウのプロパティに
$aws/things/値を割り当てる状態ドキュメントを含むthingName/shadow/name/shadowName/updatenullリクエストトピックを発行します。変更するプロパティのみをドキュメントに含める必要があります。これは、engineプロパティを削除するドキュメントの例です。{ "state": { "desired": { "engine": null } } } -
更新リクエストが有効な場合、AWS IoT はシャドウ内の指定されたプロパティを削除し、メッセージ本文に /accepted レスポンス状態ドキュメント シャドウドキュメントと
$aws/things/トピックを含むメッセージを発行します。thingName/shadow/name/shadowName/update/accepted -
更新リクエストが有効でない場合、AWS IoT は、エラーを説明する エラーレスポンスドキュメント シャドウドキュメントとともに
$aws/things/トピックを含むメッセージを発行します。thingName/shadow/name/shadowName/update/rejected
REST API を使用してシャドウからプロパティを削除するには
-
デバイスまたはクライアントは、削除するシャドウのプロパティに
null値を割り当てる リクエスト状態ドキュメント を使用してUpdateThingShadowAPI を呼び出します。削除するプロパティのみをドキュメントに含めます。これは、engineプロパティを削除するドキュメントの例です。{ "state": { "desired": { "engine": null } } } -
リクエストが有効な場合、AWS IoT はレスポンスメッセージ本文として HTTP 成功レスポンスコードと /accepted レスポンス状態ドキュメント シャドウドキュメントを返します。
-
リクエストが有効でない場合、AWS IoT はレスポンスメッセージ本文として HTTP エラーレスポンスコード エラーレスポンスドキュメント を返します。
シャドウの削除
デバイスのシャドウを削除に関する考慮事項を次に示します。
-
デバイスのシャドウ状態を
nullに設定しても、シャドウは削除されません。シャドウのバージョンは、次の更新時に増分されます。 -
デバイスのシャドウを削除しても、Thing オブジェクトは削除されません。Thing オブジェクトを削除しても、対応するデバイスのシャドウは削除されません。
-
シャドウを削除しても、すぐにバージョン番号がゼロにリセットされるわけではありません。48 時間後にゼロにリセットされます。
MQTT プロトコルを使用してシャドウを削除するには
-
デバイスまたはクライアントは、次の MQTT トピックにサブスクライブします。
-
$aws/things/thingName/shadow/name/shadowName/delete/accepted -
$aws/things/thingName/shadow/name/shadowName/delete/rejected
-
-
デバイスまたはクライアントは、空のメッセージバッファを持つ
$aws/things/を発行します。thingName/shadow/name/shadowName/delete -
削除リクエストが有効な場合、AWS IoT はシャドウを削除し、メッセージ本文に
$aws/things/トピックと省略形の /accepted レスポンス状態ドキュメント シャドウドキュメントを含むメッセージを発行します。次に、受け入れられた削除メッセージの例を示します。thingName/shadow/name/shadowName/delete/accepted{ "version": 4, "timestamp": 1591057529 } -
更新リクエストが有効でない場合、AWS IoT は、エラーを説明する エラーレスポンスドキュメント シャドウドキュメントとともに
$aws/things/トピックを含むメッセージを発行します。thingName/shadow/name/shadowName/delete/rejected
REST API を使用してシャドウを削除するには
-
デバイスまたはクライアントは、空のメッセージバッファを使用して
DeleteThingShadowAPI を呼び出します。 -
リクエストが有効な場合、AWS IoT は HTTP 成功レスポンスコードと、メッセージ本文に /accepted レスポンス状態ドキュメント と省略形の /accepted レスポンス状態ドキュメント シャドウドキュメントを含めて返します。次に、受け入れられた削除メッセージの例を示します。
{ "version": 4, "timestamp": 1591057529 } -
リクエストが有効でない場合、AWS IoT はレスポンスメッセージ本文として HTTP エラーレスポンスコード エラーレスポンスドキュメント を返します。