我已经安装了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()
我做错了什么?
仅当您“订阅”某个主题时,才会调用
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)。这是对阅读这篇文章的其他人的建议。 :)
我已从回调中删除了
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()
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 永远不会执行。 去算算吗?
on_message
函数在Python中不起作用
Paho
。经过一番排查后,我发现我订阅了错误的主题。由于我没有订阅正确的主题,因此我的 on_message
功能没有被触发。当您收到有关订阅主题的消息时,on_message
功能就会起作用。因此,要接收消息,您需要确保您订阅了正确的主题。
这是一个简单的错误,但也有可能发生。我希望分享我的经验可以帮助其他可能面临同样问题的人。