分享方式:


監視、診斷 Azure IoT 中樞裝置連線能力及進行其疑難排解

IoT 裝置的連線問題可能因為有許多可能的失敗點而難以排解。 應用程式邏輯、實體網路、通訊協定、硬體、IoT 中樞及其他雲端服務全都可能造成問題。 必須有能力偵測和查明問題的來源。 不過,大型的 IoT 解決方案可能有數千部裝置,實際上不可能手動檢查每個裝置。 IoT 中樞與兩項 Azure 服務整合,以協助您:

  • Azure 監視器 Azure 監視器可讓您從 IoT 中樞收集、分析及處理遙測資料。 為了協助您大規模偵測、診斷及排解這些問題,請使用 IoT 中樞透過 Azure 監視器提供的監視功能。 這個方法包括設定警示以在發生中斷連線時觸發通知和動作,以及設定可用來探索造成中斷連線狀況的記錄。

  • Azure 事件方格 對於重要基礎結構和每一裝置的中斷連線,請使用 Azure 事件方格來訂閱 IoT 中樞所發出的裝置連線和中斷連線事件。 Azure 事件方格可讓您使用下列任何事件處理常式:

    • Azure Functions
    • Logic Apps
    • Azure Automation
    • Webhooks
    • 佇列儲存體
    • 混合式連線
    • 事件中樞

事件方格與Azure 監視器

事件方格會提供低延遲、每一裝置監視的解決方案,供您用來追蹤重要裝置和基礎結構的裝置連線。 Azure 監視器提供稱為「連線的裝置」的計量,其可用於監視連線到您 IoT 中樞的裝置數目,並在該數目低於靜態閾值時觸發警示。

決定在特定案例中使用事件方格或 Azure 監視器時,請考慮下列問題:

  • 警示延遲:IoT 中樞會透過事件方格更快速地傳遞連線事件。 此事實讓事件方格更適合用於需要快速通知的案例。

  • 每一裝置通知:事件方格可讓您追蹤個別裝置的連線和中斷連線。 此事實讓事件方格更適合用於需要監視重要裝置連線的案例。

  • 輕量型設定:Azure 監視器計量警示會提供輕量型設定體驗,不需要與其他服務整合,即可透過電子郵件、SMS、語音和其他通知來傳遞通知。 使用事件方格時,您必須與其他 Azure 服務整合,才能傳遞通知。 這兩項服務都可以與其他服務整合,以觸發更複雜的動作。

事件方格:監視連線和中斷連線事件

若要監視實際執行環境中的裝置連線和中斷連線事件,建議您訂閱事件方格中的 DeviceConnectedDeviceDisconnected 事件來觸發警示,並監視裝置連線狀態。 事件方格所提供的事件延遲比 Azure 監視器還低,而且您可以針對每個裝置進行監視。 這些因素讓事件方格成為監視重要裝置和基礎結構的慣用方法。

當您使用事件方格來監視或觸發裝置中斷連線警示時,務必篩選掉由於在使用 Azure IoT SDK 的裝置上進行 SAS 權杖更新的定期中斷連線。 若要深入瞭解,請參閱 MQTT 裝置與 Azure IoT SDK 的中斷連線行為

探索下列文章,以深入了解如何使用事件方格監視裝置連線事件:

Azure 監視器:使用記錄來解決連線錯誤

當您使用 Azure 監視器計量警示或事件方格來偵測裝置中斷連線時,您可以使用記錄來協助進行原因的疑難排解。 本節說明如何在 Azure 監視器記錄中尋找常見問題。 此處步驟假設您已建立診斷設定,以將 IoT 中樞連線記錄傳送至 Log Analytics 工作區。

建立診斷設定以將 IoT 中樞資源記錄路由傳送至 Azure 監視器記錄之後,請遵循下列步驟來檢視 Azure 入口網站中的記錄。

  1. Azure 入口網站中瀏覽至您的 IoT 中樞。

  2. 在 IoT 中樞左窗格的 [監視] 底下,選取 [記錄]

  3. 若要隔離 IoT 中樞的連線錯誤記錄,請在查詢編輯器中輸入下列查詢,然後選取 [執行]

    AzureDiagnostics
    | where ( ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
    
  4. 如果有結果,請尋找 OperationNameResultType (錯誤碼) 和 ResultDescription (錯誤訊息),以取得詳細資訊。

    錯誤記錄的範例

使用下列問題解決指南來協助解決最常見的錯誤:

Azure 監視器:使用記錄來監視特定裝置的連線能力

在某些情況下,您可能想要使用 Azure 監視器來查看特定裝置的連線錯誤和資訊。 若要隔離裝置的連線事件,您可以遵循與上一節相同的步驟,但輸入下列查詢。 以您的裝置名稱取代 test-device

AzureDiagnostics
| where ResourceProvider == "MICROSOFT.DEVICES" and ResourceType == "IOTHUBS"
| where Category == "Connections"
| extend DeviceId = tostring(parse_json(properties_s).deviceId)
| where DeviceId == "test-device"

查詢會傳回目標裝置的錯誤和告知性事件。 下列範例輸出顯示告知性 deviceConnect 事件:

記錄中 deviceConnect 事件的螢幕擷取畫面。

MQTT 裝置與 Azure IoT SDK 的中斷連線行為

Azure IoT 裝置 SDK 會中斷與 IoT 中樞的連線,然後在其透過 MQTT (和透過 WebSocket) 通訊協定更新 SAS 權杖時重新連線。 在記錄中,這會顯示為告知性裝置中斷連線和連線事件,有時會伴隨錯誤事件。

根據預設,所有 SDK 的權杖存留期為 60 分鐘;不過,開發人員可以在某些 SDK 中加以變更。 下表摘要說明每個 SDK 的權杖存留期、權杖更新和權杖更新行為:

SDK 權杖存留期 權杖更新 更新行為
.NET 60 分鐘,可設定 85% 的存留期,可設定 SDK 會在權杖存留期 (外加 10 分鐘的寬限期) 中斷連線並重新連線。 記錄中產生的告知性事件和錯誤。
Java 60 分鐘,可設定 85% 的存留期,不可設定 SDK 會在權杖存留期 (外加 10 分鐘的寬限期) 中斷連線並重新連線。 記錄中產生的告知性事件和錯誤。
Node.js 60 分鐘,可設定 可設定 SDK 會在權杖更新時中斷連線並重新連線。 記錄中只會產生告知性事件。
Python 60 分鐘,可設定 到期前的 120 秒 SDK 會在權杖存留期中斷連線並重新連線。

下列螢幕擷取畫面顯示不同 SDK 的 Azure 監視器記錄中的權杖更新行為。 如先前所述,權杖存留期和更新閾值已從預設值變更。

  • 權杖存留期為 1200 秒 (20 分鐘) 的 .NET 裝置 SDK,且更新設定為發生於 90% 的存留期。 每隔 30 分鐘發生中斷連線:

    .NET SDK 的 Azure 監視器記錄中透過 MQTT 更新權杖的錯誤行為。

  • Java SDK 的權杖有效期為 300 秒 (5 分鐘),而預設為在有效期的 85% 時進行更新。 每隔 15 分鐘發生中斷連線:

    JAVA SDK 的 Azure 監視器記錄中透過 MQTT 更新權杖的錯誤行為。

  • Node SDK 的權杖有效期為 300 秒 (5 分鐘),而權杖更新設定為在 3 分鐘時進行。 會在權杖更新時中斷連線。 此外,沒有任何錯誤。 只會發出告知性連線/中斷連線事件:

    Node SDK 的 Azure 監視器記錄中透過 MQTT 更新權杖的錯誤行為。

下列查詢用於收集結果。 此查詢會從屬性包中擷取 SDK 名稱和版本。 若要深入了解,請參閱 IoT 中樞記錄中的 SDK 版本

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

身為 IoT 解決方案開發人員或操作員,您必須留意此行為,才能解譯記錄中的連線/中斷連線事件和相關錯誤。 如果您想要變更裝置的權杖存留期或更新行為,請查看裝置是否實作裝置對應項設定或使此變更成為可能的裝置方法。

如果您要監視與事件中樞的裝置連線,務必篩選掉由於 SAS 權杖更新的定期中斷連線。 例如,只要中斷連線事件後面在特定時間範圍內緊接著連線事件,就不要根據中斷連線觸發動作。

注意

IoT 中樞僅支援每個裝置有一個作用中 MQTT 連接。 代表相同裝置識別碼的任何新的 MQTT 連接都會導致 IoT 中樞卸除現有的連接。

400027 ConnectionForcefullyClosedOnNewConnection 將會記錄於 IoT 中樞記錄中

我試過這些步驟,但沒有用

如果上述步驟無法解決問題,請嘗試:

下一步

  • 若要深入了解如何解決暫時性問題,請參閱暫時性錯誤處理

  • 若要深入了解 Azure IoT 裝置 SDK 和管理重試,請參閱重試模式