So verwenden Sie das MQTT-Paket zum Implementieren von Publizieren und Abonnieren

Das MQTT-Protokoll kommuniziert durch den Austausch vordefinierter MQTT-Steuerpakete. Wir werden nehmen MQTTX als Beispiel, um zu zeigen, wie die Publish-and-Subscribe-Funktion über MQTT-Pakete implementiert wird.

Verbinden

Das MQTT-Protokoll basiert auf dem TCP/IP-Protokoll. Sowohl der MQTT-Broker als auch der Client benötigen eine TCP/IP-Adresse.

Makler

1.png

Wenn Sie derzeit keinen verfügbaren MQTT-Broker haben, EMQX bietet eine öffentliche Broker-Adresse zum Testen: broker.emqx.io:1883 .

Klient

WX201911281139012x.png

Die Konfiguration des Clients im MQTTX-Tool ist eigentlich die Konfiguration der Connect-Pakete in der MQTT-Protokoll. Im Folgenden werden die zugehörigen Konfigurationselemente erläutert:

Kunden ID

Der Server verwendet die ClientId, um den Client zu identifizieren. Jeder Client, der sich mit dem Server verbindet, hat eine eindeutige ClientId. Sowohl der Client als auch der Server müssen die ClientId verwenden, um den Status in Bezug auf die zu identifizieren MQTT-Sitzung zwischen ihnen.

Die Client-ID muss vorhanden sein, aber der Server kann dem Client erlauben, eine Null-Byte-Client-ID bereitzustellen. In diesem Fall muss der Server dies als Sonderfall behandeln und diesem Client eine eindeutige ClientId zuweisen. Dann kann er dieses CONNECT-Paket normal verarbeiten.

Benutzername Passwort

MQTT kann die zugehörige Authentifizierung und Autorisierung implementieren, indem der Benutzername und das Passwort gesendet werden. Wenn diese Informationen jedoch nicht verschlüsselt sind, werden der Benutzername und das Passwort im Klartext gesendet. EMQX unterstützt nicht nur SSL / TLS-Verschlüsselung, sondern bietet auch emqx-auth-benutzername Plugin zum Verschlüsseln von Passwörtern.

Bleib am Leben

Keep Alive ist ein Zeitintervall in Sekunden. Es bezieht sich auf das maximal zulässige Zeitintervall zwischen dem Zeitpunkt, an dem der Client ein Steuerpaket überträgt, und dem Zeitpunkt, an dem die nächste Nachricht gesendet wird. Der Client ist dafür verantwortlich, dass das Intervall zum Senden von Steuerpaketen den Wert des Keep-Alive nicht überschreitet. Wenn kein anderes Steuerpaket gesendet werden kann, muss der Client ein PINGREQ-Paket senden.

Wenn der Wert von Keep Alive ungleich Null ist und der Server das Kontrollpaket vom Client nicht innerhalb von 1,5 Mal nach der Keep Alive-Zeit empfängt, muss er die Netzwerkverbindung des Clients trennen und die Netzwerkverbindung als getrennt betrachten.

Saubere Sitzung

Client und Server können den Sitzungsstatus speichern, um eine zuverlässige Nachrichtenübertragung über Netzwerkverbindungen zu unterstützen. Dieses Flag teilt dem Server mit, ob es sich bei dieser Verbindung um eine ganz neue Verbindung handelt.

Der Sitzungsstatus des Clients umfasst:

  • QoS 1- und QoS 2-Level-Meldungen, die an den Server gesendet, aber noch nicht bestätigt wurden
  • QoS-2-Level-Meldungen, die vom Server empfangen, aber noch nicht bestätigt wurden

Der Sitzungsstatus des Servers umfasst:

  • Ob die Sitzung vorhanden ist, auch wenn der Rest des Sitzungsstatus leer ist.
  • Abonnementinformationen des Kunden.
  • QoS 1- und QoS 2-Level-Meldungen, die an den Client gesendet, aber noch nicht bestätigt wurden
  • An den Client zu übertragende QoS 1- und QoS 2-Level-Nachrichten.
  • QoS-2-Level-Meldungen, die vom Client empfangen, aber noch nicht bestätigt wurden
  • Optional, QoS 0-Level-Nachricht, die an den Client gesendet werden soll.

Wenn das CleanSession-Flag auf 1 gesetzt ist, müssen Client und Server alle vorherigen Sitzungen verwerfen und eine neue Sitzung starten. Die Sitzung dauert nur so lange wie die Netzwerkverbindung besteht.

Wenn das CleanSession-Flag auf 0 gesetzt ist, muss der Server die Kommunikation mit dem Client basierend auf dem Status der aktuellen Sitzung (identifiziert durch ClientId) wieder aufnehmen. Wenn dieser Client-ID keine Sitzung zugeordnet ist, muss der Server eine neue Sitzung erstellen. Wenn die Verbindung getrennt wird, müssen der Client und der Server die Sitzungsinformationen speichern.

Connack bestätigt Verbindungsanfrage

Wenn der Client ein Connect-Paket sendet, um eine Verbindung zum Server anzufordern, muss der Server als Antwort auf das Connect-Paket vom Client ein Connack-Paket senden. Wenn der Client das CONNACK-Paket nicht innerhalb einer angemessenen Zeit vom Server erhält, sollte der Client die Netzwerkverbindung schließen. Die angemessene Zeit hängt von der Art der Anwendung und der Kommunikationsinfrastruktur ab. Im MQTTXkönnen Sie über Connection Timeout eine angemessene Timeout-Zeit festlegen.

Verbinden.png

Connack-Nachrichten enthalten zwei wichtige Zeichen für den Session Present- und Connect Return-Code.

Sitzung vorhanden

Das Session-Present-Flag zeigt an, ob die aktuelle Session eine neue Session ist. Wenn der Server eine Verbindung mit einem CleanSession-Flag von 1 empfängt, ist das SessionPresent-Flag im Connack-Paket 0. Wenn der Server eine Verbindung mit CleanSession 0 empfängt, hängt der Wert des SessionPresent-Flags davon ab, ob der Server den Sitzungsstatus von gespeichert hat der Client entsprechend ClientId. Wenn der Server den Sitzungsstatus gespeichert hat, ist das SessionPresent-Flag im Connack-Paket 1. Wenn der Server keinen gespeicherten Sitzungsstatus hat, ist das SessionPresent-Flag im Connack-Paket 0.

Rückgabecode verbinden

Der Verbindungsrückgabecode stellt die Antwort des Servers auf diese Verbindung dar, und 0 gibt an, dass die Verbindung vom Server akzeptiert wurde. Wenn der Server ein gültiges CONNECT-Paket empfängt, es aber aus irgendeinem Grund nicht verarbeiten kann, sollte der Server versuchen, ein CONNACK-Paket mit einem Rückgabecode ungleich Null (eins in der folgenden Tabelle) zu senden. Wenn der Server ein CONNACK-Paket mit einem Rückgabecode ungleich Null sendet, muss er die Netzwerkverbindung schließen.

WertRückgabecode-AntwortBeschreibung
00x00 Verbindung akzeptiertDie Verbindung wurde vom Server akzeptiert
10x01 Verbindung abgelehnt, nicht unterstützte ProtokollversionDer Server unterstützt die vom Client angeforderte MQTT-Protokollebene nicht
20x02 Verbindung abgelehnt, unqualifizierte Client-IDDie Client-ID ist korrekt UTF-8-kodiert, wird aber vom Server nicht zugelassen
30x03 Verbindung abgelehnt, Server ist nicht verfügbarDie Netzwerkverbindung wurde hergestellt, aber der MQTT-Dienst ist nicht verfügbar
40x04 Verbindung abgelehnt, ungültiger Benutzername oder PasswortDatenformat für Benutzername oder Passwort ist ungültig
50x05 Verbindung abgelehnt, nicht autorisiertDer Client ist nicht berechtigt, sich mit diesem Server zu verbinden
6-255beibehalten

Wenn alle Verbindungsrückgabecodes in der obigen Tabelle als unangemessen angesehen werden, muss der Server die Netzwerkverbindung schließen, ohne ein CONNACK-Paket zu senden.

Der Client sendet ein Abonnementpaket an den Server, um ein oder mehrere Abonnements zu erstellen. Jeder registrierte Kunde beschäftigt sich mit einem oder mehreren Themen. Um Anwendungsnachrichten an Themen weiterzuleiten, die mit diesen Abonnements übereinstimmen, sendet der Server ein Veröffentlichungspaket an den Client. Das Subscribe-Paket gibt das maximale QoS-Level für jedes Abonnement an, und der Server sendet basierend darauf eine Anwendungsnachricht an den Client.

WX201911281425432x.png

Die Nutzlast eines abonnierten Pakets muss mindestens ein Paar aus Themenfilter- und QoS-Level-Feldkombinationen enthalten. Ein Subscribe-Paket ohne Payload ist eine Verletzung des Protokolls.

Verwenden MQTTX um den Broker zu verbinden broker.emqx.io:1883und erstellen Sie ein Abonnement mit dem Thema testtopic/# und Qos gleich 2.

WX201911281439252x.png

Der Server sendet ein Suback – Paket an den Client , um zu bestätigen , dass er das Subscribe – Paket erhalten hat und es verarbeitet .

Abonnieren.png

Das Suback-Paket enthält eine Liste von Ursachencodes, die verwendet werden, um das maximale QoS-Niveau oder einen Fehler anzugeben, der für jede vom Subscribe-Paket angeforderte Subskription auftritt. Jeder Ursachencode entspricht einem Themenfilter im Abonnementpaket. Die Folge des Ursachencodes im Suback-Paket muss mit der Reihenfolge der Topic-Filter im Subscribe-Paket übereinstimmen.

Zulässige Werte des Rückgabecodes:

  • 0x00 – maximale QoS 0
  • 0x01 – Erfolg – ​​maximale QoS 1
  • 0x02 – Erfolg – ​​maximale QoS 2
  • 0x80 – Fehler

Nachrichten veröffentlichen

Paket veröffentlichen bezieht sich auf eine Anwendungsnachricht, die von dem Client an den Server oder von dem Server an den Client übertragen wird. Nach Erhalt des Veröffentlichungspakets leitet der Server die Nachricht gemäß dem Themenfilter an andere Clients weiter.

Publizieren.png

Versuchen Sie es mit MQTTX um eine Nachricht mit dem Thema zu veröffentlichen testtopic/mytopic und der Inhalt{"msg":"hello world"}. Denn das Thema testtopic/# zuvor abonniert wurde, wird die vom Broker weitergeleitete Nachricht sofort empfangen.

WX201911281441422x.png

Thema

Der Themenname wird verwendet, um zu identifizieren, in welcher Sitzung die Nachricht veröffentlicht werden soll. Der Themenname des vom Server an den abonnierenden Client gesendeten Veröffentlichungspakets muss mit dem Themenfilter des Abonnements übereinstimmen.

QoS

QoS bezieht sich auf die Servicequalität für die Verteilung von Anwendungsnachrichten

QoS-WertBit 2Bit 1Beschreibung
000Höchstens einmal verteilen
101Mindestens einmal verteilen
210Nur einmal verteilen
11Zurückgehalten

Das Veröffentlichungspaket kann nicht alle QoS-Bits auf 1 setzen. Wenn der Server oder Client ein Veröffentlichungspaket empfängt, bei dem alle QoS-Bits auf 1 gesetzt sind, muss er die Netzwerkverbindung schließen.

Informationen zum Funktionsprinzip der verschiedenen QoS-Stufen finden Sie unter Einführung des MQTT 5.0-Protokolls – QoS Quality of Service.

Zuückbehalten

Wenn das RETAIN-Flag des vom Client an den Server gesendeten Publish-Pakets auf 1 gesetzt ist, muss der Server diese Anwendungsnachricht und ihre Dienstgüte (QoS) speichern, damit sie an zukünftige Teilnehmer mit den passenden Themennamen verteilt werden kann . Wenn ein neues Abonnement erstellt wird, muss für jeden übereinstimmenden Themennamen eine kürzlich aufbewahrte Nachricht an diesen Abonnenten gesendet werden. Wenn der Server eine Q-Nachricht mit einem RETAIN-Flag von 1 empfängt, muss er alle zuvor für dieses Thema zurückbehaltenen Nachrichten verwerfen und diese neue Nachricht als eine neue zurückbehaltene Nachricht für dieses Thema behandeln.

Das Veröffentlichungspaket mit einem Retain-Flag von 1 und einer Nutzlast von null Bytes wird vom Server als normale Nachricht behandelt und an den Client gesendet, der dem Thema des Abonnements entspricht. Darüber hinaus müssen alle vorhandenen aufbewahrten Nachrichten unter demselben Thema entfernt werden, sodass alle Abonnenten, die diesem Thema folgen, keine aufbewahrten Nachrichten erhalten

Wenn der Server ein Publish-Paket an den Client sendet und die Nachricht als Ergebnis einer neuen Anmeldung durch den Client gesendet wird, muss er das Retain-Flag des Pakets auf 1 setzen. Wenn ein Publish-Paket an den Client gesendet wird, weil es mit einer eingerichteten Subskription übereinstimmt, muss der Server das Retain-Flag auf 0 setzen, unabhängig vom Wert des Retain-Flags in der empfangenen Nachricht.

Wenn das Retain-Flag des vom Client an den Server gesendeten Publish-Pakets 0 ist, kann der Server die Nachricht nicht speichern und keine vorhandene aufbewahrte Nachricht entfernen oder ersetzen.

Nutzlast

Die Nutzdaten enthalten zu veröffentlichende Anwendungsnachrichten. Der Inhalt und das Format der Daten ist anwendungsspezifisch und Bilder, jeder verschlüsselte Text, verschlüsselte Daten und fast alle binären Daten können gesendet werden.

Ursprünglich erschienen bei

Similar Posts

Leave a Reply

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