Paho Python MQTT 客户端连接成功但 on_connect 回调未被调用
Paho Python MQTT client connects successfully but on_connect callback is not invoked
我在 Raspberry Pi 上有一个简单的脚本,它每 3 秒发布一条示例消息。我已经声明了回调 on_connect、on_publish 和 on_disconnect。此客户端连接成功但未调用 on_connect、发布并调用 on_publish、断开连接并调用 on_disconnect。
这是我的脚本
import paho.mqtt.client as mqtt
import time
def on_connect(mqttc, userdata, rc):
print("Connected with result code "+str(rc))
if rc!=0 :
mqttc.reconnect()
def on_publish(mqttc, userdata, mid):
print "Published"
def on_disconnect(mqttc, userdata, rc):
if rc != 0:
print("Unexpected disconnection. Reconnecting...")
mqttc.reconnect()
else :
print "Disconnected successfully"
# Setup MQTT
# broker='test.mosquitto.org'
broker = 'iot.eclipse.org'
broker_port=1883
# Create a client instance
mqttc=mqtt.Client(client_id="MyClient")
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_disconnect = on_disconnect
while 1:
mqttc.connect(broker, broker_port, 60)
# print "Connected." # I don't want this message.
# Why isn't the on_connect callback invoked?
try:
topic = "this/is/a/test/topic"
payload = "test_message"
print "Publishing " + payload + " to topic: " + topic + " ..."
mqttc.publish(topic, payload, 0)
except Exception as e:
print "exception"
log_file=open("log.txt","w")
log_file.write(str(time.time())+" "+e.__str__())
log_file.close()
mqttc.disconnect()
print ""
time.sleep(3)
虽然这个小问题"bug"不影响消息发布,主要是我想达到的目的,但是为什么会出现这种情况,如何解决?
您的 on_connect()
方法声明缺少 flags(1) 参数。所以它没有被调用。 Flags 参数包含代理发送的响应。必须是
def on_connect(mqttc, userdata, flags, rc):
另外,为什么要循环连接和断开连接?尝试使用 loop_start()
和 loop_stop()
方法来处理连接断开时的自动重新连接()。
这不起作用的原因是您没有调用任何 loop*()
函数。这些处理网络流量。如果您不使用,则无法保证您的外发邮件会被发送,也绝对不会处理任何传入邮件。
loop_forever()
是处理网络循环的阻塞调用 - 可能不是您想要的。
loop_start()
启动一个线程来处理网络循环,因此 returns 直接。
我会这样做:
mqttc.connect(broker, broker_port, 60) # Don't forget to handle errors
mqttc.loop_start()
while 1:
try:
topic = "this/is/a/test/topic"
payload = "test_message"
print "Publishing " + payload + " to topic: " + topic + " ..."
mqttc.publish(topic, payload, 0)
except Exception as e:
print "exception"
log_file=open("log.txt","w")
log_file.write(str(time.time())+" "+e.__str__())
log_file.close()
print ""
time.sleep(3)
如@Kiran 所说,您仍然需要修复 on_connect 回调。
无需每次都断开连接 - 事实上,当您断开连接时,无法保证您的消息已发送。您应该使用 on_publish
回调来了解消息何时发送。
如果你想做一个简单的连接-发布-断开,那么可以使用 paho.mqtt.publish
辅助模块:
import paho.mqtt.publish as publish
while 1:
try:
topic = "this/is/a/test/topic"
payload = "test_message"
print "Publishing " + payload + " to topic: " + topic + " ..."
publish.single(topic, payload, 0, host=broker, port=broker_port)
except Exception as e:
print "exception"
log_file=open("log.txt","w")
log_file.write(str(time.time())+" "+e.__str__())
log_file.close()
print ""
time.sleep(3)
我在 Raspberry Pi 上有一个简单的脚本,它每 3 秒发布一条示例消息。我已经声明了回调 on_connect、on_publish 和 on_disconnect。此客户端连接成功但未调用 on_connect、发布并调用 on_publish、断开连接并调用 on_disconnect。
这是我的脚本
import paho.mqtt.client as mqtt
import time
def on_connect(mqttc, userdata, rc):
print("Connected with result code "+str(rc))
if rc!=0 :
mqttc.reconnect()
def on_publish(mqttc, userdata, mid):
print "Published"
def on_disconnect(mqttc, userdata, rc):
if rc != 0:
print("Unexpected disconnection. Reconnecting...")
mqttc.reconnect()
else :
print "Disconnected successfully"
# Setup MQTT
# broker='test.mosquitto.org'
broker = 'iot.eclipse.org'
broker_port=1883
# Create a client instance
mqttc=mqtt.Client(client_id="MyClient")
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_disconnect = on_disconnect
while 1:
mqttc.connect(broker, broker_port, 60)
# print "Connected." # I don't want this message.
# Why isn't the on_connect callback invoked?
try:
topic = "this/is/a/test/topic"
payload = "test_message"
print "Publishing " + payload + " to topic: " + topic + " ..."
mqttc.publish(topic, payload, 0)
except Exception as e:
print "exception"
log_file=open("log.txt","w")
log_file.write(str(time.time())+" "+e.__str__())
log_file.close()
mqttc.disconnect()
print ""
time.sleep(3)
虽然这个小问题"bug"不影响消息发布,主要是我想达到的目的,但是为什么会出现这种情况,如何解决?
您的 on_connect()
方法声明缺少 flags(1) 参数。所以它没有被调用。 Flags 参数包含代理发送的响应。必须是
def on_connect(mqttc, userdata, flags, rc):
另外,为什么要循环连接和断开连接?尝试使用 loop_start()
和 loop_stop()
方法来处理连接断开时的自动重新连接(
这不起作用的原因是您没有调用任何 loop*()
函数。这些处理网络流量。如果您不使用,则无法保证您的外发邮件会被发送,也绝对不会处理任何传入邮件。
loop_forever()
是处理网络循环的阻塞调用 - 可能不是您想要的。
loop_start()
启动一个线程来处理网络循环,因此 returns 直接。
我会这样做:
mqttc.connect(broker, broker_port, 60) # Don't forget to handle errors
mqttc.loop_start()
while 1:
try:
topic = "this/is/a/test/topic"
payload = "test_message"
print "Publishing " + payload + " to topic: " + topic + " ..."
mqttc.publish(topic, payload, 0)
except Exception as e:
print "exception"
log_file=open("log.txt","w")
log_file.write(str(time.time())+" "+e.__str__())
log_file.close()
print ""
time.sleep(3)
如@Kiran 所说,您仍然需要修复 on_connect 回调。
无需每次都断开连接 - 事实上,当您断开连接时,无法保证您的消息已发送。您应该使用 on_publish
回调来了解消息何时发送。
如果你想做一个简单的连接-发布-断开,那么可以使用 paho.mqtt.publish
辅助模块:
import paho.mqtt.publish as publish
while 1:
try:
topic = "this/is/a/test/topic"
payload = "test_message"
print "Publishing " + payload + " to topic: " + topic + " ..."
publish.single(topic, payload, 0, host=broker, port=broker_port)
except Exception as e:
print "exception"
log_file=open("log.txt","w")
log_file.write(str(time.time())+" "+e.__str__())
log_file.close()
print ""
time.sleep(3)