2016-06-18 15 views
0

Ich bin ein paho MQTT Client implementieren. Hier ist mein Code:Rückgabedaten ON_MESSAGE in Python paho MQTT

import paho.mqtt.client as mqtt 


def mess(client, userdata, message): 
    print("{'" + str(message.payload) + "', " + str(message.topic) + "}") 


def subscribe(c_id, topic, server, port): 
    cl = mqtt.Client(c_id) 
    cl.connect(server, port) 
    cl.subscribe(topic) 
    cl.on_message = mess 
    cl.loop_forever() 

das funktioniert gut, aber ich möchte nicht die Daten in 'Chaos' drucken. Ich muss die Zeichenfolge innerhalb print() an die aufrufende Funktion zurückgeben. Ich rufe subscribe() von einem anderen Programm. Jede Hilfe, direkte oder empfohlene Lesung wäre willkommen.

Antwort

1

Mit dem, was Sie gezeigt haben, müssen Sie das global Flag verwenden, um die data Variable außerhalb der Funktion zu aktualisieren.

data = '' 

def mess(client, userdata, message): 
    global data 
    data = "{'" + str(message.payload) + "', " + str(message.topic) + "}" 

Auch die subscribe Funktion wird nie wieder zurückkehren, wie es ist, weil es cl.loop_forever() nennt. Wenn Sie es möchten, kehren Sie cl.loop_start()

Printing data in subscribe nennen sollte funktionieren auch nicht, weil der Client nicht tatsächlich die eingehende Nachricht verarbeiten kann, bis Sie die Netzwerkschleife (die Linie, nachdem Sie es in Druckbuchstaben) starten.

Auch gibt es keine Garantie, wenn eine Nachricht überbracht werden, nachdem Sie zu einem Thema abonnieren.

Ohne viel mehr über genau zu wissen, was Sie erreichen wollen, kann ich nicht mehr Hilfe sein, aber ich denke, Sie müssen zurückgehen und Ihren gesamten Ansatz betrachten, um die asynchrone Art von Pub/Sub zu übernehmen Messaging

+0

Ich habe versucht, die globale Variable nach ON_MESSAGE zu drucken/zurück, aber es tut nichts, ich denke, da ON_MESSAGE nicht blockierend ist. Die print/return-Anweisung wird ausgeführt, bevor eine Nachricht empfangen wird. Gibt es einen Weg durch das? –

+0

Bearbeiten Sie Ihre ursprüngliche Frage mit ALLEN Code, den Sie derzeit haben, was Sie beschrieben haben stimmt nicht mit dem Code überein, den Sie angezeigt haben – hardillb

0

Statt die globale Variable Methode der Verwendung erwähnt, ist es auch möglich, die Queue Paket zu verwenden.

import Queue 
import paho.mqtt.client as mqtt 

q = Queue.Queue() #initialises a first in first out queue 

def mess(client, userdata, message): 
    q.put(("{'" + str(message.payload) + "', " + str(message.topic) + "}")) 

if not q.empty(): #check if the queue is empty 
    msg = q.get() #get the first message which was received and delete 

Dadurch wird vermieden, dass eingehende Daten oder beschädigte Daten, die während der Verwendung überschrieben werden, verloren gehen.