2017-07-28 7 views
0

Ich habe unter einfachen Code. Ich würde gerne in der Lage sein, var form on_message außerhalb davon zu drucken, aber wenn ich mein print (msg.payload) außerhalb der Schleife setze, funktioniert natürlich nicht, aber wie loop_forever initialisiert die Funktion on_message, mit print (msg .payload) innerhalb der Schleife weder funktioniert nicht (wie die Funktion nicht initialisiert.paho.mqtt - bekommen msg.payload gedruckt werden außerhalb von on_message Funktion

mybuffer = '' 

def on_subscribe(client, userdata, mid, granted_qos): 
    print('Subscribed') 

def on_message(client, userdata, msg): 
    mybuffer = str(msg.payload) 
    print('on_message: '+ mybuffer) 

client = paho.Client() 
client.on_subscribe = on_subscribe 
client.on_message = on_message 
client.connect('broker', 1883)  
client.subscribe('/andrzej/sensorki') 

client.loop_forever() 

print(mybuffer) 
+0

Warum ist die Funktion nicht initialisiert? Der Zeilendruck ('on_message:' + mein_Puffer) sollte funktionieren. – fhossfel

+0

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

+1

Sie müssen das Schlüsselwort 'global' nachschlagen. – ralight

Antwort

0

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.

Verwandte Themen