Verstehen von MQTT-Themen und Platzhaltern nach Fall

Was ist ein Thema in MQTT?

Ein MQTT-Topic ist eine UTF-8-codierte Zeichenfolge, die die Grundlage für das Nachrichtenrouting im MQTT-Protokoll bildet. Ein Thema wird normalerweise geebnet und mit einem Schrägstrich getrennt / zwischen den Ebenen. Dies ist ähnlich wie bei URL-Pfad, zum Beispiel:

chat/room/1
sensor/10/temperature
sensor/+/temperature
sensor/#

Im Gegensatz zu Topics in anderen Messaging-Systemen, z. B. Kafka und Pulsar, müssen MQTT-Topics nicht im Voraus erstellt werden. Der Kunde erstellt das Thema beim Abonnieren oder Veröffentlichen und muss das Thema nicht löschen.

Obwohl erlaubt, wird es normalerweise nicht empfohlen, Themen zu verwenden, die mit beginnen oder enden /wie zum Beispiel /chat oder chat/.

Das Folgende ist ein einfacher MQTT-Publish-and-Subscribe-Flow. Wenn APP 1 die abonniert sensor/2/temperature Thema, erhält es Nachrichten von Sensor 2, die zu diesem Thema veröffentlichen.

MQTT Veröffentlichen Abonnieren

MQTT-Wildcards

Einstufige Wildcard

+ (U+002B) ist ein Platzhalterzeichen, das nur einer Themenebene entspricht. Bei Verwendung eines einstufigen Platzhalters muss der einstufige Platzhalter eine ganze Ebene einnehmen, zum Beispiel:

"+" is valid
"sensor/+" is valid
"sensor/+/temperature" is valid
"sensor+" is invalid (does not occupy an entire level)

Wenn der Client das Thema abonniert sensor/+/temperatureerhält es Nachrichten von den folgenden Themen:

sensor/1/temperature
sensor/2/temperature
...
sensor/n/temperature

Aber es passt nicht zu den folgenden Themen:

sensor/temperature
sensor/bedroom/1/temperature

Mehrstufige Wildcard

# (U+0023) ist ein Platzhalterzeichen, das einer beliebigen Anzahl von Ebenen innerhalb eines Themas entspricht. Wenn Sie einen mehrstufigen Platzhalter verwenden, muss er eine ganze Ebene einnehmen und das letzte Zeichen des Themas sein, zum Beispiel:

"#" is valid, matches all topics
"sensor/#" is valid
"sensor/bedroom#" is invalid (+ or # are only used as a wildcard level)
"sensor/#/temperature" is invalid (# must be the last level)

Themen beginnend mit $

Systemthemen

Die Themen beginnen mit $SYS/ sind Systemthemen, die hauptsächlich verwendet werden, um Metadaten über den Betriebsstatus des MQTT-Brokers, Statistiken, Client-Online-/Offline-Ereignisse usw. zu erhalten. $SYS/ Das Thema ist in der MQTT-Spezifikation nicht definiert, aber die meisten MQTT-Broker folgen diesem Empfehlung.

Beispielsweise unterstützt der EMQX das Abrufen des Clusterstatus durch die folgenden Themen.

ThemaBeschreibung
$SYS/brokersEMQX-Cluster-Knotenliste
$SYS/brokers/${node}/versionEMQX-Broker-Version
$SYS/brokers/${node}/uptimeStartzeit des EMQX-Brokers
$SYS/brokers/${node}/datetimeEMQX-Broker-Zeit
$SYS/brokers/${node}/sysdescrBeschreibung des EMQX-Brokers

EMQX unterstützt auch umfangreiche Systemthemen wie Client-Online-/Offline-Ereignisse, Statistiken, Systemüberwachung und Alarme. Weitere Einzelheiten finden Sie unter EMQX-Systemthemen Dokumentation.

Geteilte Abonnements sind eine Funktion von MQTT 5.0, einer Abonnementmethode, die einen Lastenausgleich zwischen mehreren Abonnenten erreicht. Das Thema eines geteilten Abonnements beginnt mit $share.

Obwohl das MQTT-Protokoll in 5.0 gemeinsam genutzte Abonnements hinzugefügt hat, unterstützt EMQX seit MQTT 3.1.1 gemeinsam genutzte Abonnements.

Im folgenden Diagramm abonnieren drei Abonnenten dasselbe Thema $share/g/topic Verwenden einer gemeinsamen Abonnementmethode, bei der die topic ist der eigentliche Themenname, den sie abonnieren, und die Herausgeber veröffentlichen Nachrichten an die topicaber NICHT zu $share/g/topic.

Geteilte MQTT-Abonnements

Darüber hinaus unterstützt EMQX auch die Verwendung des gemeinsamen Abonnementpräfixes $queue in MQTT 3.1.1. Es ist ein Sonderfall eines gemeinsamen Abonnements, was gleichbedeutend damit ist, alle Abonnenten in einer Gruppe zu haben.

Weitere Einzelheiten zu gemeinsamen Abonnements finden Sie unter Gemeinsam genutzte EMQX-Abonnements Dokumentation.

Themen in verschiedenen Szenarien

Intelligentes Zuhause

Beispielsweise überwachen wir mit Sensoren Temperatur, Luftfeuchtigkeit und Luftqualität in Schlafzimmern, Wohnzimmern und Küchen. Folgende Themen können wir gestalten:

  • myhome/bedroom/temperature
  • myhome/bedroom/humidity
  • myhome/bedroom/airquality
  • myhome/livingroom/temperature
  • myhome/livingroom/humidity
  • myhome/livingroom/airquality
  • myhome/kitchen/temperature
  • myhome/kitchen/humidity
  • myhome/kitchen/airquality

Als nächstes können Sie die abonnieren myhome/bedroom/+ Thema, um Temperatur-, Feuchtigkeits- und Luftqualitätsdaten für das Schlafzimmer zu erhalten, die myhome/+/temperature Thema, um Temperaturdaten für alle drei Räume zu erhalten, und die myhome/# Thema, um alle Daten zu erhalten.

Stapel aufladen

  • ocpp/cp/cp001/notify/bootNotification

Veröffentlichen Sie eine Online-Anfrage zu diesem Thema, wenn der Ladestapel online ist.

  • ocpp/cp/cp001/notify/startTransaction

Veröffentlichen Sie eine Ladeanfrage zu diesem Thema.

  • ocpp/cp/cp001/reply/bootNotification

Bevor der Ladestapel online geht, muss er dieses Thema abonnieren, um die Online-Antwort zu erhalten.

  • ocpp/cp/cp001/reply/startTransaction

Bevor der Ladestapel die Ladeanfrage initiiert, muss er dieses Topic abonnieren, um die Antwort auf die Ladeanfrage zu erhalten.

Sofortnachrichten

  • chat/user/${user_id}/inbox

Eins-zu-eins-Chat : Benutzer abonnieren dieses Thema, nachdem sie online sind, und erhalten Nachrichten von ihren Freunden. Wenn Sie einem Freund antworten, ersetzen Sie einfach die user_id des Themas durch die ID des Freundes.

  • chat/group/${group_id}/inbox

Gruppenchat : Nachdem der Benutzer erfolgreich einer Gruppe beigetreten ist, kann er das Thema abonnieren, um die Nachrichten der Gruppe zu erhalten.

Einen Freund hinzufügen : Veröffentlichen Sie eine Freundschaftsanfrage zu diesem Thema (user_id ist die ID des Freundes).

Freundschaftsanfragen erhalten : Abonnieren Sie dieses Thema (user_id ist die ID des Abonnenten), um Freundschaftsanfragen von anderen Benutzern zu erhalten.

Antworten auf Freundschaftsanfragen erhalten : Vor dem Hinzufügen von Freunden muss der Benutzer dieses Thema abonnieren (user_id ist die ID des Abonnenten), um die Anfrageergebnisse zu erhalten.

Auf Freundschaftsanfrage antworten : Senden Sie eine Nachricht an dieses Thema (user_id ist die ID des Freundes), ob die Freundschaftsanfrage genehmigt werden soll oder nicht.

Benutzerstatus : Abonnieren Sie dieses Thema, um den Online-Status Ihrer Freunde zu erfahren.

Häufig gestellte Fragen zu MQTT-Themen

Was ist das maximale Level und die maximale Länge eines MQTT-Themas?

Das MQTT-Thema ist UTF-8-codierte Zeichenfolgen, und es DARF NICHT größer als 65535 Bytes sein. In der Praxis bedeutet die Verwendung kürzerer Themennamen und weniger Ebenen jedoch einen geringeren Ressourcenverbrauch.

Versuchen Sie, nicht mehr Themenebenen zu verwenden, „nur weil ich es kann“. Zum Beispiel, my-home/room1/data ist eine bessere Wahl als my/home/room1/data.

Ist die Anzahl der Themen begrenzt?

Unterschiedliche Nachrichtenserver haben unterschiedliche Beschränkungen für die Anzahl der Themen. Derzeit ist die Anzahl der Themen in der Standardkonfiguration von EMQX unbegrenzt, aber je mehr Themen vorhanden sind, desto mehr Serverspeicher wird verwendet.

Angesichts der großen Anzahl an Geräten, die mit dem MQTT-Broker verbunden sind, empfehlen wir, dass ein Client nicht mehr als zehn Themen abonniert.

Beim Weiterleiten von Nachrichten an Platzhalterabonnements benötigt der Broker möglicherweise mehr Ressourcen als Themen ohne Platzhalter. Es ist eine kluge Wahl, wenn das Wildcard-Abonnement vermieden werden kann.

Dies hängt stark davon ab, wie das Datenschema für die Nutzlast der MQTT-Nachricht modelliert ist.

Zum Beispiel, wenn ein Publisher auf veröffentlicht device-id/stream1/foo und device-id/stream1/bar und der Abonnent muss beide abonnieren, dann kann er abonnieren device-id/stream1/#. Eine bessere Alternative besteht vielleicht darin, den foo- und bar-Teil des Namensraums in die Nutzlast zu verschieben, sodass er nur in einem Thema veröffentlicht wird device-id/stream1und der Abonnent abonniert nur dieses eine Thema.

Kann ich dasselbe Thema mit einem gemeinsamen Abonnement und einem normalen Abonnement abonnieren?

Ja, aber es wird nicht empfohlen.

Gemäß der MQTT-Spezifikation führen mehrere Abonnements zu mehreren (duplizierten) Nachrichtenübermittlungen.

Was sind die Best Practices für MQTT-Themen?

  • Verwende nicht # um alle Themen zu abonnieren.
  • Das Thema sollte nicht mit beginnen oder enden /wie zum Beispiel /chat oder chat/.
  • Verwenden Sie im Thema keine Leerzeichen und Nicht-ASCII-Zeichen.
  • Verwenden _ oder - um Wörter (oder Camel Case) innerhalb einer Themenebene zu verbinden.
  • Versuchen Sie, weniger Themenebenen zu verwenden.
  • Versuchen Sie, das Schema der Nachrichtendaten zu bevorzugen, um die Verwendung von Platzhalterthemen zu vermeiden.
  • Wenn Platzhalter verwendet werden, versuchen Sie, die eindeutigere Themenebene näher an den Stamm zu verschieben. z.B device/00000001/command/# ist eine bessere Wahl als device/command/00000001/#.

Ursprünglich erschienen bei

Similar Posts

Leave a Reply

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