我已经配置了MQTT Broker,从另一段代码接收已发布的消息(我没有编写或访问)。我在代理配置中添加了另一个主题,现在尝试从一段python代码向这个新主题发布数据。我得到了回调函数发布消息的反馈,但没有收到实际数据。
我有什么遗失的吗?
我使用以下代码:
import paho.mqtt.client as mqtt
import time
#=========================================================================
def on_connect(client, userdata, flags, rc) :
print "on_connect()"
#=========================================================================
def on_publish(client, userdata, mid) :
print "on_publish()"
#=========================================================================
def send() :
mqttc = mqtt.Client()
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
#host = "localhost"
host = "127.0.0.1"
port = 1883
keepalive = 60
print "\nConnect to '%s', port '%s', keepalive '%s'" % (host, port, keepalive)
mqttc.connect(host=host, port=port, keepalive=keepalive)
time.sleep(3)
mqttc.loop_start()
time.sleep(3)
topic = "data/MY/TOPIC"
msg = "MY_MESSAGE"
print "Publish to '%s' msg '%s'" % (topic, msg)
mqttc.publish(topic, msg, qos=2)
time.sleep(3)
mqttc.loop_stop()
# end send()
#=========================================================================
if __name__ == "__main__":
send()
# end if
获取标准输出
Connect to '127.0.0.1', port '1883', keepalive '60'
on_connect()
Publish to 'data/MY/TOPIC' msg 'MY MESSAGE'
on_publish()
我不确定loop()函数是否必要,但如果我没有在loop_start()和loop_stop()中嵌入发布,我就不会得到on_connect回调。
答案 0 :(得分:0)
循环功能是必需的,因为这些是处理所有网络流量的地方。
手动设置与代理的连接只是发送这样的单个消息不是一个好主意,最好启动客户端,让它保持运行(通过调用loop_start()
而不是调用{{ 1}})在后台,然后只需在loop_stop()
客户端对象上调用publish方法。
如果您不想保持客户端的实例运行,那么您应该使用paho python库(https://pypi.python.org/pypi/paho-mqtt/1.1#single)提供的单消息发布帮助方法:
mqttc