IoT Central に関するデバイスの実装とベスト プラクティス

この記事では、IoT Central アプリケーションに接続するデバイスを実装する方法について説明します。 また、ベスト プラクティスもいくつか示します。 接続プロセス全体の詳細については、デバイスの接続に関する記事を参照してください。

デバイスの実装コードのサンプルについては、「チュートリアル: クライアント アプリケーションを作成して Azure IoT Central アプリケーションに接続する」をご覧ください。

デバイスを実装する

IoT Central に接続するデバイスは、IoT プラグ アンド プレイの規則に従う必要があります。 この規則の 1 つは、デバイスが実装するデバイス モデルのモデル ID を接続時に送信する必要があることです。 IoT Central アプリケーションでは、モデル ID によりデバイスを正しいデバイス テンプレートに割り当てることができます。

IoT Central デバイス テンプレートには、その種類のデバイスで実装されるべき動作を指定する "モデル" が含まれています。 動作には、テレメトリ、プロパティ、コマンドが含まれます。

各モデルには、一意の "デジタル ツイン モデル識別子" (DTMI) があります (例: dtmi:com:example:Thermostat;1)。 デバイスは、IoT Central に接続するときに、実装するモデルの DTMI を送信します。 これにより、IoT Central は正しいデバイス テンプレートをデバイスに割り当てることができます。

IoT プラグ アンド プレイでは、Digital Twin Definition Language (DTDL) モデルの実装時にデバイスで遵守されるべき一連の規則を定義しています。

Azure IoT device SDK では、IoT プラグ アンド プレイ規則がサポートされています。

[デバイス モデル]

デバイス モデルは、DTDL V2 モデリング言語を使用して定義されます。 この言語では以下を定義できます。

  • デバイスが送信するテレメトリ。 定義にはテレメトリの名前とデータ型が含まれます。 たとえば、デバイスは温度テレメトリを double として送信します。
  • デバイスによって IoT Central にレポートされるプロパティ。 プロパティ定義には名前とデータ型が含まれます。 たとえば、デバイスはバルブの状態をブール値としてレポートします。
  • デバイスが IoT Central から受け取ることができるプロパティ。 必要に応じて、プロパティを書き込み可能としてマークできます。 たとえば、IoT Central は目標温度を double としてデバイスに送信します。
  • デバイスが応答するコマンド。 定義には、コマンドの名前、およびパラメーターの名前とデータ型が含まれます。 たとえば、デバイスは、再起動するまでの待機時間 (秒数) を指定した再起動コマンドに応答します。

Note

IoT Central では、DTDL v2 言語に対するいくつかの拡張機能が定義されています。 詳細については、「IoT Central 拡張機能」を参照してください。

DTDL モデルは、"コンポーネントなし" または "複数コンポーネント" のモデルにすることができます。

  • コンポーネントなしモデル: 単純なモデルでは、埋め込みまたはカスケードされたコンポーネントは使用されません。 すべてのテレメトリ、プロパティ、コマンドは、1 つの "ルート コンポーネント" として定義されます。 例については、Thermostat モデルを参照してください。
  • 複数コンポーネント モデル: 2 つ以上のコンポーネントを含むより複雑なモデル。 これらのコンポーネントには、1 つのルート コンポーネントと、入れ子になった 1 つ以上のコンポーネントが含まれます。 例については、Temperature Controller モデルを参照してください。

ヒント

IoT Central デバイス テンプレートから完全なデバイス モデルまたは個別のインターフェイスを DTDL v2 ファイルとしてインポートまたはエクスポートできます。

デバイス モデルについて詳しくは、「IoT プラグ アンド プレイ モデリング ガイド」を参照してください。

規約

デバイスは、IoT Central とデータを交換するときに、IoT プラグ アンド プレイ規則に従う必要があります。 規則は次のとおりです。

  • IoT Central に接続するときに DTMI を送信する。
  • 正しく書式設定された JSON ペイロードとメタデータを IoT Central に送信する。
  • IoT Central からの書き込み可能なプロパティとコマンドに正しく応答する。
  • コンポーネントのコマンドの名前付け規則に従う。

Note

現在、IoT Central では、DTDL の Array および Geospatial データ型は完全にはサポートされていません。

IoT プラグ アンド プレイ規則の詳細については、「IoT プラグ アンド プレイ規則」を参照してください。

デバイスが IoT Central と交換する JSON メッセージの形式の詳細については、「テレメトリ、プロパティ、およびコマンドのペイロード」を参照してください。

デバイスの SDK

デバイスの動作を実装するには、Azure IoT device SDK のいずれかを使用します。 コードでは、次の処理を行う必要があります。

  • デバイスを DPS に登録し、DPS からの情報を使用して、お使いの IoT Central アプリケーション内の内部 IoT ハブに接続します。
  • デバイスで実装されるモデルの DTMI を通知します。
  • デバイス モデルで指定された形式でテレメトリを送信します。 IoT Central では、デバイス テンプレート内のモデルを使用して、視覚化と分析にテレメトリを使用する方法を決定します。
  • デバイスと IoT Central の間でプロパティ値を同期させます。 モデルでは、IoT Central が情報を表示できるように、プロパティ名とデータ型を指定します。
  • モデルで指定されたコマンドのコマンド ハンドラーを実装します。 モデルでは、デバイスで使用する必要があるコマンド名とパラメーターを指定します。

デバイス テンプレートの役割の詳細については、「デバイス テンプレートとは」を参照してください。

次の表では、Azure IoT Central デバイスの機能が IoT Hub の機能にどのように対応しているかをまとめたものです。

Azure IoT Central Azure IoT Hub
テレメトリ デバイスからクラウドへのメッセージ
オフライン コマンド cloud-to-device メッセージング
プロパティ デバイス ツインの報告されるプロパティ
プロパティ (書き込み可能) デバイス ツインの必要なプロパティと報告されるプロパティ
コマンド ダイレクト メソッド

通信プロトコル

デバイスが IoT Central に接続するために使用できる通信プロトコルとしては、MQTT、AMQP、HTTPS があります。 内部的には、IoT Central では、IoT ハブが使用され、デバイスとの接続が有効になります。 IoT Hub でデバイス接続のためにサポートされている通信プロトコルの詳細については、通信プロトコルの選択に関するページを参照してください。

サポートされているプロトコルがどれもデバイスで使用できない場合は、Azure IoT Edge を使用して、プロトコルを変換します。 IoT Edge は、Azure IoT Central アプリケーションの処理負荷を軽減するための他のエッジ上のインテリジェンス シナリオをサポートします。

テレメトリのタイムスタンプ

IoT Central では、既定で、ダッシュボードとグラフにテレメトリが表示される際に、メッセージがエンキューされた時間が使用されます。 メッセージがエンキューされた時間は、IoT Central がデバイスからメッセージを受信する際に内部に設定されます。

IoT Central に送信するメッセージを作成すると、デバイスは iothub-creation-time-utc プロパティを設定できます。 このプロパティが存在する場合、ダッシュボードとグラフにテレメトリが表示される際に IoT Central で使用されます。

IoT Central アプリケーションからテレメトリをエクスポートする際に、エンキューされた時間と iothub-creation-time-utc プロパティの両方をエクスポートできます。

メッセージ プロパティの詳細については、device-to-cloud IoT Hub メッセージのシステム プロパティに関する記事を参照してください。

ベスト プラクティス

これらの推奨事項では、IoT Central に組み込まれている高可用性、ディザスター リカバリー、自動スケーリングを利用するようにデバイスを実装する方法を示します。

接続エラーを処理する

スケーリングまたはディザスター リカバリーのために、IoT Central によって基になる IoT ハブが更新されることがあります。 接続を維持するために、新しい IoT Hub エンドポイントへの接続を確立することによって、デバイス コードで特定の接続エラーを処理する必要があります。

デバイスの接続時に次のエラーのいずれかが取得された場合、デバイスでは DPS によるデバイスの再プロビジョニングを実行して新しい接続文字列を取得する必要があります。 これらのエラーは、接続文字列が有効でなくなったことを意味します。

  • IoT Hub エンドポイントに到達できません。
  • Expired security token. (セキュリティ トークンの有効期限が切れました。)
  • IoT Hub でデバイスが無効です。

デバイスの接続時に次のエラーのいずれかが取得された場合は、デバイスではバックオフ戦略を使用して接続を再試行する必要があります。 これらのエラーは、接続文字列は引き続き有効ですが、一時的な状態によってデバイスの接続が停止されていることを意味します。

  • オペレーターによってデバイスがブロックされました。
  • サービスからの内部エラー 500。

デバイス エラー コードの詳細については、デバイス接続のトラブルシューティングに関するページを参照してください。

自動再接続の実装の詳細については、「デバイスの再接続を管理して回復性があるアプリケーションを作成する」を参照してください。

フェールオーバー機能のテスト

Azure CLI を使用すると、デバイス コードのフェールオーバー機能をテストできます。 CLI コマンドは、デバイスの登録を別の内部 IoT ハブに一時的に切り替えることによって機能します。 デバイスのフェイルオーバーを確認するには、デバイスがテレメトリーを送信し、コマンドに応答していることを確認します。

デバイスのフェールオーバー テストを実行するには、次のコマンドを実行します。

az iot central device manual-failover \
    --app-id {Application ID of your IoT Central application} \
    --device-id {Device ID of the device you're testing} \
    --ttl-minutes {How to wait before moving the device back to it's original IoT hub}

ヒント

アプリケーション ID を確認するには、IoT Central アプリケーションで [アプリケーション] > [管理] に移動します。

コマンドが成功すると、次の例のような出力が表示されます。

Command group 'iot central device' is in preview and under development. Reference and support levels: https://aka.ms/CLI_refstatus
{
  "hubIdentifier": "6bd4...bafa",
  "message": "Success! This device is now being failed over. You can check your device'’'s status using 'iot central device registration-info' command. The device will revert to its original hub at Tue, 18 May 2021 11:03:45 GMT. You can choose to failback earlier using device-manual-failback command. Learn more: https://aka.ms/iotc-device-test"
}

CLI コマンドの詳細については、「az iot central device manual-failover」を参照してください。

これで、デバイスからのテレメトリがまだ IoT Central アプリケーションに届いていることを確認できます。

ヒント

さまざまなプログラミング言語でのフェールオーバーを処理するサンプルのデバイスコードについては、「IoT Central 高可用性クライアント」を参照してください。

次のステップ

推奨される次のステップは以下のとおりです。