Paho订户on_message / on_connect无法正常工作

时间:2016-06-21 14:26:50

标签: python mqtt mosquitto paho

我已经安装了Mosquitto并在终端中使用没有问题,也为c ++安装了paho,mosquitto和paho都运行良好。 然后通过pip为python安装了paho。现在我正在尝试使用此代码测试它,但on_message和on_connect函数永远不会被调用。我在做

my_struct var; var.a = 5; var.p = &(var.a); printf("%d\n",*(var.p)); //this will work

虽然python脚本运行但它不起作用。它永远不会到达打印“on_message!”的行

mosquitto_pub -h localhost -t "test" -m "This is a message"

我做错了什么?

3 个答案:

答案 0 :(得分:1)

以下对我来说很好。

我从回调中删除了self并将mqtt_client.loop_forever()

的循环换成了
import paho.mqtt.client as mqtt

def on_connect(mqtt_client, obj, flags, rc):
    mqtt_client.subscribe("test")

def on_message(mqtt_client, obj, msg):
    print "on_message()"


print "Initializing subscriber"
mqtt_client = mqtt.Client()
mqtt_client.on_connect = on_connect
mqtt_client.on_message = on_message
mqtt_client.connect("localhost",1883)
print "Listening"
mqtt_client.loop_forever()

答案 1 :(得分:1)

on_message回调仅在您订阅某个主题时被调用。 为此,您需要调用subscribe方法。例如:

print "Initializing subscriber"
mqtt_client = mqtt.Client()
mqtt_client.on_connect = on_connect
mqtt_client.on_message = on_message
mqtt_client.connect("localhost", 1883) # "localhost" or IP or 
mqtt_client.subscribe("test") # topic name, same as the "-t" argument in mosquitto_pub
print "Listening"
mqtt_client.loop_forever()

至于on_connect回调,对我造成问题的是,我像Client那样调用了connack_string方法,但事实并非如此。查看source code,我们发现它是直接在模块中定义的,而不是在类内部:

def connack_string(connack_code):

所以,我替换了这个:

def connect_callback(client, userdata, flags, rc):
    print("Connection attempt returned: " + client.connack_string(rc)) # client !!

与此:

def connect_callback(client, userdata, flags, rc):
    print("Connection attempt returned: " + mqtt.connack_string(rc)) # mqtt !!

您还可以尝试从-h localhost命令中省略mosquitto_pub部分,如下所示:

mosquitto_pub -t "test" -m "This is a message"

此外,请注意on_connect回调收到的参数数量( 4 )。这是给其他阅读这篇文章的人的建议。 :)

答案 2 :(得分:0)

这是一个旧线程,但我遇到了类似的问题。我有:

def on_message (client, userdata,message):
      print("received message", str(message.payload.decode("utf-8")

client.loop_start()
client.subscribe(topic)
client.on_message=on_message
time.sleep(30)
client.loop_stop()

如果我将时间从30更改为300,那么on_message将永远不会执行。 身材好吗?