Wie Publish und Subscribe Nachrichten verteilt
Publish und Subscribe heißt: Ein Gerät veröffentlicht eine Nachricht unter einem Thema, und andere Geräte abonnieren dieses Thema. Der Broker verbindet beide, sie kennen sich nicht.
So kann eine Heizung die Temperatur lesen, die ein Sensor sendet, ohne dass einer vom anderen weiß. Themenfilter legen fest, welche Nachrichten ein Abonnement erreichen.
Am Ende dieser Lektion
Notiz
Ich kann erklären, wie Publish und Subscribe arbeiten, und Themenfilter mit + und # anwenden.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Publish | eine Nachricht unter einem Thema veröffentlichen | |
| Subscribe | ein Thema oder einen Filter abonnieren | |
| Themenfilter | ein Muster, das mehrere Themen erfasst | home/+/temperature |
| Plus-Zeichen | steht für genau eine Ebene | + |
| Rautezeichen | steht für alle Ebenen darunter, nur am Ende | # |
| Retained | der Broker behält die letzte Nachricht eines Themas |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Sendende und Lesende kennen sich nicht
Ein Gerät veröffentlicht (Publish) eine Nachricht an den Broker. Ein anderes Gerät abonniert (Subscribe) ein Thema beim Broker.
Kommt eine Nachricht an, gibt der Broker sie an alle weiter, die dieses Thema abonniert haben. Das kann ein Gerät sein, zehn oder keines. Der Sensor muss das nicht wissen.
Einen Broker im Kleinen nachbauen
# Ein Broker im Kleinen: wer abonniert, bekommt die Nachricht
abos = {"licht": "home/door/state", "heizung": "home/kitchen/temperature"}
nachricht = "home/door/state"
for name in abos:
if abos[name] == nachricht:
print(name, "erhält die Nachricht", nachricht)
print("Der Sender kennt keinen von beiden.")
# Fügen Sie ein drittes Abonnement mit demselben Thema hinzu.
Ein Filter kann mehrere Themen erfassen
Ein Abonnement nennt ein Thema oder einen Themenfilter. Das Zeichen + steht für genau eine Ebene. Das Zeichen # steht für alle Ebenen darunter und darf nur am Ende stehen.
Der Filter home/+/temperature passt auf die Temperatur in jedem Raum. Der Filter home/# passt auf alles unter home, auch auf home selbst.
Beispiel: welcher Filter auf welches Thema passt
| Filter | Thema | Passt? |
|---|---|---|
| home/+/temperature | home/kitchen/temperature | ja |
| home/+/temperature | home/door/state | nein |
| home/# | home/door/state | ja |
| home/+ | home/door/state | nein, das Thema hat drei Ebenen |
| home/# | home | ja, # passt auch auf null Ebenen |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Einen Filter Ebene für Ebene prüfen
# Ein Filter und ein Thema, Ebene für Ebene
muster = "home/+/temperature"
thema = "home/kitchen/temperature"
m = muster.split("/")
t = thema.split("/")
print("Ebenen im Filter:", len(m))
print("Ebenen im Thema:", len(t))
for i in range(len(m)):
if m[i] == "+":
print("Ebene", i, ": Platzhalter, passt auf", t[i])
elif m[i] == t[i]:
print("Ebene", i, ": gleich")
else:
print("Ebene", i, ": verschieden")
Der Filter mit Plus erfasst alle Temperaturen
Der nächste Befehl abonniert den Filter home/+/temperature und hört nach drei Nachrichten auf. Er erfasst die Küche und das Wohnzimmer, aber nicht die Luftfeuchte und nicht die Tür.
Die Antwort hat drei Zeilen. Jede beginnt mit home/kitchen/temperature oder home/livingroom/temperature, dahinter steht eine ganze Zahl. Die Zahlen hängen vom Zeitpunkt ab.
Alle Temperaturen mit einem Filter abonnieren
docker exec broker mosquitto_sub -t 'home/+/temperature' -v -C 3 -W 10Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine gespeicherte Nachricht wartet auf Späte
Normalerweise erhält ein Abonnement nur Nachrichten, die nach dem Abonnieren veröffentlicht werden. Eine Nachricht, die als retained (gespeichert) gesendet wurde, behält der Broker.
Wer später abonniert, bekommt sie sofort. Die Tür im Lab meldet so ihren Zustand. Die Antwort ist eine Zeile: home/door/state und dahinter open oder closed.
Den letzten Zustand der Tür sofort lesen
docker exec broker mosquitto_sub -t home/door/state -v -C 1 -W 5Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
So veröffentlicht man selbst eine Nachricht
Zum Veröffentlichen gibt es das Werkzeug mosquitto_pub. Ein Beispiel, hier nur gezeigt und nicht gestartet, sieht so aus:
docker exec broker mosquitto_pub -t home/notes/beispiel -r -m hallo
Die Option -t nennt das Thema, -m die Nutzlast und -r macht die Nachricht retained. Eigene Nachrichten senden Sie in der Abgabe des Labs.
Ein häufiger Fehler
Warnung
Viele denken, + passe auf beliebig viele Ebenen. Das Zeichen + steht aber für genau eine Ebene. Für mehrere Ebenen brauchen Sie # am Ende. Zählen Sie darum zuerst die Ebenen von Filter und Thema.