Wie ein Sensor seine Messwerte meldet
Eine MQTT-Nachricht (MQTT steht für Message Queuing Telemetry Transport) besteht aus einem Thema und einer Nutzlast. Das Thema sagt, woher ein Messwert kommt, die Nutzlast ist der Messwert selbst.
So melden Temperaturfühler, Türkontakte und Zähler in einem Haus ihre Werte. Wer das Format lesen kann, kann jeden Sensor auswerten, der so sendet.
Am Ende dieser Lektion
Notiz
Ich kann aus einer MQTT-Nachricht das Thema und den Messwert lesen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Sensor | ein Gerät, das etwas misst und den Wert sendet | |
| Nachricht | ein Thema mit einer Nutzlast | |
| Thema | der Name, unter dem eine Nachricht läuft (Topic) | home/door/state |
| Nutzlast | der Inhalt der Nachricht, immer ein Text (Payload) | 21 |
| Broker | der Server, der Nachrichten annimmt und weitergibt |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Eine Nachricht hat ein Thema und eine Nutzlast
Ein Sensor schickt seine Nachricht an den Broker. Der Broker ist ein Server, der Nachrichten annimmt und weitergibt. Der Sensor weiß nicht, wer sie liest.
Jede Nachricht hat ein Thema und eine Nutzlast. Das Thema ist wie die Adresse, die Nutzlast ist der Inhalt, zum Beispiel eine Zahl oder das Wort open.
Beispiel: die vier Themen im Lab
| Thema | Was es meldet | Form der Nutzlast |
|---|---|---|
| home/livingroom/temperature | Temperatur im Wohnzimmer | ganze Zahl |
| home/livingroom/humidity | Luftfeuchte im Wohnzimmer | ganze Zahl |
| home/kitchen/temperature | Temperatur in der Küche | ganze Zahl |
| home/door/state | Zustand der Tür | open oder closed |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Das Lab hat einen Broker und vier Sensoren
Das Lab startet zwei Container: einen Broker und einen Container, der die Sensoren spielt. Es gibt kein Browserfenster, Sie nutzen das Terminal.
Der Befehl hört alle Themen unter home ab. Die Option -v zeigt das Thema vor jedem Wert, -C 8 hört nach 8 Nachrichten auf und -W 10 nach 10 Sekunden. Die Zahlen hängen vom Moment ab, in dem Sie starten.
Acht Nachrichten aller Sensoren lesen
docker exec broker mosquitto_sub -t 'home/#' -v -C 8 -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.
Ein Thema besteht aus Ebenen wie ein Pfad
Ein Thema ist in Ebenen geschrieben, die ein Schrägstrich trennt, wie ein Pfad. Das Thema home/kitchen/temperature hat drei Ebenen: den Ort, den Raum und die Größe.
So können Sie ein Thema zerlegen. In Python trennt split("/") die Ebenen, und die Nutzlast steht hinter dem ersten Leerzeichen der Zeile.
Beispiel: eine Zeile zerlegen
| Teil | Wert | Wie man ihn findet |
|---|---|---|
| Ganze Zeile | home/kitchen/temperature 19 | Ausgabe von mosquitto_sub -v |
| Thema | home/kitchen/temperature | alles vor dem ersten Leerzeichen |
| Nutzlast | 19 | alles danach |
| Raum | kitchen | zweite Ebene des Themas |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Thema und Nutzlast aus einer Zeile holen
# Eine Zeile, wie mosquitto_sub sie mit -v ausgibt: Thema, Leerzeichen, Nutzlast
zeile = "home/kitchen/temperature 19"
position = zeile.find(" ")
thema = zeile[:position]
nutzlast = zeile[position + 1:]
teile = thema.split("/")
print("Thema:", thema)
print("Nutzlast:", nutzlast)
print("Raum:", teile[1])
print("Größe:", teile[2])
zahl = int(nutzlast)
print("Zahl plus 1:", zahl + 1)
print("Text plus 1:", nutzlast + "1")
# Ändern Sie die Zeile in "home/door/state open". Was ergibt int(nutzlast)?
Ein häufiger Fehler
Warnung
Viele denken, die Nutzlast sei schon eine Zahl. Sie kommt aber als Text an: "19" plus "1" ergibt "191". Wandeln Sie sie mit int() um, bevor Sie rechnen, und prüfen Sie vorher, ob es eine Zahl ist. Die Tür meldet ein Wort.
Ein einzelnes Thema liefert nur diese Werte
Wer nur einen Wert braucht, nennt das Thema genau. Der nächste Befehl hört nur die Temperatur im Wohnzimmer ab und hört nach drei Nachrichten auf.
Die Antwort hat drei Zeilen. Jede beginnt mit home/livingroom/temperature, dahinter steht eine ganze Zahl. Welche Zahlen es sind, hängt vom Zeitpunkt ab.
Drei Temperaturen aus dem Wohnzimmer lesen
docker exec broker mosquitto_sub -t home/livingroom/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.
Mehrere Messwerte eines Themas mitteln
# Mehrere Messwerte desselben Themas mitteln
zeilen = [
"home/livingroom/temperature 20",
"home/livingroom/humidity 41",
"home/livingroom/temperature 22",
"home/livingroom/temperature 21",
]
summe = 0
anzahl = 0
for zeile in zeilen:
position = zeile.find(" ")
if zeile[:position] == "home/livingroom/temperature":
summe = summe + int(zeile[position + 1:])
anzahl = anzahl + 1
print("Messwerte:", anzahl)
print("Mittelwert:", summe / anzahl)