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

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

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

  • Azure 事件方格:針對關鍵基礎設施及每裝置斷線,請使用 Azure 事件方格 訂閱 IoT 中樞 發出的裝置連接與斷開事件。 Azure 事件方格可讓您使用下列任何事件處理常式:

    • Azure Functions
    • Logic Apps
    • Azure 自動化
    • Webhooks (網路鉤子)
    • 佇列儲存體
    • 混合式連線
    • 事件中樞

協定與埠口

裝置可以使用以下任一協定連接您的物聯網集線。 如果外出埠被防火牆阻擋,裝置就無法連線。

通訊協定 輸出連接埠
MQTT 8883
透過 WebSocket 的 MQTT 443
AMQP 5671
透過 WebSocket 傳輸的 AMQP 443
HTTPS 443

欲了解更多關於訊息佇列遙測傳輸(MQTT)連接的資訊,請參閱「Connect to IoT 中樞」。

驗證裝置連接性

使用 Azure CLI 和 IoT 中樞 入口網站工具來驗證裝置是否能與你的 hub 連接並通訊。 本節步驟幫助您辨識問題出在裝置驗證、裝置對雲端訊息、雲端對裝置訊息,或是裝置雙胞同步。

連接驗證的前提條件

  • 已安裝 azure-iot 擴充功能Azure CLI

    az extension add --upgrade --name azure-iot
    
  • 使用連接字串在您的 IoT 中樞中註冊的裝置。 要註冊測試裝置並取得其 連接字串,請執行以下指令。 用你新裝置的名稱取代 <your-device-id> ,再用你已經建立的物聯網中樞取代 <your-iot-hub-name>

    az iot hub device-identity create --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
    az iot hub device-identity connection-string show --device-id <your-device-id> --hub-name <your-iot-hub-name>
    

檢查裝置驗證

裝置必須先與你的集線器進行認證,才能交換資料。 要測試認證:

  1. 使用 Azure CLI 從裝置識別碼發送測試遙測訊息。 成功傳送即確認裝置金鑰有效:

    az iot device simulate --device-id <your-device-id> --hub-name <your-iot-hub-name> --msg-count 1
    
  2. 如果認證失敗,請確認裝置的 連接字串 是否為最新。 如果需要,請重設主鍵以產生新的主鍵:

    az iot hub device-identity update --device-id <your-device-id> --set authentication.symmetricKey.primaryKey="" --hub-name <your-iot-hub-name>
    

    接著取得更新後的連線字串:

    az iot hub device-identity connection-string show --device-id <your-device-id> --hub-name <your-iot-hub-name>
    

產生測試 SAS 令牌

如果你的裝置使用 SAS 令牌認證,你可以產生一個已知有效的 SAS 令牌,以排除令牌產生代碼的問題:

az iot hub generate-sas-token --device-id <your-device-id> --hub-name <your-iot-hub-name>

有效的 SAS 代幣如下: SharedAccessSignature sr=your-hub.azure-devices.net%2Fdevices%2FmyDevice&sig=xxxxxx&se=111111

關於如何程式生成 SAS 標記的程式碼範例,請參考 iot-hub/Tutorials/ConnectivityTests 資料夾中的 Node.jsAzure IoT 範例。

檢查裝置到雲端的連線能力

要驗證裝置傳送的遙測數據是否到達你的集線器:

  1. 從裝置發送測試遙測訊息:

    az iot device simulate --device-id <your-device-id> --hub-name <your-iot-hub-name> --msg-count 5
    
  2. Azure 入口網站中,瀏覽至您的 IoT 中樞。 在提要欄位功能表中的 [ 監視] 下,選取 [ 計量]。

  3. 指標 下拉選單中,選擇 發送的遙測訊息 作為指標,並將右上角的時間範圍設為 「過去一小時」。 圖表顯示裝置發送的訊息總數。

    注意

    發送訊息後,指標需要幾分鐘才能顯示出來。

檢查雲端到裝置的連線能力

要驗證雲端到裝置的路徑,請使用直接方法呼叫。 在一個終端視窗執行模擬裝置,然後從另一個終端機直接呼叫一個方法:

az iot hub invoke-device-method --device-id <your-device-id> --method-name TestMethod --timeout 10 --method-payload '{"key":"value"}' --hub-name <your-iot-hub-name>

成功回應則確認集線器能連上裝置。 如果呼叫逾時,請驗證裝置已連線並正在監聽方法呼叫。

檢查裝置對應項同步處理

若要驗證裝置對應項資料會在裝置與中樞之間同步:

  1. 查看目前裝置對應項以確認已回報的屬性:

    az iot hub device-twin show --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
  2. 傳送想要的屬性更新並確認裝置已收到:

    az iot hub device-twin update --set properties.desired='{"mydesiredproperty":"propertyvalue"}' --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
  3. 再執行 twin show 指令,確認裝置是否已確認其回報屬性中的目標屬性。

事件方格與Azure 監視器

事件網格提供低延遲的逐裝置監控解決方案,讓您可以用來追蹤重要裝置和基礎設施的裝置連接狀況。 Azure 監視器提供稱為「連線的裝置」的計量,其可用於監視連線到您 IoT 中樞的裝置數目,並在該數目低於靜態閾值時觸發警示。

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

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

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

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

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

事件方格所提供的事件延遲比 Azure 監視器還低,而且您可以針對每個裝置進行監視。 這些因素讓事件方格成為監視重要裝置和基礎結構的慣用方法。

注意

若要監視實際執行環境中的裝置連線和中斷連線事件,建議您訂閱事件方格中的 DeviceConnectedDeviceDisconnected 事件來觸發警示,並監視裝置連線狀態。

當您使用 Event Grid 來監控或觸發裝置斷線警示時,務必設置一個方式來篩選掉使用 Azure IoT SDK 的裝置因 SAS 權杖更新而造成的定期斷線。 若要深入瞭解,請參閱 MQTT 裝置與 Azure IoT SDK 的中斷連線行為

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

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

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

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

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

  2. 在 IoT 中樞的側邊欄選單中,選取 監視 底下的 日誌

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

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

    截圖顯示錯誤日誌的範例。

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

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

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

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

查詢會傳回目標裝置的錯誤事件和資訊事件。 下列範例輸出顯示訊息型 deviceConnect 事件:

日誌中 deviceConnect 事件的截圖。

使用 Azure IoT SDK 時,MQTT 裝置的中斷連線行為

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

根據預設,所有 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 監視器記錄中的權杖更新行為。 如先前所述,權杖存留期和更新閾值已從預設值變更。

  • .NET裝置 SDK 具有 1,200 秒(20 分鐘)的代幣壽命,續約時間設定為 90%。 斷線每30分鐘發生一次:

    顯示在 Azure 監視器記錄中搭配 .NET SDK 透過 MQTT 進行權杖續約時發生錯誤行為的螢幕截圖。

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

    顯示在 Azure 監視器 Logs 的 Java SDK 中透過 MQTT 進行權杖更新時錯誤行為的螢幕擷取畫面。

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

    顯示在使用 Node SDK 的 Azure 監視器 Logs 中,透過 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 中樞記錄中

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

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