Linux - MQTT

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

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


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.


Häufige Fehler


Kurze Checkliste

  1. mosquitto_sub starten und prüfen, ob beim Abo sofort eine Nachricht kommt.
  2. Mit mosquitto_pub -r -n auf die exakte Topic leere Payload senden.
  3. Nochmals abonnieren und verifizieren, dass nichts retained kommt.
  4. 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.