Main Content

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.

MQTT architecture

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 und home/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 ThemaVom Client abonniertes ThemaÜbereinstimmungKeine Übereinstimmung
    Platzhalter für eine Ebenehome/floor1/+/temperature
    • home/floor1/livingroom/temperature

    • home/floor1/kitchen/temperature

    In diesem Beispiel wird der Platzhalter + durch livingroom und kitchen 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 + durch study und livingroom 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 # durch livingroom/humidity, livingroom/temperature und kitchen/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 # durch livingroom/humidity und kitchen/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.

MQTT QoS Level 0

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.

MQTT QoS Level 1

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.

MQTT QoS Level 2