了解並解決 Azure IoT 中樞 錯誤

本文說明在使用 IoT 中樞 時可能會遇到的常見錯誤碼原因和解決方案。

400027 連線在新連線上強制關閉

如果您的裝置中斷連線,並 Communication_Error回報為使用 .NET SDK 和 MQTT 傳輸類型的 連線 ionStatusChangeReason,您可能會看到 400027 連線 ionForcefullyClosedOnNew 連線 ion 錯誤。 或者,您的裝置到雲端對應項作業(例如讀取或修補程序報告屬性)或直接方法調用失敗,錯誤碼 400027

當另一個用戶端使用相同的身分識別建立與 IoT 中樞 的新連線時,就會發生此錯誤,因此 IoT 中樞 關閉先前的連線。 IoT 中樞不允許多個使用者端使用相同的身分識別連線。

若要解決此錯誤,請確定每個用戶端都使用自己的身分識別連線到 IoT 中樞。

401003 IoT 中樞未經授權

在記錄中,您可能會看到裝置與 401003 IoTHubUnauthorized 中斷連線的模式,後面接著404104 Device 連線 ionClosedRemotely,然後在不久之後成功連線。

或者,要求 IoT 中樞 失敗,並出現下列其中一個錯誤訊息:

  • 缺少授權標頭
  • IotHub '*' 不包含指定的裝置 '*'
  • 授權規則 '*' 不允許存取 '*'
  • 此裝置的驗證失敗、更新令牌或憑證並重新連線
  • 指紋不符合設定:指紋:SHA1Hash=*、SHA2Hash=*;組態:PrimaryThumbprint=*、SecondaryThumbprint=*
  • 主體 user@example.com 未獲得 /exampleOperation 上的 GET 授權,因為沒有指派的許可權

發生此錯誤的原因是,針對 MQTT,某些 SDK 依賴 IoT 中樞 在 SAS 令牌到期時發出中斷連線,以瞭解何時重新整理。 所以,

  1. SAS 令牌到期
  2. IoT 中樞 注意到到期日,並使用 401003 IoTHubUnauthorized 中斷裝置連線
  3. 裝置會使用 404104 Device 完成中斷連線 連線 ionClosedRemotely
  4. IoT SDK 會產生新的SAS令牌
  5. 裝置已成功重新連線 IoT 中樞

或者,IoT 中樞 無法驗證驗證標頭、規則或金鑰。 這可能是由於癥狀中引用的任何原因所致。

若要解決此錯誤,如果使用IoT SDK進行裝置連線,則不需要採取任何動作 連接字串。 IoT SDK 會重新產生新的令牌,以在 SAS 令牌到期時重新連線。

默認令牌存留期在 SDK 之間為 60 分鐘;不過,對於某些 SDK,令牌存留期和令牌更新閾值是可設定的。 此外,當裝置在令牌更新時中斷連線並重新連線時所產生的錯誤會因每個 SDK 而有所不同。 若要深入瞭解以及如何判斷裝置在記錄中使用的 SDK,請參閱 使用 Azure IoT SDK 的 MQTT 裝置中斷連線行為。

對於裝置開發人員來說,如果發生錯誤量是問題,請切換至 C SDK,以在到期前更新 SAS 令牌。 針對AMQP,SAS令牌可以重新整理而不中斷連線。

一般而言,呈現的錯誤訊息應該說明如何修正錯誤。 如果基於某些原因而無法存取錯誤訊息詳細資料,請確定:

  • 您所使用的 SAS 或其他安全性令牌未過期。
  • 針對 X.509 憑證驗證,裝置憑證或與裝置相關聯的 CA 憑證不會過期。 若要瞭解如何向 IoT 中樞 註冊 X.509 CA 憑證,請參閱教學課程:建立和上傳要測試的憑證。
  • 針對 X.509 憑證指紋驗證,裝置憑證的指紋會向 IoT 中樞 註冊。
  • 授權認證適用於您使用的通訊協定。 若要深入瞭解,請參閱控制 IoT 中樞的存取權。
  • 所使用的授權規則具有所要求的作業許可權。
  • 針對以 「principal...“開頭的最後一個錯誤訊息,您可以將正確的 Azure RBAC 許可權層級指派給使用者,來解決此錯誤。 例如,IoT 中樞 上的擁有者可以指派「IoT 中樞 數據擁有者」角色,以提供所有許可權。 請嘗試此角色來解決許可權不足的問題。

注意

當裝置時間與伺服器的差異大於五分鐘時,某些裝置可能會遇到時間漂移問題。 當裝置已連線到IoT中樞時,可能會發生此錯誤,而該中樞沒有問題數周甚至數月,但接著會開始持續拒絕其連線。 此錯誤也可能專屬於連線到IoT中樞的裝置子集,因為時間漂移可能會根據裝置第一次連線或開啟的時間而定,以不同的速率發生。

通常,使用 NTP 執行時間同步,或重新啟動裝置(這可以在開機順序期間自動執行時間同步處理)可修正問題,並允許裝置再次連線。 若要避免此錯誤,請將裝置設定為使用NTP執行定期時間同步處理。 您可以根據裝置體驗的漂移量,排程每日、每周或每月的同步處理。 如果您無法在裝置上設定定期NTP同步處理,請排程定期重新啟動。

超過403002 IoT 中樞配額

您可能會看到要求 IoT 中樞 失敗,並出現403002 IoTHubQuotaExceeded 錯誤。 在 Azure 入口網站 中,IoT 中樞裝置清單不會載入。

當超過IoT中樞的每日訊息配額時,通常會發生此錯誤。 若要解決此錯誤:

  • 升級或增加IoT中樞 上的單位數目,或等候下一個UTC天重新整理每日配額。
  • 若要了解作業如何計入配額,例如對應項查詢和直接方法,請參閱瞭解 IoT 中樞 定價
  • 若要設定每日配額使用量的監視,請設定警示,其中包含使用的訊息總數計量。 如需逐步指示,請參閱使用 IoT 中樞 設定計量和警示。

當向IoT中樞註冊的裝置數目接近或超過IoT中樞的配額限制時,大容量導入作業也可能傳回此錯誤。 若要深入瞭解,請參閱 針對匯入作業進行疑難解答。

403004超過裝置佇列深度上限

嘗試傳送雲端到裝置訊息時,您可能會看到要求失敗,並出現錯誤403004DeviceMaximumQueueDepthExceeded。

此錯誤的根本原因是,針對裝置加入佇列的訊息數目超過 佇列限制

您進入此限制的最可能原因是您使用 HTTPS 接收訊息,這會導致使用 ReceiveAsync持續輪詢,導致 IoT 中樞 節流要求。

使用 HTTPS 的雲端到裝置訊息支援模式是間歇性連線的裝置,這些裝置不常檢查訊息(少於每 25 分鐘)。 若要降低進入佇列限制的可能性,請切換至適用於雲端到裝置訊息的AMQP或 MQTT。

或者,增強裝置端邏輯,以快速完成、拒絕或放棄佇列訊息、縮短存留時間,或考慮傳送較少的訊息。 請參閱 C2D 訊息存留時間。

最後,請考慮在達到限制之前,使用 清除佇列 API 定期清除暫止訊息。

403006超過裝置使用中檔案上傳限制上限

您可能會看到檔案上傳要求失敗,錯誤碼 403006 DeviceMaximumActiveFileUploadLimitExceeded 和 訊息「使用中檔案上傳要求數目不能超過 10」。

因為每個裝置用戶端都受限於 並行檔案上傳,因此會發生此錯誤。 如果您的裝置未在檔案上傳完成時通知 IoT 中樞,您可以輕鬆地超過限制。 此問題通常是由不可靠的裝置端網路所造成。

若要解決此錯誤,請確定裝置可以立即通知 IoT 中樞 檔案上傳完成。 然後,請嘗試 減少檔案上傳組態的 SAS 令牌 TTL。

找不到404001裝置

在雲端到裝置 (C2D) 通訊期間,例如 C2D 訊息、對應項更新或直接方法,您可能會看到作業失敗,並 404001 DeviceNotFound 錯誤。

作業失敗,因為 IoT 中樞 找不到裝置。 裝置未註冊或已停用。

若要解決此錯誤,請註冊您使用的裝置標識碼,然後再試一次。

404103裝置不在在線

您可能會看到裝置的直接方法失敗,即使裝置已上線,仍404103 DeviceNotOnline 錯誤

如果您知道裝置已上線,但仍收到錯誤,則可能會發生此錯誤,因為直接方法回呼未在裝置上註冊。

若要正確設定您的裝置以進行直接方法回呼,請參閱 處理裝置上的直接方法。

404104裝置連線遠端關閉

您可能會看到裝置會定期中斷連線(例如每 65 分鐘),並在 IoT 中樞 資源記錄中看到 404104 Device 連線 ionClosedRemotely。 有時候,您也會看到 401003 IoTHubUnauthorized 和不到一分鐘后成功的裝置連線事件。

或者,裝置會隨機中斷連線,而且您會在 IoT 中樞 資源記錄中看到 404104 Device 連線 ionClosedRemotely

或者,許多裝置一次中斷連線,您會看到 連線 裝置 (connectedDeviceCount) 計量中的下降,而且 Azure 監視器記錄中的裝置 連線 IonClosedRemotely500xxx 內部錯誤 404104比平常多

發生此錯誤的原因是用來連線到 IoT 中樞 的SAS令牌已過期,這會導致 IoT 中樞 中斷裝置連線。 當裝置重新整理令牌時,會重新建立連線。 例如,根據預設, C SDK SAS 令牌會每小時到期,這可能會導致一般中斷連線。 若要深入瞭解,請參閱 401003 IoTHubUnauthorized

其他一些可能性包括:

  • 裝置遺失的基礎網路連線時間超過 MQTT 保持運作時間,導致遠端閒置逾時。 每個裝置的 MQTT 保持運作設定可能不同。
  • 裝置傳送 TCP/IP 層級重設,但未傳送應用層級 MQTT DISCONNECT。 基本上,裝置突然關閉了基礎套接字連線。 有時候,此問題是由舊版 Azure IoT SDK 中的 Bug 所造成。
  • 裝置端應用程式損毀。

或者,IoT 中樞 可能會遇到暫時性問題。 請參閱 IoT 中樞 內部伺服器錯誤

若要解決此錯誤:

  • 請參閱IoTHubUnauthorized 401003錯誤指引
  • 藉由測試連線,確定裝置與 IoT 中樞 有良好的連線能力。 如果網路不可靠或間歇性,我們不建議您增加保持連線值,因為它可能會導致偵測(例如透過 Azure 監視器警示,例如)花費較長的時間。
  • 使用最新版的 IoT SDK
  • 請參閱 IoT 中樞 內部伺服器錯誤的指引

我們建議使用 Azure IoT 裝置 SDK 來可靠地管理連線。 若要深入了解,請參閱使用 Azure IoT 中樞裝置 SDK 來管理連線性和可靠傳訊

409001裝置已經存在

嘗試在 IoT 中樞 中註冊裝置時,您可能會看到要求失敗,並出現 deviceAlreadyExists 409001錯誤

因為 IoT 中樞內已經有具有相同裝置識別碼的裝置,因此會發生此錯誤。

若要解決此錯誤,請使用不同的裝置標識碼,然後再試一次。

您可能會在記錄中看到 LinkCreationConflict 409002錯誤,以及裝置中斷連線或雲端到裝置訊息失敗。

一般而言,當 IoT 中樞 偵測到用戶端有一個以上的連線時,就會發生此錯誤。 事實上,當新的連線要求抵達具有現有連線的裝置時,IoT 中樞 關閉現有的連線,並出現此錯誤。

在最常見的情況下,個別的問題(例如404104 Device 連線 ionClosedRemotely)會導致裝置中斷連線。 裝置會嘗試立即重新建立連線,但 IoT 中樞 仍然會考慮裝置已連線。 IoT 中樞 關閉先前的連線並記錄此錯誤。

或者,故障的裝置端邏輯會在裝置已開啟時建立連線。

若要解決此錯誤,請在您可以疑難解答的記錄中尋找其他錯誤,因為此錯誤通常會顯示為不同暫時性問題的副作用。 否則,只有當連線中斷時,請務必發出新的連線要求。

412002裝置訊息鎖定遺失

嘗試傳送雲端到裝置訊息時,您可能會看到要求失敗,並出現 DeviceMessageLockLost 412002錯誤

之所以發生此錯誤,是因為當裝置收到來自佇列的雲端到裝置訊息時(例如,使用 ReceiveAsync()),訊息會由 IoT 中樞 鎖定,而鎖定逾時持續時間為一分鐘。 如果裝置在鎖定逾時到期後嘗試完成訊息,IoT 中樞 會擲回此例外狀況。

如果 IoT 中樞 在一分鐘的鎖定逾時持續時間內未收到通知,則會將訊息設定回加入佇列狀態。 裝置可以嘗試再次接收訊息。 若要防止未來發生錯誤,請實作裝置端邏輯,以在接收訊息的一分鐘內完成訊息。 無法變更此一分鐘的逾時。

429001節流例外狀況

您可能會看到對 IoT 中樞 的要求失敗,並出現「節流」Exception 429001錯誤

當要求的作業超過 IoT 中樞 節流限制時,就會發生此錯誤。

若要解決此錯誤,請檢查您是否要藉由比較遙測 訊息傳送嘗試 計量與上述限制來達到節流限制。 您也可以檢查 節流錯誤 計量的數目。 如需這些計量的相關信息,請參閱 裝置遙測計量。 如需如何使用計量來協助您監視IoT中樞的資訊,請參閱監視 IoT 中樞

IoT 中樞 只有在違反限制太久之後,才會傳回 429 ThrottlingException。 如此一來,如果您的IoT中樞收到高載流量,就不會捨棄您的訊息。 在此同時,IoT 中樞會以作業節流速率處理訊息,如果待處理項目中有太多流量,該速率可能會很慢。 若要深入了解,請參閱 IoT 中樞流量成形

如果您執行配額或節流限制,請考慮擴大您的 IoT 中樞

500xxx 內部錯誤

您可能會看到您對 IoT 中樞 的要求失敗,並出現開頭為 500 和/或某種「伺服器錯誤」的錯誤。某些可能性如下:

  • 500001 ServerError:IoT 中樞 發生伺服器端問題。

  • 500008 GenericTimeout:IoT 中樞 逾時之前無法完成連線要求。

  • ServiceUnavailable (沒有錯誤碼):IoT 中樞 發生內部錯誤。

  • InternalServerError (沒有錯誤碼):IoT 中樞 發生內部錯誤。

500xxx 錯誤回應可能會有許多原因。 在所有情況下,問題很可能是暫時性的。 雖然 IoT 中樞 小組努力維護 SLA,但 IoT 中樞 節點的小型子集偶爾會遇到暫時性錯誤。 當您的裝置嘗試連線到發生問題的節點時,您會收到此錯誤。

若要減輕 500xxx 錯誤,請從裝置發出重試。 若要 自動管理重試,請確定您使用最新版的 Azure IoT SDK。 如需暫時性錯誤處理和重試的最佳做法,請參閱 暫時性錯誤處理

如果問題持續發生,請檢查 資源健康狀態Azure 狀態,以查看 IoT 中樞 是否有已知問題。 您也可以使用 手動故障轉移功能

如果沒有已知問題,問題會繼續發生, 請連絡支持人員 以取得進一步調查。

找不到503003分割區

您可能會看到要求 IoT 中樞 失敗,並出現 PartitionNotFound 503003錯誤

此錯誤是內部 IoT 中樞,而且可能是暫時性的。 請參閱 IoT 中樞 內部伺服器錯誤

若要解決此錯誤,請參閱 IoT 中樞 內部伺服器錯誤

504101閘道逾時

嘗試從 IoT 中樞 叫用直接方法到裝置時,您可能會看到要求失敗,並出現 GatewayTimeout 504101錯誤

之所以發生此錯誤,是因為 IoT 中樞 發生錯誤,而且無法在逾時之前確認直接方法是否已完成。或者,使用舊版的 Azure IoT C# SDK (<1.19.0),裝置與 IoT 中樞 之間的 AMQP 連結可能會因為 Bug 而以無訊息方式卸除。

若要解決此錯誤,請發出重試或升級至最新版的 Azure IOT C# SDK。