Python,MQTT代理,发布消息

时间:2017-07-05 13:44:33

标签: python mqtt publish-subscribe

我已经配置了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回调。

1 个答案:

答案 0 :(得分:0)

循环功能是必需的,因为这些是处理所有网络流量的地方。

手动设置与代理的连接只是发送这样的单个消息不是一个好主意,最好启动客户端,让它保持运行(通过调用loop_start()而不是调用{{ 1}})在后台,然后只需在loop_stop()客户端对象上调用publish方法。

如果您不想保持客户端的实例运行,那么您应该使用paho python库(https://pypi.python.org/pypi/paho-mqtt/1.1#single)提供的单消息发布帮助方法:

mqttc