Es gibt zwei Probleme mit Ihrem Code (die ralight und hardlib haben angedeutet). Zunächst tritt das Programm nie loop_forever () und kann daher keine weiteren Befehle ausführen.Zweitens müssen Sie mybuffer als eine globale Variable definieren, so dass sie den Rückruf on_message verlässt.Dies fühlt sich etwas klobig an, aber (soweit ich weiß) ist es der beste Weg, um was zu tun Sie versuchen zu tun.
Die Lösung für das erste Problem besteht darin, einfach loop_start() anstelle von loop_forever() zu verwenden. Mein Verdacht ist, dass, wenn Sie dies vorher versucht haben, Sie keine Verzögerung eingelegt haben, um dem Skript Zeit zu geben, Nachrichten zu empfangen. Das zweite Problem kann einfach gelöst werden, indem die Zeile global mybuffer im on_message-Callback hinzugefügt wird. Dies teilt Python mit, dass dies eine globale Variable und keine lokale Variable ist.
Hier finden Sie einige Arbeits-Code, der dies veranschaulicht:
import paho.mqtt.client as paho
import time
mybuffer = ''
def on_subscribe(client, userdata, mid, granted_qos):
print('Subscribed')
def on_message(client, userdata, msg):
global mybuffer
mybuffer = str(msg.payload)
print('on_message: '+ mybuffer)
client = paho.Client()
client.on_subscribe = on_subscribe
client.on_message = on_message
client.connect('test.mosquitto.org')
client.subscribe('$SYS/#')
client.loop_start()
time.sleep(1)
client.loop_stop()
print(mybuffer)
Dies ist jedoch nicht der beste Weg zu erreichen, was Sie versuchen zu tun, weil es nicht mehrere Nachrichten in einer vorhersagbaren Art und Weise handhaben kann. Ein besserer Ansatz ist die gesamten Code in den ON_MESSAGE Rückruf so wickeln:
import paho.mqtt.client as paho
import time
def on_subscribe(client, userdata, mid, granted_qos):
print('Subscribed')
def on_message(client, userdata, msg):
mybuffer = str(msg.payload)
print('on_message: '+ mybuffer)
print(mybuffer)
client = paho.Client()
client.on_subscribe = on_subscribe
client.on_message = on_message
client.connect('test.mosquitto.org')
client.subscribe('$SYS/#')
client.loop_forever()
Dies ist eine weit robustere Lösung für das Problem, und aus meiner Sicht ist leichter zu verstehen.
Warum ist die Funktion nicht initialisiert? Der Zeilendruck ('on_message:' + mein_Puffer) sollte funktionieren. – fhossfel
Ich war nicht klar - die Funktion wird initiiert und ('on_message:' + my_buffer) funktioniert, aber die andere: print (mybuffer) läuft früher Drucken nichts - Ich bin wirklich nach der Verwendung der Druck außerhalb der On-Message-Funktion – Andrzej
Sie müssen das Schlüsselwort 'global' nachschlagen. – ralight