泛美卫生组织订阅者 on_message/on_connect 无法工作

问题描述 投票:0回答:4

我已经安装了Mosquitto并在终端中使用没有问题,还安装了c++的paho,mosquitto和paho都工作得很好。 然后通过pip为python安装paho。现在我尝试用这段代码测试它,但 on_message 和 on_connect 函数永远不会被调用。我在做

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

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

import paho.mqtt.client as mqtt

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

def on_message(self, 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"
while True: 
    mqtt_client.loop()

我做错了什么?

python mqtt mosquitto paho
4个回答
4
投票

仅当您“订阅”某个主题时,才会调用

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

回调,对我来说造成问题的是我调用了

connack_string
 方法,因为它是 
Client
的方法,但事实并非如此。查看
源代码
,我们看到它是直接在模块中定义的,而不是在类中: 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
)。这是对阅读这篇文章的其他人的建议。 :)


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()



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 永远不会执行。
去算算吗?


0
投票
on_message

函数在Python中不起作用

Paho
。经过一番排查后,我发现我订阅了错误的主题。由于我没有订阅正确的主题,因此我的
on_message
功能没有被触发。
当您收到有关订阅主题的消息时,

on_message

功能就会起作用。因此,要接收消息,您需要确保您订阅了正确的主题。

这是一个简单的错误,但也有可能发生。我希望分享我的经验可以帮助其他可能面临同样问题的人。

© www.soinside.com 2019 - 2024. All rights reserved.