背景/动机
在大量阅读 Microsoft Azure IoT Hub 文档并使用示例之后,我仍然不知道该技术是否适用于通过间歇性/不可靠和昂贵的网络(例如 GSM)连接的设备,以及最大限度地降低成本的地方比最小化延迟更重要。
特别是,我注意到在所有示例中,都没有关注消息的协议开销。遥测数据始终作为小而简单的消息发送,例如
{
"time": "2016-01-26T20:47:53.0000000",
"dspl": "sensorE",
"temp": 123,
"hmdt": 34
}
大概是假设实时交付是如此高的优先级,以至于成本并不是真正的考虑因素。我还注意到 IoT 中心使用的主题/端点名称非常冗长,这肯定会增加开销。
C SDK 文档中提到了“批处理消息以提高通信效率”,但没有进一步的细节,也不清楚这是否仅适用于 HTTP,或者也适用于 AMQP。也没有提到图书馆如何决定将哪些消息一起批处理。
还提到了 IoTHubClient_LL_SetOption 的“SetBatching”选项(默认关闭),但它没有说明这是否仅适用于 HTTP 或也适用于 AMQP。当我查看源代码时,这个选项似乎不存在,所以链接的文档可能已经过时了。
更新: “关于 IoTHubClient 的更多信息”也提到SetBatching
了,但目前尚不清楚这是否仅限 HTTP。(也许批处理不会给 AMQP 带来任何优势——我想更好地理解这一点,这是我问题的核心。)
实际问题
我想知道,特别是关于 Azure IoT C SDK:
使用 AMQP 的 Azure IoT 中心设备到云消息的典型协议开销是多少?
使用 AMQP 时,用于批处理消息的 C SDK 中包含什么?例如,如果应用程序快速连续发送 3 条消息(当连接建立时),SDK 会通过网络将它们组合成一个数据包吗?在 SDK 决定发送消息而不是等待查看是否还有更多消息之前,应用程序向 SDK 提交消息之间必须经过多长时间?
正在关闭的设备如何确定 SDK 仍在缓冲哪些消息(尚未发送),以便保存这些消息并在下次启动时再次尝试发送它们?(这很简单 - 有一个回调参数可以IoTHubClient_LL_SendEventAsync()
告诉您消息何时实际发送。)