次の方法で共有


IoT ハブからの cloud-to-device メッセージングについて

cloud-to-device メッセージは、ソリューションのバック エンドからデバイス アプリケーションへの一方向の通知です。 Azure IoT Hub でサポートされるその他の cloud-to-device オプションの詳細については、「cloud-to-device 通信に関するガイダンス」を参照してください。

この記事で説明されている機能は、Standard レベルの IoT Hub でのみ使用できます。 Basic および Standard/Free IoT Hub レベルの詳細については、「ソリューションに適した IoT Hub レベルとサイズを選択する」を参照してください。

cloud-to-device メッセージはサービス向けエンドポイントの /messages/devicebound を介して送信します。 その後、デバイスではそのメッセージを、デバイス固有のエンドポイントの /devices/{deviceId}/messages/devicebound を介して受信します。

各 cloud-to-device メッセージのターゲットを単一のデバイスにするために、IoT ハブでは、to プロパティが /devices/{deviceId}/messages/devicebound に設定されます。

各デバイスのキューでは、最大 50 個の cloud-to-device メッセージが保持されます。 同じデバイスにメッセージをそれ以上送信しようとすると、エラーが発生します。

この記事では、cloud-to-device メッセージに関する概念とプロセスについて説明します。 cloud-to-device メッセージを処理するアプリケーションの開発に関するガイダンスについては、「cloud-to-device メッセージを送受信する」を参照してください。

cloud-to-device メッセージのライフ サイクル

少なくとも 1 回のメッセージ配信を保証するために、IoT ハブでは cloud-to-device メッセージがデバイスごとのキューに保持されます。 IoT ハブがキューからメッセージを削除する前に、デバイスはメッセージの "完了" を明示的に確認する必要があります。 このような方法で、接続とデバイスの障害に対する復元性が保証されます。

次の図は、ライフ サイクルの状態図を示しています。

cloud-to-device メッセージのライフ サイクルの状態図を示す略図。

IoT ハブ サービスでは、デバイスにメッセージを送信するときに、メッセージの状態がエンキュー に設定されます。 デバイス スレッドでメッセージを受信する準備が整うと、IoT ハブで、状態が非表示に設定され、メッセージがロックされます。 この状態では、デバイス上の他のスレッドで他のメッセージの受信を開始することが許可されます。 デバイスのスレッドでは、メッセージの処理を完了するときに、メッセージを完了することで IoT ハブに通知します。 その後、IoT ハブで状態が完了に設定されます。

デバイスは次の動作をすることもあります。

  • メッセージの拒否。この場合、IoT ハブによってメッセージの状態が配信不能 に設定されます。 これらのメッセージを回復するためのデッドレターキューはありません。 メッセージ キュー テレメトリ転送 (MQTT) プロトコル経由で接続するデバイスでは、cloud-to-device メッセージを拒否することはできません。

  • メッセージの破棄。この場合、IoT ハブによってメッセージがキューに戻され、状態がエンキュー に設定されます。 MQTT プロトコル経由で接続するデバイスでは、cloud-to-device メッセージを破棄することはできません。

スレッドでは、IoT ハブに通知することなく、メッセージの処理に失敗することもあります。 この場合、メッセージは、可視性タイムアウト (またはロック タイムアウト) の後に、 非表示 状態から エンキュー状態 に自動的に遷移します。 このタイムアウトの長さは 1 分であり、変更することはできません。

IoT ハブの最大配信数プロパティによって、メッセージの状態をエンキュー非表示 の間で切り替えることができる最大数が決まります。 その切り替えの回数に達した後、IoT ハブによってメッセージの状態が配信不能 に設定されます。 同様に、有効期限が切れた後も、IoT ハブによってメッセージの状態が配信不能 に設定されます。

メッセージの損失がアプリケーション ロジックに影響しない場合は、通常、デバイスで cloud-to-device メッセージが完了されます。 この完了の例としては、デバイスがメッセージコンテンツをローカルに保持するか、操作を正常に実行する場合があります。 また、メッセージには、メッセージの損失がアプリケーションの機能に影響しないことを示す一時的な情報が含まれている場合もあります。 タスクの実行時間が長いときに、場合によっては次の操作を実行できます。

  • デバイスがタスクの説明をローカル ストレージに保持した後、cloud-to-device メッセージを完了します。

  • タスクの進行状況のさまざまな段階で、1 つ以上の D2C メッセージによりソリューション バックエンドに通知する

メッセージの有効期限

すべての C2D メッセージに有効期限があります。 次のいずれかのオプションで有効期限が設定されます。

  • サービスの ExpiryTimeUtc プロパティ
  • IoT ハブ。IoT ハブ プロパティとして指定された既定の "有効期限" を使用します

メッセージの有効期限について詳しくは、「C2D の構成オプション」をご覧ください。

メッセージの有効期限を利用し、接続されていないデバイスにメッセージが送信されないようにする一般的な方法は、短い有効期限 の値を設定することです。 この方法では、デバイスの接続状態を維持するのと同じ結果が得られますが、より効率的です。 メッセージ受信確認を要求すると、IoT ハブから次のデバイスが通知されます。

  • メッセージを受信できます。
  • オンラインではないか、失敗した。

メッセージのフィードバック

cloud-to-device メッセージを送信するときに、サービスでは、そのメッセージの最終状態についてのメッセージごとのフィードバックの配信を要求できます。 次の 4 つの値のいずれかに、送信される cloud-to-device メッセージの iothub-ack アプリケーション プロパティを設定することで、メッセージ フィードバックを構成できます。

Ack プロパティ値 動作
なし 既定値。 IoT ハブでは、フィードバック メッセージは生成されません。
ポジティブ cloud-to-device メッセージの状態が完了 に達した場合に、IoT ハブによってフィードバック メッセージが生成されます。
ネガティブ cloud-to-device メッセージの状態が配信不能 に達した場合に、IoT ハブによってフィードバック メッセージが生成されます。
フル IoT ハブでは、いずれの場合もフィードバック メッセージが生成されます。

Ack プロパティの値が full に設定されていて、フィードバック メッセージを受け取らない場合は、フィードバック メッセージの有効期限が切れたことを意味します。 このとき、元のメッセージがどうなったかをサービスが認識することはできません。 実際には、有効期限切れになる前にフィードバックをサービスが確実に処理できることが必要です。 有効期限は最長 2 日間であるため、障害が発生した場合も、サービスを再び稼働させる時間はあります。

IoT Hub エンドポイントで説明したように、IoT Hub はサービス向けエンドポイント (/messages/servicebound/feedback) を介してメッセージとしてフィードバックを提供します。 フィードバックを受信するためのセマンティクスは C2D メッセージの場合と同様です。 可能な限り、メッセージのフィードバックは、次の形式で 1 つのメッセージのバッチとして処理します。

プロパティ 説明
EnqueuedTime ハブがフィードバック メッセージを受信した日時を示すタイムスタンプ。
UserId {iot hub name}
コンテンツタイプ application/vnd.microsoft.iothub.feedback.json

システムは、バッチが 64 メッセージに達したとき、または最後に送信されてから 15 秒のうちどちらか早い方にフィードバックを送信します。

本文はシリアル化された JSON レコードの配列で、それぞれ次のプロパティを持っています。

プロパティ 説明
enqueuedTimeUtc メッセージの結果が発生した日時を示すタイムスタンプ。 たとえば、ハブがフィードバック メッセージを受信したときや、元のメッセージの期限が切れたときを示すタイムスタンプ。
originalMessageId このフィードバック情報が関連する cloud-to-device メッセージの MessageId
StatusCode フィードバック メッセージを生成するときに IoT ハブによって使用される必須の文字列。
Success
期限 切れ
配信回数が上限を超えました
Rejected
削除
description StatusCodeの文字列値。
デバイスID フィードバックのこの要素が関連する cloud-to-device メッセージのターゲット デバイスの DeviceId
deviceGenerationId フィードバックのこの要素が関連する cloud-to-device メッセージのターゲット デバイスの DeviceGenerationId

cloud-to-device メッセージでそのフィードバックを元のメッセージと関連付けることができるように、サービスで MessageId を指定する必要があります。

次のコード例には、フィードバック メッセージの本文が示されています。

[
  {
    "originalMessageId": "0987654321",
    "enqueuedTimeUtc": "2015-07-28T16:24:48.789Z",
    "statusCode": "Success",
    "description": "Success",
    "deviceId": "123",
    "deviceGenerationId": "abcdefghijklmnopqrstuvwxyz"
  },
  {
    ...
  },
  ...
]

削除されたデバイスに対する保留中のフィードバック

デバイスが削除されると、保留中のフィードバックも削除されます。 デバイスのフィードバックはバッチで送信されます。 デバイスがメッセージの受信を確認してから、次のフィードバック バッチが準備されるまでの間に、短い期間 (多くの場合、1 秒未満) が発生する可能性があります。 その狭い期間にデバイスが削除された場合、フィードバックは発生しません。

デバイスを削除する前に、保留中のフィードバックが到着するまでしばらく待つことによって、この動作に対処できます。 デバイスが削除されると、関連するメッセージ フィードバックは失われたと見なされます。

C2D の構成オプション

各 IoT hub では、cloud-to-device メッセージング用に次の構成オプションを公開しています。

プロパティ 説明 範囲と既定値
defaultTtlAsIso8601 cloud-to-device メッセージの既定の TTL 最大 2 日の ISO_8601 書式による間隔 (最小 1 分)。既定値: 1 時間
maxDeliveryCount デバイスごとの cloud-to-device キューの最大配信数 1 から 100; 既定値: 10
feedback.ttlAsIso8601 サービス宛てのフィードバック メッセージの保有期間 最大 2 日の ISO_8601 書式による間隔 (最小 1 分)。既定値: 1 時間
feedback.maxDeliveryCount フィードバック キューの最大配信数 1 から 100; 既定値: 10
feedback.lockDurationAsIso8601(ISO8601 形式でのロック持続時間) フィードバック キューのロック期間 5 から 300 秒の ISO_8601 書式による間隔 (最短 5 秒)。既定値: 60 秒。

構成オプションは、Azure portal または Azure CLI で設定できます。

  • Azure portal: IoT ハブの [ハブ設定] で、[組み込みのエンドポイント] を選択し、[cloud-to-device メッセージング] に移動します。 ( feedback.maxDeliveryCount または feedback.lockDurationAsIso8601 プロパティの設定は、Azure portal では現在サポートされていません)。

    ポータルでの cloud-to-device メッセージングの構成オプションの設定

  • Azure CLI: az iot hub update コマンドを使用します。

    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.defaultTtlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.ttlAsIso8601=PT1H0M0S
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.maxDeliveryCount=10
    
    az iot hub update --name {your IoT hub name} \
        --set properties.cloudToDevice.feedback.lockDurationAsIso8601=PT0H1M0S
    

次のステップ

cloud-to-device メッセージの処理に使用できる SDK については、「Azure IoT Hub SDK」をご覧ください。

cloud-to-device メッセージを処理するアプリケーションの開発に関するガイダンスについては、「cloud-to-device メッセージを送受信する」を参照してください。