Veröffentlichen von MQTT-Nachrichten und Abonnieren von Nachrichtenthemen
Message Queuing Telemetry Transport (MQTT) ist eine Publish-Subscribe-Architektur, die primär darauf ausgelegt wurde, Geräte mit Bandbreiten- und Leistungsbeschränkungen über drahtlose Netzwerke miteinander zu verbinden. Dieses einfache und ressourcensparende Protokoll kann über TCP/IP-Sockets, WebSockets und SSL (Secure Sockets Layer) ausgeführt werden.
MQTT besteht aus zwei Komponenten:
MQTT – Ein MQTT-Broker ist ein zentraler Kommunikationspunkt. Der Broker versendet alle Nachrichten zwischen Clients.
MQTT-Client – Ein MQTT-Client ist ein beliebiges Gerät (z. b. ein Computer oder ein Smartphone), das sich mit dem Broker verbindet. Ein Client, der Nachrichten sendet, ist ein Publisher. Ein Client, der Nachrichten empfängt, ist ein Subscriber. Um eine Nachricht zu empfangen, muss der Client das jeweilige Nachrichtenthema abonnieren.
Themen in MQTT
Ein Thema ist ein Identifikator (ID), der vom MQTT-Broker verwendet wird, um legitime Clients zum Versenden von Nachrichten zu identifizieren. Jeder Client, der Nachrichten versenden möchte, veröffentlicht diese mit einem bestimmten Thema, und jeder Client, der Nachrichten empfangen möchte, abonniert ein bestimmtes Thema.
Ein Thema ist ein String und kann eine oder mehrere Themenebenen umfassen. Jede Ebene ist durch einen Schrägstrich (/) getrennt, z. B. home/livingroom/temperature
.
Ein Thema:
Muss mindestens ein Zeichen umfassen.
Berücksichtigt Groß- und Kleinschreibung.
home/room/temperature
undhome/Room/temperature
sind beispielsweise zwei verschiedene Themen.
Platzhalter in MQTT-Themen
Platzhalter sind Sonderzeichen in einem Thema, die es Clients ermöglichen, mehrere Themen zu abonnieren. MQTT unterstützt Platzhalter für eine und mehrere Ebenen.
Platzhalter für eine Ebene: Ein Platzhalter auf einer Ebene wird durch ein Pluszeichen (
+
) dargestellt. Damit ein Client Nachrichten empfangen kann, müssen alle Ebenen des abonnierten Themas außer der mit einem+
-Zeichen ausgestatteten Ebene dem Thema der eingehenden Nachricht entsprechen. Sie können mehrere Platzhalter für eine Ebene in einen Thema-String aufnehmen.Platzhalter für mehrere Ebenen: Ein Platzhalter für mehrere Ebenen wird durch eine Raute (
#
) dargestellt. Der Client empfängt Nachrichten von allen Unterebenen des abonnierten Themas. Sie können nur einen Platzhalter für mehrere Ebenen verwenden, und dieser muss sich am Ende des Strings befinden.Platzhalter in Thema Vom Client abonniertes Thema Übereinstimmung Keine Übereinstimmung Platzhalter für eine Ebene home/floor1/+/temperature
home/floor1/livingroom/temperature
home/floor1/kitchen/temperature
In diesem Beispiel wird der Platzhalter
+
durchlivingroom
undkitchen
ersetzt. Alle anderen Ebenen stimmen mit dem vom Client abonnierten Thema überein. Der Client empfängt Nachrichten mit diesen Themen.home/floor1/study/brightness
home/floor1/livingroom/temperature/sensor2
In diesem Beispiel wird der Platzhalter
+
durchstudy
undlivingroom
ersetzt. Andere Ebenen stimmen nicht mit dem vom Client abonnierten Thema überein. Der Client empfängt keine Nachrichten mit diesen Themen.Platzhalter für mehrere Ebenen (alle Unterebenen) home/floor1/#
home/floor1/livingroom/humidity
home/floor1/livingroom/temperature
home/floor1/kitchen/temperature
In diesem Beispiel wird der Platzhalter
#
durchlivingroom/humidity
,livingroom/temperature
undkitchen/temperature
ersetzt. Alle anderen Ebenen stimmen mit dem vom Client abonnierten Thema überein. Der Client empfängt Nachrichten mit diesen Themen.home/floor2/livingroom/humidity
Home/floor2/kitchen/humidity
In diesem Beispiel wird der Platzhalter
#
durchlivingroom/humidity
undkitchen/humidity
ersetzt. Andere Ebenen stimmen nicht mit dem vom Client abonnierten Thema überein. Der Client empfängt keine Nachrichten mit diesen Themen.
QoS-Ebenen in MQTT
Quality of Service (QoS) definiert die Zuverlässigkeit des Nachrichten-Zustellprozesses in MQTT. MQTT bietet drei QoS-Ebenen für die Nachrichtenzustellung: QoS 0, QoS 1 und QoS 2. Sie können verschiedene QoS-Ebenen für das Veröffentlichen und Abonnieren von Nachrichten verwenden. Der verwendete MQTT-Broker unterstützt nicht unbedingt alle drei QoS-Ebenen. ThingSpeak™ MQTT unterstützt beispielsweise nur QoS 0.
QoS 0 – Höchstens einmal
QoS Ebene 0, oft als „Fire and Forget“ bezeichnet, ist ein einmaliger Zustellversuch. Die Zustellung ist nicht garantiert. Der Client bestätigt den Erhalt der Nachricht nicht. Der MQTT-Broker unternimmt keine wiederholten Zustellversuche und löscht die Nachricht lokal.
QoS 1 – Mindestens einmal
QoS Ebene 1 garantiert, dass eine Nachricht mindestens einmal zugestellt wird. Der MQTT-Broker sendet die Nachricht mindestens einmal an den Client. Der MQTT-Broker speichert die Nachricht, bis er ein PUBACK-Paket zur Bestätigung der Veröffentlichung vom Client erhalten hat. Wenn nach 10 Sekunden keine Bestätigung eingegangen ist, versendet der Broker die Nachricht erneut. Auf dieser Ebene könnte eine Nachricht mehrmals gesendet oder zugestellt werden.
QoS 2 – Genau einmal
QoS 2 ist die höchste Service-Ebene in MQTT und garantiert, dass jede Nachricht von den beabsichtigten Empfängern nur einmal empfangen wird. Die QoS-Ebene umfasst zusätzlichen Aufwand (Vier-Schritt-Handshake); hierbei handelt es sich um die langsamste Service-Ebene.
Empfängt ein Client ein QoS-2-Paket vom Broker, verarbeitet er die Nachricht und reagiert mit einem PUBREC-Paket zur Bestätigung der Veröffentlichung. Empfängt der Broker das PUBREC-Paket nicht, wird das PUBLISH-Paket erneut versendet, bis eine Bestätigung eingeht. Wurde die PUBREC-Bestätigung empfangen, verwirft der Broker das anfängliche PUBLISH-Paket. Daraufhin speichert der Broker das PUBREC-Paket und reagiert mit einem PUBREL-Paket (Veröffentlichung verworfen).
Empfängt der Client das PUBREL-Paket, kann er alle gespeicherten Zustände verwerfen und reagiert mit einem PUBCOMP-Paket (Veröffentlichung abgeschlossen). Der Broker kann nun das gespeicherte PUBREC-Paket löschen und der Paket-Identifier kann erneut verwendet werden.