Diese mosquitto_pub- und mosquitto_sub-Beispiele sind die Befehle, zu denen Sie beim Testen von Geräten, beim Debuggen von Topics und beim Skripten von MQTT tatsächlich greifen. Jeder ist kopierfertig und läuft gegen den kostenlosen öffentlichen MQTT-Broker broker.connectmq.com, sodass Sie das Verhalten in Sekunden selbst überprüfen können. Am Ende wissen Sie, wie Sie QoS, Retained Messages, Last Will, TLS und MQTT-5-Properties über die Kommandozeile ausprobieren.
Bevor Sie beginnen
Installieren Sie die Mosquitto-Clients:
# Debian / Ubuntu / Raspberry Pi OS
sudo apt install mosquitto-clients
# macOS
brew install mosquitto
# Windows: Mosquitto von mosquitto.org installieren; der Installer enthält mosquitto_pub.exe und mosquitto_sub.exe
Prüfen Sie mit mosquitto_pub --help; die erste Zeile zeigt die Version. Einige der folgenden Beispiele benötigen Version 2.x (für -x, die Ausgabe %j und einige MQTT-5-Optionen). Die vollständige Optionsreferenz steht im offiziellen mosquitto_pub-Handbuch.
Drei Regeln für den öffentlichen MQTT-Broker:
- Übergeben Sie mit
-iimmer eine eindeutige, nicht leere Client ID. Zwei Clients mit derselben ID trennen sich gegenseitig. - Verwenden Sie ein eindeutiges Topic-Präfix. Die Beispiele nutzen
connectmq/demo/x7q2/; ersetzen Siex7q2durch eine eigene Zufallszeichenfolge. - Der öffentliche MQTT-Broker ist für alle lesbar und nur für Tests und Prototypen gedacht. Veröffentlichen Sie niemals Zugangsdaten, personenbezogene Daten oder Produktionsdaten.
Damit die Befehle kurz bleiben, setzen Sie zwei Shell-Variablen (bash/zsh):
H="-h broker.connectmq.com -p 1883"
T="connectmq/demo/x7q2"
Öffnen Sie zwei Terminals: eines für mosquitto_sub, eines für mosquitto_pub.
Grundlegende mosquitto_pub- und mosquitto_sub-Beispiele
1. Ein Topic abonnieren
mosquitto_sub $H -i sub-x7q2 -t "$T/hello"
2. Eine Nachricht veröffentlichen
mosquitto_pub $H -i pub-x7q2 -t "$T/hello" -m "hello from the CLI"
3. Alles unter Ihrem Präfix abonnieren und Topics ausgeben (-v gibt das Topic vor dem Payload aus)
mosquitto_sub $H -i sub-x7q2 -t "$T/#" -v
4. Einstufige Wildcard: alle Temperatur-Topics, beliebiger Raum
mosquitto_sub $H -i sub-x7q2 -t "$T/+/temperature" -v
5. Mehrere Topic-Filter in einem Client
mosquitto_sub $H -i sub-x7q2 -t "$T/+/temperature" -t "$T/+/humidity" -v
6. JSON veröffentlichen (einfache Anführungszeichen verhindern, dass die Shell geschweifte Klammern und Anführungszeichen interpretiert)
mosquitto_pub $H -i pub-x7q2 -t "$T/kitchen/temperature" -m '{"value": 21.8, "unit": "C"}'
Unter Windows cmd.exe maskieren Sie stattdessen die inneren Anführungszeichen: -m "{\"value\": 21.8}".
QoS und Sessions
7. Mit QoS 1 veröffentlichen und abonnieren
mosquitto_sub $H -i sub-x7q2 -t "$T/alarms" -q 1 -v
mosquitto_pub $H -i pub-x7q2 -t "$T/alarms" -q 1 -m "door open"
Die effektive QoS ist die niedrigere aus Publish-QoS und Subscription-QoS. Das Gesamtbild liefert MQTT-QoS-Stufen erklärt.
8. Den Protokollaustausch mit -d beobachten (Debug zeigt CONNECT, PUBLISH, PUBACK und Co.)
mosquitto_pub $H -i pub-x7q2 -t "$T/alarms" -q 2 -m "test" -d
Bei QoS 2 sehen Sie PUBLISH, PUBREC, PUBREL und PUBCOMP. Das ist der schnellste Weg nachzuweisen, was ein Broker tatsächlich tut.
9. Persistente Session: Nachrichten empfangen, die veröffentlicht wurden, während Sie offline waren
# Einmal mit fester ID und deaktivierter Clean Session abonnieren, dann Strg+C
mosquitto_sub $H -i sub-persist-x7q2 -c -q 1 -t "$T/queue" -v
# Während er gestoppt ist, mit QoS 1 veröffentlichen
mosquitto_pub $H -i pub-x7q2 -q 1 -t "$T/queue" -m "queued while offline"
# Mit derselben ID und -c neu verbinden: Die Nachricht wird zugestellt
mosquitto_sub $H -i sub-persist-x7q2 -c -q 1 -t "$T/queue" -v
10. MQTT 5 Session Expiry (Session nach dem Trennen 300 Sekunden lang behalten)
mosquitto_sub $H -V 5 -i sub-persist-x7q2 -c -x 300 -q 1 -t "$T/queue" -v
Der öffentliche MQTT-Broker behält Sessions höchstens 30 Minuten.
Retained Messages
11. Einen Retained-Zustand veröffentlichen
mosquitto_pub $H -i pub-x7q2 -t "$T/pump1/state" -r -m "running"
Jeder neue Subscriber erhält running sofort, ohne auf das nächste Publish zu warten.
12. Nur Retained Messages anzeigen und dann beenden
mosquitto_sub $H -i sub-x7q2 -t "$T/#" -v --retained-only -W 3
-W 3 beendet nach 3 Sekunden – praktisch für Skripte, die einen Schnappschuss des aktuellen Zustands erstellen.
13. Alte Retained Messages ignorieren (-R überspringt Nachrichten, die beim Eintreffen das Retain-Flag tragen)
mosquitto_sub $H -i sub-x7q2 -t "$T/#" -v -R
14. Eine Retained Message löschen (einen leeren Retained-Payload veröffentlichen)
mosquitto_pub $H -i pub-x7q2 -t "$T/pump1/state" -r -n
15. Alle Retained Messages unter Ihrem Präfix löschen
mosquitto_sub $H -i cleaner-x7q2 -t "$T/#" --remove-retained --retained-only -W 3
Gehen Sie damit auf jedem Broker vorsichtig um; der Befehl entfernt den Retained-Zustand für alles, worauf der Filter passt.
Last Will and Testament
16. Einen Last Will registrieren, der den Client als offline markiert
mosquitto_sub $H -i device-x7q2 -t "$T/device1/cmd" \
--will-topic "$T/device1/status" --will-payload "offline" --will-retain --will-qos 1
Beobachten Sie in einem anderen Terminal den Status mit mosquitto_sub $H -i watch-x7q2 -t "$T/device1/status" -v und beenden Sie dann den ersten Prozess abrupt (Terminal schließen oder kill -9). Nach Ablauf des Keep-alive veröffentlicht der Broker offline. Ein sauberes Strg+C sendet DISCONNECT und löst den Will nicht aus. Setzen Sie mit -k 10 ein kurzes Keep-alive, um es schneller zu sehen.
Skripting und Ausgabesteuerung
17. Genau N Nachrichten empfangen und dann beenden
mosquitto_sub $H -i sub-x7q2 -t "$T/kitchen/temperature" -C 1
Ideal in Shell-Skripten: TEMP=$(mosquitto_sub ... -C 1).
18. Eigenes Ausgabeformat mit Zeitstempeln
mosquitto_sub $H -i sub-x7q2 -t "$T/#" -F "@Y-@m-@dT@H:@M:@S %t %p"
19. JSON-Ausgabe zum Weiterleiten an jq
mosquitto_sub $H -i sub-x7q2 -t "$T/#" -F "%j" | jq -c '{topic, payload}'
20. Jede Zeile einer Datei oder von stdin als eigene Nachricht veröffentlichen
printf '20.1\n20.4\n20.9\n' | mosquitto_pub $H -i pub-x7q2 -t "$T/kitchen/temperature" -l
Mit -f firmware.bin senden Sie eine ganze Datei als eine Nachricht, mit -s den gesamten stdin als eine Nachricht. Der öffentliche MQTT-Broker begrenzt Nachrichten auf 64 KB.
21. Ein winziger Sensorsimulator (beachten Sie das öffentliche Limit von 10 Nachrichten pro Sekunde und Client)
while true; do
mosquitto_pub $H -i sim-x7q2 -t "$T/lab/temperature" \
-m "{\"value\": $((RANDOM % 10 + 20)), \"ts\": $(date +%s)}"
sleep 1
done
TLS und Authentifizierung
22. Verschlüsselte Verbindung auf Port 8883
# Linux: das CA-Bundle des Systems verwenden
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
-i tls-x7q2 -t "$T/#" -v
Unter macOS oder Windows zeigen Sie mit --cafile auf eine PEM-Datei mit dem Zertifikat ISRG Root X1 (Let's Encrypt), da diese Systeme kein PEM-Verzeichnis bereitstellen. Erscheint Error: A TLS error occurred, prüfen Sie den Pfad zur CA-Datei und Ihre Systemzeit.
23. Privater Broker mit Zugangsdaten
mosquitto_pub -h YOUR_BROKER_HOST -p 8883 --capath /etc/ssl/certs \
-i YOUR_CLIENT_ID -u YOUR_USERNAME -P YOUR_PASSWORD \
-t "factory1/line1/cnc1/telemetry" -q 1 -m '{"spindle_rpm": 8000}'
Das Topic folgt hier einer einfachen Werkshierarchie. In Industrie-4.0-Projekten wird daraus meist ein Unified Namespace (UNS) nach den ISA-95-Ebenen Enterprise → Site → Area → Line → Cell, etwa acme/werk-muenchen/fertigung/linie-1/cnc-1/telemetrie, den Sie mit denselben Befehlen testen.
Vermeiden Sie in geteilten Umgebungen Passwörter in der Shell-Historie. Mosquitto 2.x liest Optionen aus einer Konfigurationsdatei: Legen Sie die Zeilen für -u und -P in ~/.config/mosquitto_pub (und mosquitto_sub) mit restriktiven Berechtigungen ab.
MQTT-5-Properties
24. Content Type, User Property und Message Expiry
mosquitto_pub $H -V 5 -i pub-x7q2 -t "$T/kitchen/temperature" -m '{"value": 22}' \
-D PUBLISH content-type application/json \
-D PUBLISH user-property source cli-test \
-D PUBLISH message-expiry-interval 60
Auf Subscriber-Seite zeigen Sie die Properties mit -V 5 -F "%t %p | %P" an (%P gibt User Properties aus). Der Leitfaden zu den MQTT-5-Funktionen erklärt, wann welche Property nützlich ist.
25. Request/Response mit mosquitto_rr
# Responder: das Response-Topic (%R) jeder Anfrage lesen und darauf antworten
while true; do
RT=$(mosquitto_sub $H -V 5 -i resp-x7q2 -t "$T/rpc/time" -C 1 -F "%R")
mosquitto_pub $H -V 5 -i resp-pub-x7q2 -t "$RT" -m "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
done &
# Requester: setzt das Response-Topic, wartet auf eine Antwort und gibt sie aus
mosquitto_rr $H -V 5 -i req-x7q2 -t "$T/rpc/time" -e "$T/rpc/time/reply" -m "now?" -W 5
mosquitto_rr setzt das MQTT-5-Response-Topic in der Anfrage, abonniert es und gibt die erste Antwort aus. Der Shell-Responder genügt für eine Demo; ein echter Service in Python oder Node würde zusätzlich die Correlation Data zurückgeben, damit sich parallele Anfragen zuordnen lassen.
Kurzreferenz der Optionen
| Option | Tool | Bedeutung |
|---|---|---|
-h, -p |
beide | Host und Port (1883 TCP, 8883 TLS) |
-i |
beide | Client ID (immer setzen) |
-t, -m |
beide / pub | Topic, Nachricht |
-q |
beide | QoS 0, 1 oder 2 |
-r, -n |
pub | Retain-Flag, Null-Payload (leer) |
-c, -x |
sub | Clean Session deaktivieren, Session Expiry (MQTT 5) |
-v, -F |
sub | Topic ausgeben, eigenes Format |
-C, -W |
sub | Nach N Nachrichten beenden, Timeout in Sekunden |
-R, --retained-only, --remove-retained |
sub | Umgang mit Retained Messages |
-V 5, -D |
beide | MQTT 5 und Properties |
-d |
beide | Debug-Ausgabe des Protokolls |
-k |
beide | Keep-alive in Sekunden |
Fehlerbehebung
Connection Refused: identifier rejected: leere oder ungültige Client ID. Übergeben Sie-imit einem eindeutigen Wert.- Verbindung bricht direkt nach dem Connect ab: Ein anderer Prozess nutzt dieselbe Client ID.
Error: Connection refusedauf Port 8883: Sie haben--capathoder--cafilevergessen, sodass der Client unverschlüsseltes TCP auf einem TLS-Port versucht hat.- Nichts kommt an: Vergleichen Sie Subscribe-Filter und Publish-Topic Zeichen für Zeichen; MQTT-Topics unterscheiden Groß- und Kleinschreibung, und ein führendes
/erzeugt eine zusätzliche leere Ebene. - Nachrichten stoppen nach einem Schwall: Limits des öffentlichen MQTT-Brokers (10 Nachrichten pro Sekunde und Client, 10 Subscriptions pro Client, 8 Topic-Ebenen).
Vom Test in den Produktivbetrieb
Der öffentliche MQTT-Broker eignet sich perfekt zum Erlernen dieser Befehle, Geräte im Feld brauchen jedoch private Zugangsdaten und Isolation. Ein verwalteter MQTT-Broker von ConnectMQ bietet TLS auf 8883, WebSocket auf 8083 und 8084, MQTT 3.1.1 und 5.0 sowie pro Broker generierte Zugangsdaten; jeder obige Befehl funktioniert, wenn Sie die Flags aus Beispiel 23 einsetzen. Weitere Kommandozeilen-Optionen finden Sie im Vergleich der MQTT-CLI-Tools, und wer lieber eine grafische Oberfläche nutzt, sieht sich die Desktop-Apps zum Erkunden von MQTT an. Der Leitfaden zu MQTT-Client-Bibliotheken zeigt, wie Sie diese Tests in Code überführen.
Starten Sie mit ConnectMQ
Erstellen Sie unter app.connectmq.com einen privaten Broker im kostenlosen Serverless-Plan, ganz ohne Kreditkarte. Kopieren Sie den generierten Benutzernamen, das Passwort und die Client ID in die Beispiele 22 und 23 und nutzen Sie den Live-Topic-Explorer des Portals parallel zu mosquitto_sub, um jede Nachricht zu bestätigen.
Häufig gestellte Fragen
Warum zeigt mosquitto_sub nichts an, wenn ich veröffentliche?
Meist passt der Topic-Filter nicht: Prüfen Sie Groß- und Kleinschreibung, Schrägstriche und Wildcards. Stellen Sie außerdem sicher, dass beide Clients unterschiedliche Client IDs verwenden, und ergänzen Sie -d, um zu sehen, ob die Subscription gewährt wurde.
Wie sende ich mit mosquitto_pub eine Nachricht ohne Payload?
Verwenden Sie -n. Zusammen mit -r löscht das die Retained Message auf diesem Topic.
Kann mosquitto_pub MQTT 5 verwenden?
Ja, ab Mosquitto 1.6. Fügen Sie -V 5 (oder -V mqttv5) hinzu und setzen Sie Properties mit -D <command> <property> <value>.
Muss der Mosquitto-Broker installiert sein, um diese Befehle zu nutzen?
Nein. Das Paket mosquitto-clients enthält nur die Kommandozeilen-Clients, und diese funktionieren mit jedem MQTT-Broker, auch mit ConnectMQ.



