MQTT - Retained Message
Diese Anleitung erklärt kurz, was retained messages sind, wie du eine retained Nachricht gezielt löschen kannst, und was es mit der LWT (Last Will and Testament) auf sich hat.
Was ist eine retained message?
Eine retained message ist die zuletzt veröffentlichte Nachricht einer Topic, die der Broker speichert und sofort an neue Subscriber ausliefert, sobald sie das Topic abonnieren. Das ist praktisch für Statuswerte (z. B. „online“), kann aber zu unerwünschtem Verhalten führen, wenn versehentlich ein Steuerbefehl mit retain
veröffentlicht wurde.
Symptom: Du abonnierst ein Topic und ein alter Befehl wird sofort wieder angewendet – obwohl niemand gerade etwas sendet. Das ist fast immer eine retained message.
Retained message löschen
Löschen geht, indem du auf genau dieselbe Topic eine leere Payload mit gesetztem Retain-Flag veröffentlichst.
Beispiel (Mosquitto-Tools)
# -r = retained publish, -n = empty payload
mosquitto_pub -h <broker> -t 'dein/topic' -r -n
# mit Benutzer/Passwort:
mosquitto_pub -h <broker> -u <user> -P <pass> -t 'dein/topic' -r -n
# mit TLS (falls benötigt), Zertifikat prüfen:
mosquitto_pub -h <broker> -p 8883 --capath /etc/ssl/certs -t 'dein/topic' -r -n
- Wildcards (
+
,#
) funktionieren hier nicht. Es muss exakt dieselbe Topic sein. - Nach dem Löschen erhalten neue Subscriber beim ersten Abo keine alte Nachricht mehr (bis wieder retained gepublished wird).
Retained Nachrichten prüfen / sichtbar machen
Beim Abonnieren sendet der Broker retained Nachrichten sofort. So siehst du, ob noch eine da ist:
# zeigt auch retained beim Start
mosquitto_sub -v -h <broker> -t 'dein/topic'
# retained unterdrücken (nur Live-Nachrichten)
mosquitto_sub -v -h <broker> -t 'dein/topic' -R
Vermeiden, dass es wieder passiert
- Beim Senden kein Retain-Flag setzen (bei
mosquitto_pub
also ohne-r
). - In deinem MQTT-Client die Option „retain“ bzw. „Retained Message“ deaktivieren, sofern nicht bewusst benötigt.
- Für Statuswerte (z. B. Sensorzustände) ist retain okay; für Steuerbefehle (z. B. „schalte an“) meist nicht.
Unterscheidung: Retained vs. LWT (Last Will and Testament)
Die LWT ist eine Nachricht, die der Broker automatisch sendet, wenn ein Client unerwartet die Verbindung verliert. Sie kann optional ebenfalls retained sein.
- Löschen einer bereits veröffentlichten LWT (falls retained): Genau wie oben – leere retained Payload auf die LWT-Topic publishen.
- Verhindern künftiger LWT-Nachrichten: Im Client die LWT-Konfiguration anpassen oder Verbindungen sauber schließen; außerdem LWT ohne
retain
konfigurieren, wenn sie nicht persistieren soll.
Häufige Fehler
- Falsche Topic: Die Löschung wirkt nur auf exakt dieselbe Topic.
- Ohne Retain gelöscht: Eine leere nicht-retained Nachricht löscht nichts.
- Mehrere Quellen: Ein anderes System veröffentlicht die Nachricht erneut retained. Ursache identifizieren und dort das Retain-Flag entfernen.
Kurze Checkliste
mosquitto_sub
starten und prüfen, ob beim Abo sofort eine Nachricht kommt.- Mit
mosquitto_pub -r -n
auf die exakte Topic leere Payload senden. - Nochmals abonnieren und verifizieren, dass nichts retained kommt.
- In Sender-Clients Retain-Flag für Steuer-Themen deaktivieren.
Beispiele mit Platzhaltern
# Platzhalter ersetzen:
# <broker> = Hostname/IP des Brokers
# <user> / <pass> = Zugangsdaten (falls gesetzt)
# 'dein/topic' = exakte Topic der alten retained Nachricht
mosquitto_pub -h mqtt.example.lan -u haus -P geheim -t 'haus/wohnzimmer/licht/set' -r -n
mosquitto_sub -v -h mqtt.example.lan -t 'haus/wohnzimmer/licht/set'
Sicherheit: Nutze nach Möglichkeit TLS am Broker (Port 8883) und Accounts mit eng zugeschnittenen Berechtigungen (ACLs), damit nicht versehentlich auf falsche Topics geschrieben wird.
No Comments