使用Paho的message_callback_add()函数,但没有结果

问题描述:

我试图通过使用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) 

我在错误的地方打了电话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()来停止后台线程。

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

您也在message_callback_add()之前调用subscribe(),这没有意义,虽然在这个具体的例子中它可能并不重要。

+0

我以为'loop_start()'会产生一个线程在后台运行,所以它会是非阻塞的。 – schumacherj

+0

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