MQTT Nachrichten bestehen aus einem Thema (Topic) und den Nutzdaten (Payload). Anhand des Themas kann erkannt werden, wozu die Nutzdaten dienen. Die Nutzdaten können von ganz unterschiedlichem Typ sein Zahl, String, JSON usw.
Die Topics dienen zum filtern von Nachrichten auf der Client-Seite und bestehen aus einer UTF-8-Zeichenkette. Das Topic kann aus einer oder mehreren Ebenen bestehen, die durch einen Schrägstrich getrennt sind (Topic-Level-Trennzeichen). Der Client muss das gewünschte Topic nicht initialisieren, bevor er es veröffentlicht (publish) oder abonniert (subscript). Der Broker akzeptiert jedes gültige Topic.
Beispiele :
werkstatt/bohrmaschiene/drehzahl : Dieses Topic stehllt die steht für die Drehzahl der Bohrmachine in der Werkstatt dar.
home/floor1/bedroom/light/brightness : Dieses Topic stellt die Helligkeit des Schlafzimmerlichts in der ersten Etage dar.
cmnd/tasmota/plug/status : Dieses Topic stellt ein Status-Kommando für eine Steckdose mit der Tasmota-Firmware dar.
b728fb47-3f1f-4edb-b588-036f3d2b784d/temperature : Dieses Topic stellt die Temperatur von einem Gerät mit der angegebenen UUID dar.
Jedes Topic muss mindestens ein Zeichen enthalten.
Topic-Strings dürfen zwar Leerzeichen enthalten können aber die Lesbarkeit erschweren (siehe unten).
Bei den Topics wird zwischen Groß- und Kleinschreibung unterschieden
Der Schrägstrich allein ist ein gültiges Thema und kann z.B. für Broadcast Nachrichten verwendet werden.
Wildcards bieten die Möglichkeit mehrere Topics gleichzeitig zu abonnieren und kann zum Beispiel genutz werden für :
Abonnement auf alle Nachrichten von einem bestimmten Sensor.
Abonnement auf alle Nachrichten von einem bestimmten Gerät.
Abonnement auf alle Nachrichten von einem bestimmten Thema-Pfad.
Wildcards können nur für ein Abonnement und nicht für die Veröffentlichung von Nachrichten verwendet werden. Es gibt zwei Arten von Wildcards, einstufige und mehrstufige.
Der einstufige Platzhalter wird durch das Pluszeichen (+) dargestellt und ermöglicht die Ersetzung einer einzelnen Topic-Ebene. Bei einem Topic-Abonnement mit einem einstufigen Platzhalter, wird jedes Thema, das eine beliebige Zeichenfolge anstelle des Platzhalters enthält, gefiltert.
Zum Beispiel kann ein Abonnement von :
home/floor1/+/light
die folgenden Nachrichten filtern :
home/floor1/bedroom/light
home/floor1/kichen/light
folgende aber nicht
home/groundfloor/floor/light
home/floor1/bedroom/light/brightness
home/floor1/bedroom/plug
Der Mehrstufig-Platzhalter deckt mehrere Topic-Ebenen ab. Er wird durch das Rautensymbol (#) dargestellt und muss das letztes Zeichen im Topic direkt nach einem Schrägstrich sein. Bei einem Abonnement eines Topics mit einem mehrstufigen Platzhalter, empfängt der Client alle Nachrichten, das mit dem Muster vor dem Platzhalterzeichen beginnt, unabhängig von der Länge oder Tiefe des Topics. Wenn das Topic nur mit "#" angegeben wird, empfängt der Client alle an den MQTT-Broker gesendeten Nachrichten.
Zum Beispiel kann ein Abonnement von :
home/floor1/#
die folgenden Nachrichten filtern :
home/floor1/bedroom/light
home/floor1/kichen/plug/state
folgede aber nicht :
home/groundfloor/bedroom/light
cottage/floor1/kichen/plug/state
Topics die mit einem $-Symbol beginnen sind für interne Informationen und Statistiken des MQTT-Brokers reserviert und liefern Einblicke über seinen Betrieb.
Nachrichten dessen Topics mit $ beginnen sind dem Broker vorbehalten und dürfen nicht vom Client veröffentlicht werden. Obwohl es derzeit keine offizielle Standardisierung für diese Topics gibt, ist es üblich, das Präfix $SYS/ zu verwenden, um solche Informationen zu kennzeichnen, sie können aber von Brokern zu Broker variieren. Eine empfohlene Ressource für System-Topics ist im MQTT-GitHub-Wiki verfügbar.
Ein paar Beispiele sind :
$SYS/broker/clients/connected: Zeigt die Anzahl der Clients an, die derzeit mit dem MQTT-Broker verbunden sind.
$SYS/broker/uptime: Zeigt an, wie lange der MQTT-Broker bereits läuft.
MQTT-Topics bieten eine große Flexibilität. Bei der Verwendung von Platzhaltern in realen Anwendungen gibt es einige Herausforderungen, denen Sie sich bewusst sein sollten.
Führende Schrägstriche vermeiden
MQTT erlaubt zwar einen führenden Schrägstrich in Topics (z.B. /home/first_floor/wc), führt aber eine unnötige Topic-Ebene mit einem Nullzeichen am Anfang ein. Dies kann zu Verwirrung führen ohne irgendeinen Nutzen zu bringen.
Keine Leerzeichen in einem Topic verwenden
Leerzeichen in Topics können die Lesbarkeit und die Fehlersuche behindern, insbesondere bei der Fehlersuche. Außerdem gibt es in UTF-8 verschiedene Arten von Leerzeichen.
Verwenden Sie nur ASCII-Zeichen, und vermeiden Sie nicht druckbare Zeichen.
Um eine konsistente und genaue Darstellung der Topics zu gewährleisten, ist es ratsam, sich an ASCII-Zeichen zu halten. Nicht-ASCII-UTF-8-Zeichen können falsch dargestellt werden, was die Identifizierung von Tippfehlern erschwert.
Topics so kurz und prägnant wie möglich halten
Denken Sie daran, dass jedes Topic in jeder Nachricht enthalten ist, in der es verwendet wird. Um den Netzwerkverkehr zu optimieren und Ressourcen zu schonen, sollten die Topics kurz gehalten werden. Dies ist besonders wichtig, wenn Sie mit ressourcenbeschränkten Geräten arbeiten.
Einbetten eines eindeutigen Bezeichners oder der Client Id in Topics
Um die Identifizierung von Nachrichten zu verbessern und die Autorisierung durchzusetzen, sollten Sie in Erwägung ziehen, einen eindeutigen Identifikator des Veröffentlichungs-Clients in das Topic einbeziehen. Auf diese Weise kann der Absender der Nachricht erkannt werden. Zum Beispiel kann ein Client mit der ID "tasmota_x" einen "tasmota_xx/status" veröffentlichen, aber keinen "tasmota_yy/status".
Vermeiden Sie das Abonnieren mit dem Globalen Platzhaltern „#“
Dies führt zu einer hohen Nachrichtenmenge, die gerade kleine Clients nicht verarbeiten können.
Erweiterbarkeit
Berücksichtigung von zukünftigen Erweiterungen und neuen Funktionen.