2014-07-11 39 views
1

我試圖通過使用this library中的message_callback_add()函數來按主題捕獲消息。下面是我用來處理我的mqtt訂閱和發佈需求的整個模塊。我已經能夠測試發佈的工作,但我似乎無法捕獲任何傳入的消息。沒有任何警告/錯誤,print("position")聲明僅適用於1和2。使用Paho的message_callback_add()函數,但沒有結果

import sys 
import os 
import time 
import Things 
import paho.mqtt.client as paho 

global mqttclient; 
global broker; 
global port; 

broker = "10.64.16.199"; 
port = 1883; 

mypid = os.getpid() 
client_uniq = "pubclient_"+str(mypid) 
mqttclient = paho.Client(client_uniq, False) #nocleanstart 
mqttclient.connect(broker, port, 60) 
mqttclient.subscribe("Commands/#") 

def Pump_callback(client, userdata, message): 
    #print("Received message '" + str(message.payload) + "' on topic '" 
    # + message.topic + "' with QoS " + str(message.qos)) 
    print("position 3") 
    Things.set_waterPumpSpeed(int(message.payload)) 

def Valve_callback(client, userdata, message): 
    #print("Received message '" + str(message.payload) + "' on topic '" 
    # + message.topic + "' with QoS " + str(message.qos)) 
    print("position 4") 
    Things.set_valvePosition(int(message.payload)) 

mqttclient.message_callback_add("Commands/PumpSpeed", Pump_callback) 
mqttclient.message_callback_add("Commands/ValvePosition", Valve_callback) 

print("position 1") 
mqttclient.loop_start() 
print("position 2") 


def pub(topic, value): 
    mqttclient.publish(topic, value, 0, True) 

回答

0

我在錯誤的地方打了電話loop_start

我在connect語句後將呼叫移到了右邊,現在它可以工作。

下面是摘錄:

client_uniq = "pubclient_"+str(mypid) 
mqttclient = paho.Client(client_uniq, False) #nocleanstart 
mqttclient.connect(broker, port, 60) 

mqttclient.loop_start() 
mqttclient.subscribe("FM_WaterPump/Commands/#") 

在它暗示調用loop_start()之前或之後連接儘管它應立即說之前或之後澄清loop_start的文檔。

片段的文件:

這些功能實現的螺紋接口向網絡環。在連接*()之前或之後調用loop_start()一次,會在後臺運行一個線程來自動調用loop()。這釋放了可能阻塞的其他工作的主線程。此調用還處理重新連接到經紀人。調用loop_stop()來停止後臺線程。

0

loop_start()將立即返回,所以它得到機會做任何事情之前,你的程序將退出。

您也在message_callback_add()之前調用subscribe(),這沒有意義,雖然在這個具體的例子中它可能並不重要。

+0

我以爲'loop_start()'會產生一個線程在後臺運行,所以它會是非阻塞的。 – schumacherj

+0

是的......所以它立即返回,那麼你的'def pub(topic,value):'什麼也不做,那是程序的結束。所以它退出。 – ralight