背景/動機
Microsoft Azure IoT Hub のドキュメントをよく読み、サンプルを試してみましたが、このテクノロジが、断続的/信頼性が低く高価なネットワーク (GSM など) を介して接続するデバイスに適しているかどうか、およびコストを最小限に抑えることが非常に重要である場所については、まだよくわかっていません。レイテンシを最小限に抑えることよりも重要です。
特に、すべてのサンプルで、メッセージのプロトコル オーバーヘッドに注意が向けられていないことに気付きました。テレメトリデータは常に小さくて単純なメッセージとして送信されます。
{
"time": "2016-01-26T20:47:53.0000000",
"dspl": "sensorE",
"temp": 123,
"hmdt": 34
}
おそらく、リアルタイム配信の優先度が非常に高いため、コストは実際には考慮されていないという前提があります。また、IoT Hub で使用されるトピック/エンドポイント名が非常に冗長であることにも気付きました。これにより、オーバーヘッドが増加する必要があります。
C SDKのドキュメントには、「通信効率を向上させるためにメッセージをバッチ処理する」という言及がありますが、それ以上の詳細はなく、これが HTTP のみに適用されるのか、AMQP にも適用されるのかは明らかではありません。ライブラリがどのメッセージをまとめてバッチ処理するかを決定する方法についても言及されていません。
IoTHubClient_LL_SetOption への "SetBatching" オプション(既定ではオフ) についても言及されていますが、これが HTTP のみに適用されるのか、AMQP にも適用されるのかについては言及されていません。ソース コードを見たところ、このオプションは存在しないように見えたので、リンクされたドキュメントが古くなっている可能性があります。
更新:「IoTHubClient についての詳細」にも が記載されていますSetBatching
が、これが HTTP のみであるかどうかはまだ明確ではありません。(おそらく、バッチ処理は AMQP に利点をもたらさないでしょう。これをよりよく理解したいと思っています。これが私の質問の核心です。)
実際の質問
具体的には、Azure IoT C SDK に関して、次のことを知りたいです。
AMQP を使用した、Azure IoT Hub デバイスからクラウドへのメッセージの一般的なプロトコル オーバーヘッドはどれくらいですか?
AMQP の使用時にメッセージをバッチ処理するために、C SDK には何が含まれていますか? たとえば、アプリケーションが (接続がアップしている間に) 3 つのメッセージを立て続けに送信する場合、SDK はそれらをネットワーク経由で 1 つのパケットに結合しますか? アプリケーションがメッセージを SDK に送信するまでに、SDK がメッセージの送信を決定する前に、さらにメッセージがあるかどうかを確認するのを待つのではなく、どれくらいの時間が経過する必要がありますか?
シャットダウン中のデバイスは、SDK によってまだバッファリングされている (まだ送信されていない) メッセージをどのように判断して、これらのメッセージを保存し、次回の起動時に再送信を試みることができますか?(これは簡単です。メッセージが実際にいつ送信されたかを知らせるコールバック パラメータがあります。)IoTHubClient_LL_SendEventAsync()