MQTT mit Mosquitto

  • Guten Abend in die Runde,

    ich habe eine Frage an die MQTT-Spezialisten.

    Ich versuche gerade mich einzuarbeiten und dabei fiel die Wahl auf den pubsubclient. Ich habe das Beispielprogramm geladen und auf einen D1mini geflasht. Der Übersichtlichkeit halber füge ich den leicht veränderten Code hier noch mal ein:

    Die IP-Adresse 192.168.1.12 ist der Mosquitto-Broker auf meinem Raspberry Pi, die Zeile mit if (client.connect(clientId.c_str())) habe ich ergänzt um einen User mit zugehörigem Passwort: if (client.connect(clientId.c_str(), "Test2", "uGgr54K@")) .

    Wenn der Sketch läuft, erscheinen auch munter Daten unter Topic "outTopic", allerdings scheint der Callback nicht zu funktionieren. Jedenfalls finde ich nirgendwo den Topic "inTopic" und inTopic wird offensichtlich auch nicht abonniert.

    Ist das ein Problem von Mosquitto? Kann mir jemand auf die Sprünge helfen?

    Gruß

    Hans

  • Sendest du denn Messages in ein bestimmtes Topic?

    Kannst du mit z.B. dem "MQTT Explorer" machen, muss bei dir irgendwo instelliert sein.
    Mit Commandozeile geht es auch, hab gerade den Syntax nicht parat...

    Doch gefunden: (https://mosquitto.org/man/mosquitto_pub-1.html)

  • Direkt vorweg , ich kann kein C.
    HaSch
    Naja du sendest Nachrichten an "outTopic" 127 client.publish("outTopic", msg); und willst Nachrichten von "inTopic" empfangen 94 client.subscribe("inTopic"); . Wie sollen die Nachrichten nach "inTopic" kommen ? Das sind zwei getrennte 'Ordner' auf dem Broker . Tausche mal in Zeile 94 das "inTopic" gegen "outTopic" und teste dann nochmal .

    Edited once, last by Bertthias (February 2, 2026 at 11:06 PM).

  • HaSch Du hast einen Denkfehler gemacht ;)

    Du füllst eine rote Kiste mit Geld (publish) , andere holen sich das Geld wieder aus der gleichen roten Kiste heraus (subscribe).

    Wenn niemand die andere blaue Kiste füllt -> bleibt sie leer.

    Funktioniert auch mit Bankkonten...

    Na ja, ich habe den Beispielsketch einfach übernommen. Dann verstehe ich nicht, warum das nicht schon eher aufgefallen ist. Ich probiere es morgen mal aus.

  • It connects to an MQTT server then:
    - publishes "hello world" to the topic "outTopic" every two seconds
    - subscribes to the topic "inTopic", printing out any messages it receives. NB - it assumes the received payloads are strings not binary

    Naja ,da steht :
    - sendet Nachricht "hello world" an "outTopic" alle 2 Sekunden
    - empfängt Nachrichten von "inTopic" , druckt alle Nachrichten die empfangen werden

    Es steht nicht da wie die Nachrichten nach "inTopic" kommen , es wird angenommen von einen anderen Sender.
    Hauptsache es funktioniert jetzt.

    Aber den MQTT-Explorer kann ich auch nur empfehlen.

  • Das Beispiel demonstriert das publishen und das subscriben. Dass man selbst auf sein gepublishtes Topic subscribed ist unüblich und nicht notwendig.

    Ja, das habe ich schon verstanden, ich dachte nur, dass der Beispielsketch genau das demonstrieren will.

  • It subscribes to the topic "inTopic", printing out any messages it receives. NB - it assumes the received payloads are strings not binary

    So explizit steht es da nicht. "Any Message it sends to itself" wäre deutlich. Anyhow ... Wenn Du nur ein Topic in dem Beispiel nutzt dann sendet das Beispiel Messages zu sich selbst und man kann dann auch schön mit einem MQTT Browser oder auch auf der Commandline mit mosquitto_sub alles verfolgen.

    :no_sad: ... Kein raspiBackup - kein Mitleid ... :no_sad:

    Mein Raspberry Garten

    3 * RPi1B, 2 * RPi3B, 2 * RPi4B, 1 * CM4, 1 * RPi5

  • und man kann dann auch schön mit einem MQTT Browser oder auch auf der Commandline mit mosquitto_sub alles verfolgen.

    Absolut Zustimmung!

    Als ich kürzlich mein erstes (Python-) Projekt mit MQTT erstellt habe, hat es sich für mich als sehr hilfreich erwiesen, zuerst einmal ausschließlich mit mosquitto_pub und mosquitto_sub in der Shell mit dem MQTT-Broker zu kommunizieren und Erfahrung zu sammeln, wie das mit den Topics funktioniert.

    Und erst dann nach und nach den selbst programmierten Client dazu zu schalten und zu sehen, was passiert (oder auch nicht...) ^^

  • HaSch Was genau verstehst Du denn nicht an der Funktion? Da steht doch nix komplexes oder kompliziertes drin‽

    On some systems, in particular, Digital's Edusystems 20, 25, and 50, strings are limited to 6 characters. Several strings may, of course, be combined in an array to permit longer than 6-letter words to be used.”
    — David H. Ahl, 101 BASIC Computer Games, DEC, 1975

  • HaSch Wie die Funktion heisst, ist dem Compiler egal. callback() ist als Namen auch ziemlich generisch. Funktionen die bei bestimmten Ereignissen aufgerufen werden, sieht man oft nach dem Muster on_<ereignis>() benannt, also zum Beispiel in diesem Fall (immer noch recht generisch) on_message() oder on_message_received().

    On some systems, in particular, Digital's Edusystems 20, 25, and 50, strings are limited to 6 characters. Several strings may, of course, be combined in an array to permit longer than 6-letter words to be used.”
    — David H. Ahl, 101 BASIC Computer Games, DEC, 1975

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!