【问题标题】:Python, MQTT broker, publish messagePython、MQTT 代理、发布消息
【发布时间】:2017-07-05 13:44:32
【问题描述】:

我已经配置了 MQTT 代理,从另一段代码(不是我编写或访问的)接收已发布的消息。我在代理配置中添加了另一个主题,现在正尝试从一段 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 回调。

【问题讨论】:

  • 您在此处发布的代码虽然不是很好,但对我来说确实可以正常工作。 (鉴于连接最多只能存活 9 秒,因此无需设置 keepalive)
  • 所以你说这段代码有效,错误一定是在代理的配置方面?
  • 你用什么来测试的?我只是使用 mosquitto_sub -v -t '#' 来查看是否有任何显示。可能是代理上的 ACL 不允许您发布到该主题
  • 使用 on_log 回调可能会有所帮助,这将为您提供更有用的反馈。

标签: python mqtt publish-subscribe


【解决方案1】:

循环函数是必要的,因为它们是处理所有网络流量的地方。

手动设置与代理的连接以仅发送一条这样的消息不是一个好主意,最好启动客户端,让它继续运行(通过调用loop_start() 而不是调用loop_stop())在后台,然后只需调用 mqttc 客户端对象上的发布方法。

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

import paho.mqtt.publish as publish

publish.single("paho/test/single", "payload", hostname="iot.eclipse.org")

【讨论】:

  • 我试过publish.single(topic=topic, payload=msg, qos=2, hostname=host, port=port, keepalive=keepalive),但是broker仍然没有收到数据。此外,此函数不返回任何内容来检查发布是否成功!?
最近更新 更多