デバイスシャドウのデータは、事前定義された MQTT トピックを介して流れます。このデータフローは、デバイスが現在のステータスを報告する、アプリケーションがデバイスに望ましい状態を送信する、デバイスがオンラインに復帰した後にシャドウのコンテンツを取得する、デバイスがシャドウプロパティを削除するという 4 つのシナリオをカバーします。
デバイスシャドウのトピック
IoT Platform は、デバイスシャドウのデータフローを処理するために、デバイスごとに 2 つのトピックを事前定義しています。
-
/shadow/update/${YourProductKey}/${YourDeviceName}デバイスとアプリケーションは、このトピックにメッセージをパブリッシュします。IoT Platform がこのトピックでメッセージを受信すると、メッセージ内のステータスでデバイスシャドウを更新します。
-
/shadow/get/${YourProductKey}/${YourDeviceName}デバイスシャドウは、このトピックにステータスの更新をパブリッシュします。デバイスは、このトピックをサブスクライブして最新のメッセージを受信します。
使用例
以下の例では、電球を使用して、デバイス、そのデバイスシャドウ、およびアプリケーションがどのように相互作用するかを説明します。これらの例は、ステータスの報告、アプリケーションからのデバイスステータスの変更、再接続時のシャドウのコンテンツの取得、シャドウプロパティの削除という 4 つすべてのデータフローシナリオをカバーしています。
例では、ProductKey は a1PbRCF**** で、DeviceName は lightbulb です。デバイスは、サービス品質 (QoS) 1 で両方のデバイスシャドウのトピックにパブリッシュおよびサブスクライブします。
デバイスによるステータス報告
デバイスがオンラインになると、現在のステータスをデバイスシャドウに報告します。その後、アプリケーションはいつでもシャドウからデバイスのステータスを読み取ることができます。
次の図はデータフローを示しています。

-
電球がオンラインになり、現在のステータスを
/shadow/update/a1PbRCF****/lightbulbトピックにパブリッシュします。JSON メッセージの形式は次のとおりです:
{ "method": "update", "state": { "reported": { "color": "red" } }, "version": 1 }表 1. パラメーターの説明
パラメーター
説明
method
操作タイプ。更新を実行する場合、メソッドは必須です。
updateに設定します。state
デバイスシャドウに送信されるステータスデータ。
reportedは必須です。値はシャドードキュメントのreportedセクションに書き込まれます。version
リクエストのバージョン。デバイスシャドウは、新しいバージョンが現在のバージョンより大きい場合にのみ更新を受け入れます。バージョンが
-1に設定されている場合、すべてのシャドウデータがクリアされ、バージョンは0にリセットされます。 -
デバイスシャドウは、報告されたステータスでシャドードキュメントを更新します。
{ "state": { "reported": { "color": "red" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } } }, "timestamp": 1469564492, "version": 1 } -
シャドードキュメントを更新した後、デバイスシャドウは
/shadow/get/a1PbRCF****/lightbulbトピックに結果を送信します。結果を確実に受信するために、更新トピックにパブリッシュする前にこのトピックをサブスクライブしてください。-
更新が成功した場合:
{ "method": "reply", "payload": { "status": "success", "version": 1 }, "timestamp": 1469564576 } -
更新が失敗した場合:
{ "method": "reply", "payload": { "status": "error", "content": { "errorcode": "${errorcode}", "errormessage": "${errormessage}" } }, "timestamp": 1469564576 }表 2. エラーコード
errorCode
errorMessage
400
無効な JSON 形式です。
401
シャドウデータに
methodフィールドがありません。402
シャドウデータに
stateフィールドがありません。403
versionフィールドの値が数値ではありません。404
シャドウデータに
reportedフィールドがありません。405
reportedフィールドが空です。406
methodの値が無効です。407
シャドウのコンテンツが空です。
408
reportedフィールドのプロパティ数が 128 を超えています。409
バージョンの競合です。
500
サーバー側の処理エラーです。
-
アプリケーションによるデバイスステータス変更
アプリケーションは UpdateDeviceShadow API を呼び出して、望ましい状態をデバイスシャドウに書き込みます。シャドウは望ましい状態をデバイスにプッシュし、デバイスは変更を適用して更新されたステータスを報告します。
次の図はデータフローを示しています。

-
アプリケーションは UpdateDeviceShadow API を呼び出して、color プロパティを green に設定します。
ShadowMessageパラメーターの値は次のとおりです:{ "method": "update", "state": { "desired": { "color": "green" } }, "version": 2 } -
デバイスシャドウは更新を受け取り、望ましい状態をシャドードキュメントに書き込みます。
{ "state": { "reported": { "color": "red" }, "desired": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } }, "desired": { "color": { "timestamp": 1469564576 } } }, "timestamp": 1469564576, "version": 2 } -
デバイスシャドウは、更新されたドキュメントを
/shadow/get/a1PbRCF****/lightbulbトピックにパブリッシュします。このとき、methodはcontrolに設定されており、これによりデバイスに要求された変更を適用するよう通知されます。{ "method": "control", "payload": { "state": { "reported": { "color": "red" }, "desired": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } }, "desired": { "color": { "timestamp": 1469564576 } } } }, "version": 2, "timestamp": 1469564576 } -
電球がオンラインで、
/shadow/get/a1PbRCF****/lightbulbトピックをサブスクライブしている場合、メッセージをすぐに受信します。デバイスは
desiredフィールドを読み取り、電球の色を緑に変更します。ステータスを更新した後、電球は最新のステータスを IoT Platform に報告します。
{ "method": "update", "state": { "reported": { "color": "green" } }, "version": 3 }説明タイムスタンプを使用してコマンドの有効期限が切れていると判断した場合、更新を実行しないことを選択できます。
デバイスシャドウは、
/shadow/get/a1PbRCF****/lightbulbトピックを介してデバイスに応答を送信します。応答形式については、「デバイスによるステータス報告」のステップ 3 をご参照ください。-
ステータスが正常に報告された後、デバイスとデバイスシャドウは望ましい状態をクリーンアップします。
-
デバイスは
/shadow/update/a1PbRCF****/lightbulbトピックにメッセージをパブリッシュして、desiredフィールドをクリアします。{ "method": "update", "state": { "desired": "null" }, "version": 4 } -
デバイスシャドウによってドキュメントが更新されます。
desiredフィールドはクリアされ、シャドウ ドキュメントには最終状態が反映されます。{ "state": { "reported": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564577 } }, "desired": { "timestamp": 1469564576 } }, "version": 4 }
-
デバイスによるシャドウのコンテンツの取得
アプリケーションがコマンドを送信したときにデバイスがオフラインだった場合、再接続後にシャドウのコンテンツを取得できます。
次の図はデータフローを示しています。

-
再接続後、電球は
/shadow/update/a1PbRCF****/lightbulbトピックにgetリクエストをパブリッシュして、最新のシャドウコンテンツを取得します。{ "method": "get" } -
デバイスシャドウは、最新のシャドウコンテンツを
/shadow/get/a1PbRCF****/lightbulbトピックにパブリッシュして応答します。レスポンスを確実に受信できるように、getリクエストを送信する前にこのトピックをサブスクライブします。{ "method": "reply", "payload": { "status": "success", "state": { "reported": { "color": "red" }, "desired": { "color": "green" } }, "metadata": { "reported": { "color": { "timestamp": 1469564492 } }, "desired": { "color": { "timestamp": 1469564576 } } } }, "version": 2, "timestamp": 1469564576 }
デバイスによるシャドウプロパティの削除
デバイスがすでに最新のステータスを持っている場合、デバイスシャドウから特定のプロパティを削除できます。
次の図はデータフローを示しています。

シャドウプロパティを削除するには、メソッドを delete に、ターゲットプロパティの値を null に設定して、/shadow/update/a1PbRCF****/lightbulb トピックにパブリッシュします。
-
シャドウから特定のプロパティを削除します。
{ "method": "delete", "state": { "reported": { "color": "null", "temperature": "null" } }, "version": 1 } -
シャドウからすべてのプロパティを削除します。
{ "method": "delete", "state": { "reported": "null" }, "version": 1 }