デバイスシャドウは、デバイスから報告されたステータスと、デバイスに対して希望するステータスを保存するための JSON ファイルです。
- 1 つのデバイスにデバイスシャドウは 1 つのみです。 デバイスは、MQTT (Message Queuing Telemetry Transport) を使用してデバイスシャドウを取得および設定します。 したがって、デバイスシャドウのステータスとデバイスのステータスを同期させることができます。
- アプリケーションは、IoT Platform の SDK を使用して、デバイスシャドウを取得および設定します。 アプリケーションはデバイスシャドウを使用して、対象デバイスの最新のステータスを取得したり、希望するステータスを対象デバイスに送信したりできます。
シナリオ 1
デバイスと IoT Platform との間で、切断と再接続が頻繁に繰り返されています。 これは、ネットワークの状態が不安定なためです。 アプリケーションは、オフラインのデバイスにステータスをリクエストしても取得できず、デバイスが再接続したときに別のデバイスステータスリクエストを送信しても失敗します。
デバイスシャドウは、デバイスと同期されているので、最新のデバイスステータスに更新され、保存されています。 したがって、デバイスがオフラインかオンラインかにかかわらず、アプリケーションはデバイスシャドウから最新のデバイスステータスを取得できます。
シナリオ 2
ネットワークが安定している状態で、デバイスは複数のアプリケーションからデバイスステータスリクエストを受信し、それぞれのステータスリクエストにレスポンスする必要があります。 レスポンスの内容が同じであっても、これらのリクエストを処理するとき、デバイスが過負荷になることがあります。
IoT Platform では、デバイスはデバイスシャドウだけに同期します。 アプリケーションは、対象デバイス自体ではなく、デバイスシャドウに対して最新のデバイスステータスをリクエストできます。 したがって、アプリケーションはデバイスから切り離されます。
シナリオ3
- デバイスと IoT Platform との間で、切断と再接続が頻繁に繰り返されています。 これは、ネットワークの状態が不安定なためです。 オフライン状態のデバイスは、アプリケーションコマンドを受信できません。
- この問題は、QoS 1 または 2 (Quality of Service 1 または 2) で解決される可能性があります。 ただし、この方法を使用することは推奨しません。 この方法は、サービスの作業負荷を増加させるからです。
- IoT Platform では、デバイスシャドウに制御コマンドを保存していて、このコマンドにはアプリケーションが送信したときのタイムスタンプが含まれています。 デバイスが IoT Platform に再接続したとき、これらのコマンドを取得してタイムスタンプをチェックし、コマンドを実行するかどうかを判断します。
- オフライン状態のデバイスは、アプリケーションからコマンドを受信できません。 接続が回復したとき、デバイスはデバイスシャドウに記録されたコマンドのタイムスタンプをチェックし、有効なコマンドだけを実行します。