Überwachen, Diagnostizieren und Behandeln von Problemen bei der Gerätekonnektivität mit Azure IoT Hub

Verbindungsprobleme bei IoT-Geräten können schwierig zu behandeln sein, weil es viele mögliche Fehlerquellen gibt. Anwendungslogik, physische Netzwerke, Protokolle, Hardware, IoT Hub und andere Clouddienste können Probleme verursachen. Die Möglichkeit zum Erkennen und Ermitteln der Ursache eines Problems ist wichtig. Weil aber bei einer IoT-Lösung im großen Stil Tausende von Geräten betroffen sein könnten, ist es nicht praktikabel, einzelne Geräte manuell zu überprüfen. IoT Hub wird in zwei Azure-Dienste integriert, um Sie bei Folgendem zu unterstützen:

  • Azure Monitor: mit Azure Monitor können Sie Telemetriedaten aus IoT Hub sammeln, analysieren und darauf reagieren. Nutzen Sie als Hilfe beim Erkennen, Diagnostizieren und Beheben dieser Probleme im großen Stil die Überwachungsfunktionen, die IoT Hub über Azure Monitor bereitstellt. Dies Ansatz umfasst das Einrichten von Warnungen zum Auslösen von Benachrichtigungen und Aktionen, wenn Geräteverbindungen getrennt werden, sowie das Konfigurieren von Protokollen, mit denen Sie die Bedingungen ermitteln können, die zu solchen Trennungen geführt haben.

  • Azure Event Grid: Verwenden Sie Azure Event Grid für kritische Infrastruktur und gerätespezifische Verbindungen, um von IoT Hub ausgegebene Geräteverbindungs- und Trennungsereignisse zu abonnieren. Mit Azure Event Grid können Sie jeden der folgenden Ereignishandler verwenden:

    • Azure Functions
    • Logic Apps
    • Azure Automation
    • WebHooks
    • Queue Storage
    • Hybridverbindungen
    • Event Hubs

Protokolle und Ports

Ein Gerät kann jedes der folgenden Protokolle verwenden, um eine Verbindung mit Ihrem IoT-Hub herzustellen. Wenn der ausgehende Port durch eine Firewall blockiert wird, kann das Gerät keine Verbindung herstellen.

Protokoll Ausgehender Port
MQTT 8883
MQTT über WebSockets 443
AMQP 5671
AMQP über WebSockets 443
HTTPS 443

Weitere Informationen zur MqTT-Konnektivität (Message Queuing Telemetry Transport) finden Sie unter Verbinden mit IoT Hub.

Überprüfen der Gerätekonnektivität

Verwenden Sie die Azure CLI- und IoT Hub Portaltools, um zu überprüfen, ob ein Gerät eine Verbindung mit Ihrem Hub herstellen und kommunizieren kann. Mit den Schritten in diesem Abschnitt können Sie isolieren, ob das Problem bei der Geräteauthentifizierung, bei Geräte-zu-Cloud-Messaging, bei Cloud-zu-Gerät-Messaging oder bei der Twin-Synchronisierung des Geräts besteht.

Voraussetzungen für die Konnektivitätsüberprüfung

  • Die Azure CLI mit der installierten Erweiterung azure-iot:

    az extension add --upgrade --name azure-iot
    
  • Ein Gerät, das in Ihrem IoT-Hub mit einem Verbindungszeichenfolge registriert ist. Führen Sie die folgenden Befehle aus, um ein Testgerät zu registrieren und dessen Verbindungszeichenfolge abzurufen. Ersetzen Sie <your-device-id> durch den Namen Ihres neuen Geräts und <your-iot-hub-name> durch einen IoT-Hub, den Sie bereits erstellt haben.

    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>
    

Überprüfen der Geräteauthentifizierung

Ein Gerät muss sich bei Ihrem Hub authentifizieren, bevor es Daten austauschen kann. So testen Sie die Authentifizierung:

  1. Verwenden Sie die Azure CLI, um eine Test-Telemetrienachricht aus der Geräteidentität zu senden. Eine erfolgreiche Übermittlung bestätigt, dass der Geräteschlüssel gültig ist:

    az iot device simulate --device-id <your-device-id> --hub-name <your-iot-hub-name> --msg-count 1
    
  2. Wenn die Authentifizierung fehlschlägt, überprüfen Sie, ob die Verbindungszeichenfolge des Geräts aktuell ist. Setzen Sie den Primärschlüssel zurück, um bei Bedarf einen neuen zu generieren:

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

    Rufen Sie dann die aktualisierte Verbindungszeichenfolge ab:

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

Generieren eines SAS-Testtokens

Wenn Ihr Gerät die SAS-Tokenauthentifizierung verwendet, können Sie ein bekanntes SAS-Token generieren, um Probleme mit Ihrem Tokengenerierungscode auszuschließen:

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

Ein gültiges SAS-Token sieht wie folgt aus: SharedAccessSignature sr=your-hub.azure-devices.net%2Fdevices%2FmyDevice&sig=xxxxxx&se=111111

Codebeispiele zum programmgesteuerten Generieren von SAS-Token finden Sie in den Beispielen Azure IoT für Node.js im Ordner iot-hub/Tutorials/ConnectivityTests.

Überprüfen der Gerät-zu-Cloud-Konnektivität

So überprüfen Sie, ob die von einem Gerät gesendete Telemetrie Ihren Hub erreicht:

  1. Senden von Test-Telemetriemeldungen vom Gerät:

    az iot device simulate --device-id <your-device-id> --hub-name <your-iot-hub-name> --msg-count 5
    
  2. Navigieren Sie im Azure-Portal zu Ihrem IoT-Hub. Wählen Sie unter "Überwachung " im Randleistenmenü "Metriken" aus.

  3. Wählen Sie im Dropdownmenü "Metrik" Telemetriemeldungen aus, die als Metrik gesendet wurden, und legen Sie den Zeitraum in der oberen rechten Ecke auf "Letzte Stunde" fest. Das Diagramm zeigt die Aggregatanzahl der vom Gerät gesendeten Nachrichten.

    Hinweis

    Es dauert ein paar Minuten, bis die Metriken verfügbar sind, nachdem Sie die Nachrichten gesendet haben.

Überprüfen der Cloud-zu-Gerät-Konnektivität

Verwenden Sie einen direkten Methodenaufruf, um den Cloud-zu-Gerät-Pfad zu überprüfen. Führen Sie das simulierte Gerät in einem Terminalfenster aus, und rufen Sie dann eine direkte Methode aus einem anderen auf:

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>

Eine erfolgreiche Antwort bestätigt, dass der Hub das Gerät erreichen kann. Wenn eine Zeitüberschreitung für den Aufruf eintritt, prüfen Sie, ob das Gerät angeschlossen ist, und ob es für Methodenaufrufe bereit ist.

Überprüfen der Synchronisierung von Gerätezwillingen

So prüfen Sie, ob die Geräte-Zwillingsdaten zwischen dem Gerät und dem Hub synchronisiert werden:

  1. Zeigen Sie den aktuellen Gerätezwilling an, um die gemeldeten Eigenschaften zu prüfen:

    az iot hub device-twin show --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
  2. Senden Sie eine gewünschte Eigenschaftsaktualisierung, und bestätigen Sie, dass das Gerät es empfängt:

    az iot hub device-twin update --set properties.desired='{"mydesiredproperty":"propertyvalue"}' --device-id <your-device-id> --hub-name <your-iot-hub-name>
    
  3. Führen Sie den Befehl „Twin Show“ erneut aus, um sich zu vergewissern, dass das Gerät die gewünschte Eigenschaft in seinen gemeldeten Eigenschaften bestätigt hat.

Event Grid im Vergleich zu Azure Monitor

Event Grid bietet eine Überwachungslösung mit geringer Wartezeit pro Gerät, die Sie zum Nachverfolgen von Geräteverbindungen bei kritischen Geräten und einer kritischen Infrastruktur verwenden können. Azure Monitor bietet eine Metrik mit dem Namen Verbundene Geräte, mit deren Hilfe Sie die Anzahl der mit Ihrem IoT-Hub verbundenen Geräte überwachen und eine Warnung auslösen können, wenn diese Anzahl einen statischen Schwellenwert unterschreitet.

Berücksichtigen Sie folgende Probleme bei Ihrer Entscheidung, ob Sie für ein bestimmtes Szenario Event Grid oder Azure Monitor verwenden möchten:

  • Warnungswartezeit: IoT Hub-Verbindungsereignisse werden durch Event Grid wesentlich schneller übermittelt. Diese Tatsache macht Event Grid zur besseren Wahl für Szenarien, in denen eine schnelle Benachrichtigung erwünscht ist.

  • Benachrichtigungen pro Gerät: Event Grid bietet die Möglichkeit zum Nachverfolgen von Verbindungsherstellungen und Verbindungstrennungen bei einzelnen Geräten. Diese Tatsache macht Event Grid zu einer besseren Wahl für Szenarien, in denen Sie die Verbindungen bei kritischen Geräten überwachen müssen.

  • Einfaches Setup: Azure Monitor-Metrikwarnungen ermöglichen ein einfaches Setup, bei dem keine Integration in andere Dienste erforderlich ist, um Benachrichtigungen über E-Mail, SMS, Voicemail und andere Benachrichtigungen zu übermitteln. Event Grid müssen Sie in andere Azure-Dienste integrieren, um Benachrichtigungen zu übermitteln. Beide Dienste können in andere Dienste integriert werden, um komplexere Aktionen auszulösen.

Event Grid: Überwachen von Ereignissen der Herstellung und Trennung von Verbindungen

Event Grid bietet eine geringere Ereignislatenz als Azure Monitor und ermöglicht die Überwachung auf Gerätebasis. Durch diese Faktoren wird Event Grid zur bevorzugten Methode für die Überwachung kritischer Geräte und einer kritischen Infrastruktur.

Hinweis

Zur Überwachung von Ereignissen der Herstellung und Trennung von Geräteverbindungen in der Produktion empfiehlt es sich, die Ereignisse DeviceConnected und DeviceDisconnected in Event Grid zu abonnieren, um Warnungen auszulösen und den Geräteverbindungsstatus zu überwachen.

Wenn Sie Warnungen zur Trennung von Geräteverbindungen mithilfe von Event Grid überwachen oder auslösen, müssen Sie die regelmäßigen Trennungen aufgrund von SAS-Tokenverlängerung auf Geräten herausfiltern, die die Azure IoT-SDKs verwenden. Weitere Informationen finden Sie unter MQTT device disconnect behavior with Azure IoT SDKs (Verbindungstrennungsverhalten von MQTT-Geräten bei Azure IoT-SDKs).

Weitere Informationen zum Überwachen von Geräteverbindungsereignissen mit Event Grid finden Sie in den folgenden Artikeln:

Azure Monitor: Verwenden von Protokollen zum Beheben von Verbindungsfehlern

Wenn Sie über Azure Monitor-Metrikwarnungen oder Event Grid Trennungen von Geräteverbindungen erkennen, können Sie die Ursache anhand von Protokollen beheben. In diesem Abschnitt wird beschrieben, wie Sie in Azure Monitor-Protokollen nach häufigen Problemen suchen. In den Schritten wird davon ausgegangen, dass Sie bereits eine Diagnoseeinstellung erstellt haben, um IoT Hub-Verbindungsprotokolle an einen Log Analytics Arbeitsbereich zu senden.

Nachdem Sie eine Diagnoseeinstellung zum Weiterleiten von IoT Hub-Ressourcenprotokollen an Azure Monitor-Protokolle erstellt haben, führen Sie die folgenden Schritte aus, um die Protokolle im Azure-Portal anzuzeigen.

  1. Navigieren Sie im Azure-Portal zu Ihrem IoT-Hub.

  2. Wählen Sie unter "Überwachung " im Randleistenmenü Ihres IoT-Hubs "Protokolle" aus.

  3. Wechseln Sie vom einfachen Modus zum KQL-Modus. Zum Isolieren von Verbindungsfehlerprotokollen für IoT Hub geben Sie im Abfrage-Editor die folgende Abfrage ein, und wählen Sie Ausführen aus:

    AzureDiagnostics
    | where ( ResourceType == "IOTHUBS" and Category == "Connections" and Level == "Error")
    
  4. Wenn Ergebnisse vorhanden sind, suchen Sie nach OperationName, ResultType (Fehlercode) und ResultDescription (Fehlermeldung), um weitere Details anzuzeigen.

    Screenshot, der ein Beispiel für ein Fehlerprotokoll zeigt.

Die folgenden Leitfäden für die Problemlösung bieten Hilfestellung für die häufigsten Fehler:

Azure Monitor: Verwenden von Protokollen zum Überwachen der Konnektivität für ein bestimmtes Gerät

Es kann Situationen geben, in der Sie Azure Monitor verwenden sollten, um Konnektivitätsfehler und Informationen für ein bestimmtes Gerät anzuzeigen. Um Konnektivitätsereignisse für ein Gerät zu isolieren, können Sie die gleichen Schritte wie im vorherigen Abschnitt ausführen, aber die folgende Abfrage eingeben. Ersetzen Sie <your-device-id> mit dem Namen Ihres Geräts.

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

Die Abfrage gibt sowohl Fehler- als auch Informationsereignisse für Ihr Zielgerät zurück. Die folgende Beispielausgabe zeigt ein informationales deviceConnect-Ereignis:

Screenshot des deviceConnect-Ereignisses in Protokollen.

Verbindungstrennungsverhalten von MQTT-Geräten bei Azure IoT-SDKs

Azure IoT-Geräte-SDKs trennen die Verbindung mit IoT Hub und stellen eine Verbindung erneut her, wenn sie SAS-Token über das MQTT-Protokoll (und MQTT über WebSockets) verlängern. In Protokollen wird dies als Informationsereignisse der Trennung und Herstellung von Geräteverbindungen angezeigt, die manchmal von Fehlerereignissen begleitet werden.

Standardmäßig beträgt die Token-Lebensdauer für alle SDKs 60 Minuten; Entwickler können dies jedoch in einigen SDKs ändern. In der folgenden Tabelle werden die Tokenlebensdauer, die Tokenverlängerung und das Tokenverlängerungsverhalten für die einzelnen SDKs zusammengefasst:

SDK Tokenlebensdauer Tokenverlängerung Verlängerungsverhalten
.NET 60 Minuten, konfigurierbar 85 % der Lebensdauer, konfigurierbar Das SDK trennt die Verbindung und stellt sie während der Tokenlebensdauer, zuzüglich einer Karenzzeit von 10 Minuten, wieder her. Informationsereignisse und Fehler, die in Protokollen generiert werden.
Java 60 Minuten, konfigurierbar 85 % der Lebensdauer, nicht konfigurierbar Das SDK trennt die Verbindung und stellt sie während der Tokenlebensdauer, zuzüglich einer Karenzzeit von 10 Minuten, wieder her. Informationsereignisse und Fehler, die in Protokollen generiert werden.
Node.js 60 Minuten, konfigurierbar konfigurierbar Das SDK trennt die Verbindung und stellt sie bei Erneuerung des Tokens wieder her. In Protokollen werden nur Informationsereignisse generiert.
Python 60 Minuten, konfigurierbar 120 Sekunden vor Ablauf Das SDK trennt die Verbindung und stellt sie während der Tokenlebensdauer wieder her.

Die folgenden Screenshots zeigen das Tokenverlängerungsverhalten in Azure Monitor-Protokollen für verschiedene SDKs. Wie oben erwähnt wurden die Tokenlebensdauer und der Verlängerungsschwellenwert gegenüber ihren Standardeinstellungen geändert.

  • .NET Geräte-SDK mit einer Tokenlebensdauer von 1.200 Sekunden (20 Minuten) und einer Verlängerung, die auf 90% der Lebensdauer festgelegt ist. Die Verbindung wird alle 30 Minuten getrennt:

    Screenshot, das das Fehlerverhalten bei der Token-Erneuerung über MQTT in Azure Monitor Logs mit dem dotnet SDK zeigt.

  • Java-SDK mit einer Tokenlebensdauer von 300 Sekunden (5 Minuten) und einem Standardwert für die Verlängerung von 85 % der Lebensdauer. Die Verbindung wird alle 15 Minuten getrennt:

    Screenshot des Fehlerverhaltens bei der Tokenverlängerung über MQTT in Azure Monitor-Protokollen mit dem Java-SDK.

  • Node SDK mit einer Tokenlebensdauer von 300 Sekunden (5 Minuten) und die Tokenverlängerung erfolgt alle 3 Minuten. Die Verbindungstrennung erfolgt bei der Tokenverlängerung. Außerdem liegen keine Fehler vor. Es werden nur Informationen zu Verbindungs-/Trennungsereignissen ausgegeben:

    Screenshot des Fehlerverhaltens bei der Tokenverlängerung über MQTT in Azure Monitor-Protokollen mit dem Node-SDK.

Mit der folgenden Abfrage wurden die Ergebnisse erfasst. Die Abfrage extrahiert den Namen und die Version des SDKs aus dem Eigenschaftenbehälter. Weitere Informationen finden Sie unter SDK-Version in IoT Hub-Protokollen.

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

Als Entwickler von IoT-Lösungen oder Operator müssen Sie dieses Verhalten beachten, um Ereignisse von Verbindungsherstellung/Verbindungstrennung und zugehörige Fehler in Protokollen zu interpretieren. Wenn Sie die Tokenlebensdauer oder das Verlängerungsverhalten für Geräte ändern möchten, überprüfen Sie, ob das Gerät eine Gerätezwillingseinstellung oder eine Gerätemethode implementiert, die diese Änderung ermöglicht.

Wenn Sie Geräteverbindungen mit Event Hubs überwachen, stellen Sie sicher, dass Sie eine Möglichkeit einbauen, die regelmäßigen Trennungen aufgrund einer Erneuerung des SAS-Tokens herauszufiltern. Lösen Sie beispielsweise keine Aktionen basierend auf Trennungen aus, sofern dem Trennungsereignis innerhalb eines bestimmten Zeitraums ein Verbindungsereignis folgt.

Hinweis

IoT Hub unterstützt nur eine aktive MQTT-Verbindung pro Gerät. Jede neue MQTT-Verbindung für die gleiche Geräte-ID bewirkt, dass IoT Hub die vorhandene Verbindung löscht.

400027 ConnectionForcefullyClosedOnNewConnection wird in IoT Hub-Protokollen protokolliert

Ich habe die Schritte ausprobiert, aber sie funktionieren nicht.

Wenn das Problem mit den vorstehenden Schritten nicht behoben werden konnte, versuchen Sie Folgendes: