Azure IoT Hub常见问题
使用Event订阅Azure IoT Hub设备上下线,如果不发送消息,每隔一段时间会收到一次上下线通知:
所有的SDK的令牌有效期为默认60分钟,令牌续订有效期约为 85%,即 60*0.85= 50分钟左右, 在默认的SAS令牌到期后,如果没有任何流量来刷新token,则会遇到IoT Hub断开设备,设备再重连的情况。
如果要调试该状态,可以在IoT hub中配置 诊断设置 到Log Analytics工作区:
输出到Log Analytics工作区中:
在日志中输入如下指令,可以查询到 404104 和401003的设备 deviceDisconnect 和deviceConnect的事件,事件每50分钟左右出现一次。
AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend parsed_json = parse_json(properties_s)
| extend SDKVersion = tostring(parsed_json.sdkVersion) , DeviceId = tostring(parsed_json.deviceId) , Protocol = tostring(parsed_json.protocol)
| distinct TimeGenerated, OperationName, Level, ResultType, ResultDescription, DeviceId, Protocol, SDKVersion
关于此现象官网的解释:
https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-troubleshoot-connectivity?WT.mc_id=AZ-MVP-5003757&WT.mc_id=AZ-MVP-5003757#mqtt-device-disconnect-behavior-with-azure-iot-sdks
关于设备SDK 和云端如何保持连接的解释:
为了确保客户端/IoT 中心连接保持活动状态,服务和客户端会定期向对方发送一个 keep-alive ping。使用 IoT SDK 的客户端按下表中定义的时间间隔发送 keep-alive:
语言 | 默认的 keep-alive 时间间隔 | 可配置性 |
---|---|---|
Node.js | 180 秒 | 否 |
Java | 230 秒 | 否 |
C | 240 秒 | 是 |
C# | 300 秒 | 是 |
Python | 60 秒 | 否 |
按照 MQTT 规范,IoT 中心的 keep-alive ping 时间间隔是客户端 keep-alive 值的 1.5 倍。但是,IoT 中心将服务器端最大超时限制为 29.45 分钟(1767 秒),因为所有 Azure 服务都绑定到了 Azure 负载均衡器 TCP 空闲超时(29.45 分钟)。
例如,使用 Java SDK 的设备会发送 keep-alive ping,然后失去网络连接。230 秒后,设备会由于处于脱机状态而错过 keep-alive ping。但是,IoT 中心不会立即关闭连接 - 它会再等待 (230 * 1.5) - 230 = 115
秒,然后再断开设备的连接,并显示错误 404104 DeviceConnectionClosedRemotely。
可设置的客户端最大 keep-alive 值为 1767 / 1.5 = 1177
秒。任何流量都将重置 keep-alive。例如,成功的 SAS 令牌刷新会重置 keep-alive。
参照官网:
https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-mqtt-support?WT.mc_id=AZ-MVP-5003757&WT.mc_id=AZ-MVP-5003757#using-the-device-sdks
关于设备连接/保持连接是否计费的问题:
使用 AMQP 或 MQTT 协议时,为建立连接而交换的消息和协商中交换的消息不收费。
参见:
https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-devguide-pricing?WT.mc_id=AZ-MVP-5003757
关于IoT Hub 能连接的最大设备数量
设备 | 可注册到单个 IoT 中心的设备和模块的总数上限为 1,000,000。只能联系 Microsoft 支持部门来提高此限制。 |
但请注意,100万设备连接到云中,是需要一定时间的,这个受限于连接速率:
“设备连接” 限制控制与 IoT 中心建立新设备连接的速率。“设备连接” 限制不控制同时连接的最大设备数。设备连接 速率限制取决于为 IoT 中心预配的单位数。
例如,如果购买的是单一 S1 单位,则限制为每秒 100 个连接。因此,若要连接 100,000 台设备,至少需要花费 1,000 秒(大约 16 分钟)。但是,同时连接的设备数可与用户在标识注册表中注册的设备数相同。
具体的连接速率参考:
限制 | 免费、B1 和 S1 | B2 和 S2 | B3 和 S3 |
---|---|---|---|
新设备连接(此限制适用于建立 新连接 的速率,而不是连接总数) |
高于 100/秒或 12/秒/单位 底线是100个连接/秒,两个 S1 单位是 2*12 = 24 个新连接/秒,该值< 100,则按100进行限制。 如果有 9 个 S1 单位,则你的单位就有 108 个新连接/秒 (9*12)。 |
120 个新连接/秒/单位 | 6,000 个新连接/秒/单位 |
此外,设备到云的消息发送也是有速率限制的:
在设计物联网系统时,要充分考虑这些限制条件,才能决定是将 S1 升级到S2 或者增加S1 的单元数。
限制 | 免费、B1 和 S1 | B2 和 S2 | B3 和 S3 |
---|---|---|---|
设备到云的发送 | 100 个发送操作/秒或 12 个发送操作/秒/单位,具体取决于哪一个更高 例如,两个 S1 单位是 2*12 = 24/秒,但是在所有单位中至少有 100 个发送操作/秒。如果有 9 个 S1 单位,则你的单位就有 108 个发送操作/秒 (9*12)。 |
120 个发送操作/秒/单位 | 6,000 个发送操作/秒/单位 |
云到设备的发送1 | 1.67 个发送操作/秒/单位(100 条消息/分钟/单位) | 1.67 个发送操作/秒/单位(100 个发送操作/分钟/单位) | 83.33 个发送操作/秒/单位(5,000 个发送操作/分钟/单位) |
云到设备的接收1 (仅当设备使用 HTTPS 时) |
16.67 个接收操作/秒/单位(1,000 个接收操作/分钟/单位) | 16.67 个接收操作/秒/单位(1,000 个接收操作/分钟/单位) | 833.33 个接收操作/秒/单位(50,000 个接收操作/分钟/单位) |
流量整形
为了应对突发流量,IoT 中心可在有限的一段时间内接受超出限制的请求。其中的前几个请求会立即得到处理。但是,如果请求数持续违反限制,IoT 中心会开始将请求放入队列,并以限制速率对请求进行处理。此效应称为“流量整形”。此外,此队列的大小受到限制。如果违反限制的情况持续出现,队列最终将会填满,而 IoT 中心会开始拒绝请求并引发 429 ThrottlingException
。
例如,如果你使用模拟设备每秒将 200 条设备到云的消息发送到 S1 IoT 中心(它限制为每秒发送 100 条 D2C 消息)。在前一两分钟,消息会立即得到处理。但是,由于设备发送的消息数持续超过限制,IoT 中心随后将每秒处理 100 条消息,并将剩余的消息放入队列。此时你会注意到延迟增大。最终,在队列填满后,你会开始收到 429 ThrottlingException
,并且“限制错误数”IoT 中心指标会开始增加。若要了解如何基于指标创建警报和图表,请参阅监视 IoT 中心。
参考:
https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-devguide-quotas-throttling?WT.mc_id=AZ-MVP-5003757