本文說明您在使用IoT中樞時可能會遇到之常見錯誤碼的原因和解決方案。
400027 連線在新連線上強制關閉
如果您的裝置中斷連線,並對使用 .NET SDK 和 MQTT 傳輸類型的 ConnectionStatusChangeReason 回報 Communication_Error,您可能會看到 400027 ConnectionForcefullyClosedOnNewConnection 錯誤。 或者,您裝置到雲端的對應項作業 (例如讀取或修補檔報告屬性) 或直接方法調用失敗,錯誤碼 400027。
當另一個用戶端使用相同的身分識別建立與 IoT 中樞的新連線時,就會發生此錯誤,因此 IoT 中樞會關閉先前的連線。 IoT 中樞不允許多個用戶端使用相同的身分識別進行連線。
若要解決此錯誤,請確定每個用戶端都使用自己的身分識別連線到IoT中樞。
401003 IoT 中樞未經授權
在記錄中,您可能會看到裝置與 401003 IoTHubUnauthorized 中斷連線的模式,隨後接著 404104 DeviceConnectionClosedRemotely,然後在稍後成功連線。
或者,對IoT中樞的要求失敗,並出現下列其中一個錯誤訊息:
- 授權標頭遺失
- IotHub '*' 不包含指定的裝置 '*'
- 授權規則 '*' 不允許存取 '*'
- 此裝置的驗證失敗、更新令牌或憑證並重新連線
- 指紋與設定不匹配:指紋:SHA1Hash=*、SHA2Hash=*;設定:PrimaryThumbprint=*、SecondaryThumbprint=*
- 主體 user@example.com 未獲得 /exampleOperation 上的 GET 授權,因為沒有指派的許可權
發生此錯誤的原因是,對於 MQTT,某些 SDK 仰賴 IoT 中樞在 SAS 權杖到期時發出中斷連線,以了解何時要加以重新整理。 所以:
- SAS 令牌到期
- IoT 中樞會注意到到期日,並將裝置與401003 IoTHubUnauthorized 中斷連線
- 裝置隨即完成與 404104 DeviceConnectionClosedRemotely 中斷連線
- IoT SDK 會產生新的SAS令牌
- 裝置已成功與IoT中樞重新連線
或者,IoT 中樞無法驗證驗證標頭、規則或金鑰。 這一結果可能是由於徵兆中引用的任何原因所致。
若要解決此錯誤,如果使用IoT SDK進行使用裝置連接字串進行連線,就不需要採取任何動作。 IoT SDK 會重新產生新的令牌,以在 SAS 令牌到期時重新連線。
默認令牌存留期在 SDK 之間為 60 分鐘;不過,對於某些 SDK,令牌存留期和令牌更新閾值是可設定的。 此外,當裝置在令牌更新時中斷連線並重新連線時所產生的錯誤會因每個 SDK 而有所不同。 若要深入瞭解,以及瞭解如何判斷裝置在記錄中所使用的 SDK,請參閱 監視、診斷及疑難排解 Azure IoT 中樞裝置連線問題 中的 MQTT 裝置中斷連線行為 一節。
對於裝置開發人員來說,如果大量錯誤產生是個問題,請切換至 C SDK,它會在到期前更新 SAS 令牌。 AMQP 中,SAS 令牌可以在不中斷連線的情況下重新整理。
一般而言,呈現的錯誤訊息應該說明如何修正錯誤。 如果基於某些原因而無法存取錯誤訊息詳細資料,請確定:
- 您所使用的 SAS 或其他安全性令牌未過期。
- 針對 X.509 憑證驗證,裝置憑證或與裝置相關聯的 CA 憑證不會過期。 若要瞭解如何向IoT中樞註冊 X.509 CA 憑證,請參閱 教學課程:建立和上傳要測試的憑證。
- 針對 X.509 憑證指紋驗證,裝置憑證的指紋會向 IoT 中樞註冊。
- 您所使用通訊協定的授權認證格式正確。 若要深入瞭解,請參閱 使用 Microsoft Entra ID 來控制 IoT 中樞的存取權。
- 所使用的授權規則具有所要求的作業許可權。
- 針對以 「principal...“開頭的最後一個錯誤訊息,您可以將正確的 Azure RBAC 許可權層級指派給使用者,來解決此錯誤。 例如,IoT 中樞的擁有者可以指派「IoT 中樞數據擁有者」角色,以提供所有許可權。 請嘗試此角色來解決許可權不足的問題。
備註
當裝置時間與伺服器時間大於五分鐘時,某些裝置可能會遇到時間漂移問題。 此錯誤可能發生於裝置已經順利連接到 IoT 中樞數週甚至數月後,突然開始不斷拒絕連線。 此錯誤也可能專屬於連線到IoT中樞的裝置子集,因為時間漂移可能會根據裝置第一次連線或開啟的時間而定,以不同的速率發生。
通常,使用 NTP 執行時間同步,或重新啟動裝置(這可以在開機順序期間自動執行時間同步處理)可修正問題,並允許裝置再次連線。 若要避免此錯誤,請將裝置設定為使用NTP執行定期時間同步處理。 您可以根據裝置體驗的漂移量,排程每日、每周或每月的同步處理。 如果您無法在裝置上設定定期NTP同步處理,請排程定期重新啟動。
403002 超出 IoT 中樞配額
您可能會看到 IoT 中樞的要求失敗,並出現 403002 IoTHubQuotaExceeded 錯誤。 在 Azure 入口網站中,IoT 中樞裝置清單不會載入。
當超過IoT中樞的每日訊息配額時,通常會發生此錯誤。 若要解決此錯誤:
- 升級或增加IoT中樞上的單位數目 ,或等候下一個UTC天重新整理每日配額。
- 若要了解作業(例如雙 重查詢和直接方法)如何計入配額,請參閱 每項作業費用 一節,位於 Azure IoT 中樞計費資訊 中。
- 若要設定每日配額使用量的監視,請設定警示,其中包含 使用的訊息總數計量。 如需逐步指示,請參閱教學課程:使用 IoT 中樞設定及使用計量和記錄的設定計量一節。
當向IoT中樞註冊的裝置數目接近或超過IoT中樞的配額限制時,大容量導入作業也可能傳回此錯誤。 若要深入瞭解,請參閱匯入作業疑難排解,該節為大量匯入和匯出 IoT 中樞裝置身分識別中的一部分。
403004超過裝置佇列深度上限
嘗試傳送雲端到裝置訊息時,您可能會看到要求失敗,並出現錯誤 403004 或 DeviceMaximumQueueDepthExceeded。
此錯誤的根本原因是,針對裝置加入佇列的訊息數目超過 佇列限制。
您遇到此限制的最可能原因是,您使用 HTTPS 來接收訊息,這會導致系統使用 ReceiveAsync 持續輪詢,從而導致 IoT 中樞限制請求。
使用 HTTPS 的雲端到裝置訊息支援模式是間歇性連線的裝置,這些裝置不常檢查訊息(少於每 25 分鐘)。 若要降低進入佇列限制的可能性,請切換至適用於雲端到裝置訊息的AMQP或 MQTT。
或者,增強裝置端邏輯,以快速完成、拒絕或放棄佇列訊息、縮短存留時間,或考慮傳送較少的訊息。 如需詳細資訊,請參閱瞭解IoT中樞雲端到裝置傳訊的訊息到期(存留時間)一節。
最後,請考慮在達到限制之前,使用清除佇列 API 定期清除擱置中的訊息。
403006超過裝置使用中檔案上傳限制上限
您可能會看到檔案上傳要求失敗,錯誤碼 403006 DeviceMaximumActiveFileUploadLimitExceeded,並顯示訊息「使用中檔案上傳要求數目不能超過 10」。
因為每個裝置用戶端都受限於 並行檔案上傳,因此會發生此錯誤。 如果您的裝置未在檔案上傳完成時通知 IoT 中樞,您可以輕鬆地超過限制。 不可靠的裝置端網路通常會造成此問題。
若要解決此錯誤,請確定裝置可以立即 通知 IoT 中樞檔案上傳完成。 然後,請嘗試將檔案上傳設定的 SAS 令牌 TTL 縮短。
找不到404001裝置
在雲端到裝置 (C2D) 通訊期間,例如 C2D 訊息、對應項更新或直接方法,您可能會看到作業失敗,並出現 404001 DeviceNotFound 錯誤。
作業失敗,因為IoT中樞找不到裝置。 裝置未註冊或已停用。
若要解決此錯誤,請註冊您使用的裝置標識碼,然後再試一次。
404103裝置不在在線
您可能會看到裝置的直接方法失敗 (即使裝置已上線),並出現 404103 DeviceNotOnline 錯誤。
如果您知道裝置已上線,但仍收到錯誤,則可能是因為未在裝置上註冊直接方法回撥而發生錯誤。
如需正確設定裝置以進行直接方法回呼的詳細資訊,請參閱裝置上處理直接方法一節的裝置上處理直接方法。
404104裝置連線遠端關閉
您可能會看到裝置會定期中斷連線(例如每 65 分鐘),並在 IoT 中樞資源記錄中看到 404104 DeviceConnectionClosedRemotely 。 有時候,您也會看到 401003 IoTHubUnauthorized,並在稍後一分鐘內看到一個裝置成功連線活動。
或者,裝置會隨機中斷連線,而且您會在 IoT 中樞資源記錄中看到 404104 DeviceConnectionClosedRemotely 。
或者,會一次中斷連線許多裝置,您會在連線的裝置 (connectedDeviceCount) 計量中看到下降,而且 Azure 監視器記錄中會有高於平常的 404104 DeviceConnectionClosedRemotely 和 500xxx 內部錯誤。
發生此錯誤的原因是 用來連線到IoT中樞的SAS令牌 已過期,這會導致IoT中樞中斷裝置連線。 當裝置重新刷新令牌時,會重新建立連線。 例如, 根據預設,C SDK SAS 令牌會每小時到期,這可能會導致一般中斷連線。 若要深入瞭解,請參閱 401003 IoTHubUnauthorized。
其他一些可能性包括:
- 若超過 MQTT 保持運作時間,則裝置會遺失基礎網路連線,進而導致遠端閒置逾時。每個裝置的 MQTT 保持運作設定可能有所不同。
- 裝置傳送 TCP/IP 層級重設,但未傳送應用層級
MQTT DISCONNECT。 基本上,裝置已突然關閉基礎通訊端連線。 有時候,舊版 Azure IoT SDK 中的 Bug 可能會導致此問題。 - 裝置端應用程式損毀。
或者,IoT 中樞可能會遇到暫時性問題。 如需詳細資訊,請參閱 500xxx 內部錯誤。
若要解決此錯誤:
- 請參閱錯誤 401003 IoTHubUnauthorized 的指引。
- 藉由 測試連線,確定裝置與IoT中樞有良好的連線能力。 如果網路不可靠或斷斷續續,則不建議增加保持運作的值,因為這可能會導致偵測 (例如,透過 Azure 監視器警示) 花費較長的時間。
- 使用最新版的 Azure IoT 中樞 SDK。
- 請參閱 500xxx 內部錯誤指引。
備註
建議您使用 Azure IoT 裝置 SDK 來可靠地管理連線。 若要深入瞭解,請參閱 管理裝置重新連線以建立復原應用程式
409001裝置已經存在
嘗試在 IoT Hub 中註冊裝置時,您可能會看到要求失敗,並出現錯誤代碼 409001:DeviceAlreadyExists。
因為 IoT 中樞內已經有具有相同裝置識別碼的裝置,因此會發生此錯誤。
若要解決此錯誤,請使用不同的裝置標識碼,然後再試一次。
409002連結建立衝突
您可能會在記錄中看到 LinkCreationConflict 409002錯誤,以及裝置中斷連線或雲端到裝置訊息失敗。
一般而言,當 IoT 中樞偵測到用戶端有一個以上的連線時,就會發生此錯誤。 事實上,當新的連線要求送達具有現有連線的裝置時,IoT 中樞會關閉現有的連線,並出現此錯誤。
在最常見的情況下,個別的問題(例如 404104 DeviceConnectionClosedRemotely)會導致裝置中斷連線。 裝置會嘗試立即重新建立連線,但 IoT 中樞仍會考慮裝置已連線。 IoT 中樞會關閉先前的連線並記錄此錯誤。
或者,故障的裝置端邏輯會在裝置已開啟時建立連線。
若要解決此錯誤,請在您可以疑難解答的記錄中尋找其他錯誤,因為此錯誤通常會顯示為不同暫時性問題的副作用。 否則,只有在連線中斷時才發出新的連線請求。
412002裝置訊息鎖失
嘗試傳送雲端到裝置的訊息時,您可能會看到要求失敗,並出現 412002 DeviceMessageLockLost 錯誤。
發生此錯誤的原因,是因為當裝置從佇列收到雲端到裝置的訊息 (例如,使用 ReceiveAsync()) 時,IoT 中樞會以一分鐘的鎖定逾時期間來鎖定訊息。 如果裝置在鎖定逾時到期後嘗試完成訊息,IoT 中樞會擲回此例外狀況。
如果 IoT 中樞在一分鐘的鎖定逾時期間內未收到通知,則會將訊息設回 佇列 狀態。 裝置可以嘗試再次接收訊息。 若要防止未來發生錯誤,請實作裝置端邏輯,以在接收訊息的一分鐘內完成訊息。 無法變更此一分鐘的暫停。
429xxx 限流例外狀況
您可能會看到對 IoT 中樞的要求失敗,並出現 開頭為 429 的錯誤,例如:
- 429000 - GenericTooManyRequests
- 429001 – ThrottlingException:要求的作業超過 節流限制 。
- 429002 - ThrottleBacklogLimitExceeded:因節流緣故,進入積壓的請求數已超過積壓限制。
- 429003 - ThrottlingBacklogTimeout:由於節流而積壓的要求在待處理項目佇列中等候時已逾時。
- 429004 - ThrottlingMaxActiveJobCountExceeded
- 429005 – DeviceThrottlingLimitExceeded
您只能透過 Azure 監視器,在指標節流錯誤數目下監視429001。 目前,其他節流錯誤沒有相關聯的計量,但會在記錄中擷取。
若要解決此錯誤,請比較遙測訊息傳送嘗試計量與先前指定的限制,來檢查您是否達到節流限制。 您也可以檢查 節流錯誤次數指標。 如需這些計量的相關信息,請參閱 裝置遙測計量。 如需如何使用計量來協助您監視IoT中樞的資訊,請參閱 監視 Azure IoT 中樞。
IoT 中樞只有在超過限制太久之後才會傳回429001 – 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中樞內部且可能是暫時性的。 如需詳細資訊,請參閱 500xxx 內部錯誤。
若要解決此錯誤,請參閱 500xxx 內部錯誤。
504101 閘道逾時
嘗試從IoT中樞叫用直接方法到裝置時,您可能會看到要求失敗,並出現 閘道時間504101錯誤。
之所以發生此錯誤,是因為IoT中樞發生錯誤,且無法在逾時之前確認直接方法是否已完成。或者,使用舊版的 Azure IoT C# SDK (<1.19.0),裝置與 IoT 中樞之間的 AMQP 連結可能會因為 Bug 而以無訊息方式卸除。
若要解決此錯誤,請發出重試或升級至最新版的 Azure IOT C# SDK。