paho.mqtt.client subscribe Frage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
khz-tone
User
Beiträge: 3
Registriert: Mittwoch 6. Mai 2020, 09:52
Wohnort: Wörgl

Hallo zusammen!

Ich bin noch ziemlich neu in Python und versuche gerade einen MQTT Client aufzubauen. Soweit klappt das auch ganz gut mit dem Verbinden zum Broker.
Meine Frage bezieht sich auf den Subscribe: Mehmen wir mal das Testbeispiel her das eigentlich in vielen Tutorials zu finden ist.

Code: Alles auswählen

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe("StatusDisplay/LED/#")

def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))    

client = mqtt.Client("Test-Client")
client.on_connect = on_connect
client.on_message = on_message
client.connect("Broker-IP", 1883, 60)

client.loop_forever()
Nun habe ich hier im "on_connect" ein Topic abonniert das ich mir im Terminal ausgeben lasse. Funktioniert soweit.
Habe auf meinem Broker noch ein anderes Topic, das ich abonnieren kann, ändere ich die Zeile in,

Code: Alles auswählen

client.subscribe("StatusDisplay/ROW/#")
dann werden mir ab diesem Zeitpunkt beide Topics ausgegeben.

Warum ist das so? Wo liegt mein Fehler?

Bitte um Unterstützung!

Danke und LG
Philipp
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Ich kenne MQTT als Pub-Sub nicht, aber ich würde jetzt vermuten dass du das Topic mit "unsubscribe" nicht mehr abbonierst. Wenn dein Program einfach beendet wird kann es sein dass bei einem Neustart noch Nachrichten aus dem vorherigen Topic konsumiert werden.
When we say computer, we mean the electronic computer.
Benutzeravatar
khz-tone
User
Beiträge: 3
Registriert: Mittwoch 6. Mai 2020, 09:52
Wohnort: Wörgl

hmm, wenn ich

Code: Alles auswählen

client.unsubscribe("StatusDisplay/Row")
client.unsubscribe("StatusDisplay/LED")
ausführe, dann startet mein Broker neu. Dadurch verliert auch mein ESP32-Client die Verbindung. Dieser aboniert die selben Topics.

Das sollte wohl nicht sein?
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

So wie ich das in der Doku gelesen habe sollte demnach:client = mqtt.Client("Test-Client", clean_session=True) gesetzt werden, ansonsten wird bei einem Programmneustart das Topic erneut konsumiert. Das würde zumindest das Verhalten erklären.
When we say computer, we mean the electronic computer.
Benutzeravatar
khz-tone
User
Beiträge: 3
Registriert: Mittwoch 6. Mai 2020, 09:52
Wohnort: Wörgl

Habe mir das jetzt mal angesehen und verschiedenes ausprobiert. Soweit ich das in der Doku sehe, ist der Wert "clean_session=True" standardmäßig in der Klasse gesetzt, braucht demnach ja nicht geschrieben werden.
Habe es trotzdem ausprobiert und kommt auch nichts anderes heraus. Auch "False" liefert mir immer wieder die abonierten Topics.

Habe es auch mit der Reinitialisierung des Clients ausprobiert.

Code: Alles auswählen

client = mqtt.Client("Test-Client", clean_session=True)
client.reinitialise("Test-Client", clean_session=True)
Leider auch ohne Erfolg!

Stehe ich am Schlauch....
Antworten