使用Event訂閱Azure IoT Hub設(shè)備上下線,如果不發(fā)送消息,每隔一段時(shí)間會(huì)收到一次上下線通知:
所有的SDK的令牌有效期為默認(rèn)60分鐘,令牌續(xù)訂有效期約為 85%,即 60*0.85= 50分鐘左右, 在默認(rèn)的SAS令牌到期后,如果沒有任何流量來(lái)刷新token,則會(huì)遇到IoT Hub斷開設(shè)備,設(shè)備再重連的情況。
如果要調(diào)試該狀態(tài),可以在IoT hub中配置 診斷設(shè)置 到Log Analytics工作區(qū):
輸出到Log Analytics工作區(qū)中:
在日志中輸入如下指令,可以查詢到 404104 和401003的設(shè)備 deviceDisconnect 和deviceConnect的事件,事件每50分鐘左右出現(xiàn)一次。
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
關(guān)于此現(xiàn)象官網(wǎng)的解釋:
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
為了確保客戶端/IoT 中心連接保持活動(dòng)狀態(tài),服務(wù)和客戶端會(huì)定期向?qū)Ψ桨l(fā)送一個(gè) keep-alive ping。使用 IoT SDK 的客戶端按下表中定義的時(shí)間間隔發(fā)送 keep-alive:
語(yǔ)言 | 默認(rèn)的 keep-alive 時(shí)間間隔 | 可配置性 |
---|---|---|
Node.js | 180 秒 | 否 |
Java | 230 秒 | 否 |
C | 240 秒 | 是 |
C# | 300 秒 | 是 |
Python | 60 秒 | 否 |
按照 MQTT 規(guī)范,IoT 中心的 keep-alive ping 時(shí)間間隔是客戶端 keep-alive 值的 1.5 倍。但是,IoT 中心將服務(wù)器端最大超時(shí)限制為 29.45 分鐘(1767 秒),因?yàn)樗?Azure 服務(wù)都綁定到了 Azure 負(fù)載均衡器 TCP 空閑超時(shí)(29.45 分鐘)。
例如,使用 Java SDK 的設(shè)備會(huì)發(fā)送 keep-alive ping,然后失去網(wǎng)絡(luò)連接。230 秒后,設(shè)備會(huì)由于處于脫機(jī)狀態(tài)而錯(cuò)過(guò) keep-alive ping。但是,IoT 中心不會(huì)立即關(guān)閉連接 - 它會(huì)再等待 (230 * 1.5) - 230 = 115
秒,然后再斷開設(shè)備的連接,并顯示錯(cuò)誤 404104 DeviceConnectionClosedRemotely。
可設(shè)置的客戶端最大 keep-alive 值為 1767 / 1.5 = 1177
秒。任何流量都將重置 keep-alive。例如,成功的 SAS 令牌刷新會(huì)重置 keep-alive。
參照官網(wǎng):
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 協(xié)議時(shí),為建立連接而交換的消息和協(xié)商中交換的消息不收費(fèi)。
參見:
https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-devguide-pricing?WT.mc_id=AZ-MVP-5003757
設(shè)備 | 可注冊(cè)到單個(gè) IoT 中心的設(shè)備和模塊的總數(shù)上限為 1,000,000。只能聯(lián)系 Microsoft 支持部門來(lái)提高此限制。 |
但請(qǐng)注意,100萬(wàn)設(shè)備連接到云中,是需要一定時(shí)間的,這個(gè)受限于連接速率:
“設(shè)備連接” 限制控制與 IoT 中心建立新設(shè)備連接的速率?!霸O(shè)備連接” 限制不控制同時(shí)連接的最大設(shè)備數(shù)。設(shè)備連接 速率限制取決于為 IoT 中心預(yù)配的單位數(shù)。
例如,如果購(gòu)買的是單一 S1 單位,則限制為每秒 100 個(gè)連接。因此,若要連接 100,000 臺(tái)設(shè)備,至少需要花費(fèi) 1,000 秒(大約 16 分鐘)。但是,同時(shí)連接的設(shè)備數(shù)可與用戶在標(biāo)識(shí)注冊(cè)表中注冊(cè)的設(shè)備數(shù)相同。
具體的連接速率參考:
限制 | 免費(fèi)、B1 和 S1 | B2 和 S2 | B3 和 S3 |
---|---|---|---|
新設(shè)備連接(此限制適用于建立 新連接 的速率,而不是連接總數(shù)) | 高于 100/秒或 12/秒/單位 底線是100個(gè)連接/秒,兩個(gè) S1 單位是 2*12 = 24 個(gè)新連接/秒,該值< 100,則按100進(jìn)行限制。 如果有 9 個(gè) S1 單位,則你的單位就有 108 個(gè)新連接/秒 (9*12)。 | 120 個(gè)新連接/秒/單位 | 6,000 個(gè)新連接/秒/單位 |
此外,設(shè)備到云的消息發(fā)送也是有速率限制的:
在設(shè)計(jì)物聯(lián)網(wǎng)系統(tǒng)時(shí),要充分考慮這些限制條件,才能決定是將 S1 升級(jí)到S2 或者增加S1 的單元數(shù)。
限制 | 免費(fèi)、B1 和 S1 | B2 和 S2 | B3 和 S3 |
---|---|---|---|
設(shè)備到云的發(fā)送 | 100 個(gè)發(fā)送操作/秒或 12 個(gè)發(fā)送操作/秒/單位,具體取決于哪一個(gè)更高 例如,兩個(gè) S1 單位是 2*12 = 24/秒,但是在所有單位中至少有 100 個(gè)發(fā)送操作/秒。如果有 9 個(gè) S1 單位,則你的單位就有 108 個(gè)發(fā)送操作/秒 (9*12)。 | 120 個(gè)發(fā)送操作/秒/單位 | 6,000 個(gè)發(fā)送操作/秒/單位 |
云到設(shè)備的發(fā)送1 | 1.67 個(gè)發(fā)送操作/秒/單位(100 條消息/分鐘/單位) | 1.67 個(gè)發(fā)送操作/秒/單位(100 個(gè)發(fā)送操作/分鐘/單位) | 83.33 個(gè)發(fā)送操作/秒/單位(5,000 個(gè)發(fā)送操作/分鐘/單位) |
云到設(shè)備的接收1 (僅當(dāng)設(shè)備使用 HTTPS 時(shí)) | 16.67 個(gè)接收操作/秒/單位(1,000 個(gè)接收操作/分鐘/單位) | 16.67 個(gè)接收操作/秒/單位(1,000 個(gè)接收操作/分鐘/單位) | 833.33 個(gè)接收操作/秒/單位(50,000 個(gè)接收操作/分鐘/單位) |
為了應(yīng)對(duì)突發(fā)流量,IoT 中心可在有限的一段時(shí)間內(nèi)接受超出限制的請(qǐng)求。其中的前幾個(gè)請(qǐng)求會(huì)立即得到處理。但是,如果請(qǐng)求數(shù)持續(xù)違反限制,IoT 中心會(huì)開始將請(qǐng)求放入隊(duì)列,并以限制速率對(duì)請(qǐng)求進(jìn)行處理。此效應(yīng)稱為“流量整形”。此外,此隊(duì)列的大小受到限制。如果違反限制的情況持續(xù)出現(xiàn),隊(duì)列最終將會(huì)填滿,而 IoT 中心會(huì)開始拒絕請(qǐng)求并引發(fā) 429 ThrottlingException
。
例如,如果你使用模擬設(shè)備每秒將 200 條設(shè)備到云的消息發(fā)送到 S1 IoT 中心(它限制為每秒發(fā)送 100 條 D2C 消息)。在前一兩分鐘,消息會(huì)立即得到處理。但是,由于設(shè)備發(fā)送的消息數(shù)持續(xù)超過(guò)限制,IoT 中心隨后將每秒處理 100 條消息,并將剩余的消息放入隊(duì)列。此時(shí)你會(huì)注意到延遲增大。最終,在隊(duì)列填滿后,你會(huì)開始收到 429 ThrottlingException
,并且“限制錯(cuò)誤數(shù)”IoT 中心指標(biāo)會(huì)開始增加。若要了解如何基于指標(biāo)創(chuàng)建警報(bào)和圖表,請(qǐng)參閱監(jiān)視 IoT 中心。
參考:
https://docs.microsoft.com/zh-cn/azure/iot-hub/iot-hub-devguide-quotas-throttling?WT.mc_id=AZ-MVP-5003757