Wozu dient der MQTT-Keep-Alive-Parameter?

Keep Alive im MQTT-Protokoll

Warum wir Keep Alive brauchen

Das MQTT-Protokoll wird auf dem verbindungsorientierten TCP-Protokoll gehostet und sorgt für einen stabilen und geordneten Bytefluss zwischen zwei verbundenen Parteien. In einigen Fällen kann es bei TCP jedoch zu Halbverbindungsproblemen kommen. Eine Halbverbindung ist eine Verbindung, die auf einer Seite getrennt oder nicht hergestellt wurde, während die Verbindung auf der anderen Seite noch besteht. In diesem Fall kann der halbverbundene Teilnehmer kontinuierlich Daten senden, die offensichtlich nie die andere Seite erreichen. Um durch Halbverbindungen verursachte schwarze Löcher in der Kommunikation zu vermeiden, bietet das MQTT-Protokoll einen Keep-Alive-Mechanismus, der es dem Client und dem MQTT-Server ermöglicht, festzustellen, ob ein Halbverbindungsproblem vorliegt, und die entsprechende Verbindung zu schließen.

Mechanismus und Verwendung von Keep Alive

Bei Anschluss

Wenn ein MQTT-Client stellt eine Verbindung her zu MQTT-Broker, kann der Keep-Alive-Mechanismus zwischen den kommunizierenden Parteien aktiviert werden, indem das Header-Feld der Keep-Alive-Variable im Paket des Verbindungsanforderungsprotokolls auf einen Wert ungleich Null gesetzt wird. Keep Alive ist eine Ganzzahl von 0 bis 65535, die die maximale Zeit in Sekunden darstellt, die zwischen vom Client gesendeten MQTT-Protokollpaketen vergehen darf.

Wenn der Broker eine Verbindungsanforderung von einem Client erhält, überprüft er den Wert des Keep Alive-Felds im Variablenheader. Wenn ein Wert vorhanden ist, aktiviert der Broker den Keep-Alive-Mechanismus.

In dem MQTT 5.0 Standard wurde auch das Konzept von Server Keep Alive eingeführt, das es dem Broker ermöglicht, den in der Clientanforderung enthaltenen Keep Alive-Wert zu akzeptieren oder ihn zu überschreiben, abhängig von seiner Implementierung und anderen Faktoren. Wenn der Broker diesen Wert außer Kraft setzt, muss er den neuen Wert im Feld „Server Keep Alive“ des Verbindungsbestätigungspakets (CONNACK) festlegen, und der Client muss diesen Wert verwenden, um seinen eigenen vorherigen „Keep Alive“-Wert beim Lesen zu überschreiben es im CONNACK.

Der Keep-Alive-Prozess

  1. Kundenprozess

    Nachdem die Verbindung hergestellt wurde, muss der Client sicherstellen, dass das Intervall zwischen zwei von ihm gesendeten MQTT-Protokollpaketen den Keep Alive-Wert nicht überschreitet. Wenn der Client im Leerlauf ist und keine Pakete zu senden hat, kann er stattdessen PINGREQ-Protokollpakete senden.

    Wenn der Client ein PINGREQ-Paket sendet, muss der Broker ein PINGRESP-Paket zurücksenden. Wenn der Client innerhalb einer zuverlässigen Zeit kein PINGRESP-Paket vom Server erhält, bedeutet dies, dass die Verbindung halb ist, der Broker offline ist oder ein Netzwerkfehler vorliegt und der Client die Verbindung schließen sollte.

  2. Maklerprozess

    Wenn der Broker nach dem Herstellen der Verbindung innerhalb der 1,5-fachen Keep Alive-Zeit keine Pakete vom Client empfängt, geht er davon aus, dass es ein Problem mit der Verbindung zum Client gibt, und der Broker trennt die Verbindung zum Client.

    Wenn der Broker ein PINGREQ-Protokollpaket vom Client empfängt, muss er zur Bestätigung mit einem PINGRESP-Protokollpaket antworten.

  3. Client-Übernahmemechanismus

    Wenn innerhalb des Brokers eine Halbverbindung besteht und der entsprechende Client eine Wiederverbindung oder eine neue Verbindung initiiert, startet der Broker den Client-Übernahmemechanismus: Er schließt die alte Halbverbindung und stellt eine neue Verbindung mit dem Client her.

    Dieser Mechanismus stellt sicher, dass der Client nicht aufgrund eines Halbverbindungsproblems an der erneuten Verbindung gehindert wird.

So verwenden Sie Keep Alive in EMQX

Im EMQX, können Sie das Verhalten des Server-Keep-Alive-Mechanismus über die Konfigurationsdatei anpassen. Das relevante Feld lautet wie folgt:

zone.external.server_keepalive

Wenn dieser Wert nicht festgelegt ist, wird die Keep Alive-Zeit vom Client zum Zeitpunkt der Verbindungsherstellung bestimmt.

Wenn dieser Wert festgelegt ist, erzwingt der Broker die Aktivierung des Server Keep Alive-Mechanismus für alle Verbindungen in dieser Zone und verwendet diesen Wert, um den Wert in der Client-Verbindungsanforderung zu überschreiben.

zone.external.keepalive_backoff

TypOptionaler WertStandard
schweben> 0,50,75

Das MQTT-Protokoll erfordert, dass der Broker davon ausgeht, dass der Client getrennt ist, wenn er innerhalb von 1,5 Mal der Keep-Alive-Zeit keine Protokollpakete vom Client empfängt.

In EMQX haben wir den Keepalive-Backoff-Faktor eingeführt und diesen Faktor über die Konfigurationsdatei verfügbar gemacht, damit Benutzer das Keep-Alive-Verhalten auf der Brokerseite flexibler steuern können.

Nach Einführung des Backoff-Faktors berechnet EMQX das maximale Timeout anhand der folgenden Formel:

Keepalive * backoff * 2

Der Standardwert des Backoffs ist 0,75. Daher entspricht das Verhalten von EMQX vollständig dem MQTT-Standard, wenn der Benutzer diese Konfiguration nicht ändert.

Beziehen Sie sich auf die EMQX-Konfigurationsdokumentation für mehr Informationen.

Hinweis: Einstellung von Keep Alive für WebSocket-Verbindungen

EMQX unterstützt den Clientzugriff über WebSockets. Wenn ein Client eine Verbindung mit WebSockets initiiert, muss er nur den Keep Alive-Wert in den Client-Verbindungsparametern festlegen. Beziehen auf Herstellen einer Verbindung zu einem MQTT-Server über WebSocket.

Zusammenfassung

Dieser Artikel stellt den Keep-Alive-Mechanismus im MQTT-Protokoll vor und wie man ihn in EMQX verwendet. Entwickler können diese Funktion verwenden, um die Stabilität von zu gewährleisten MQTT-Verbindungen und bauen Sie robustere IoT-Anwendungen.

Ursprünglich erschienen bei

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *