【问题标题】:Can't connect to mqtt broker无法连接到 mqtt 代理
【发布时间】:2017-03-14 16:25:21
【问题描述】:

我在我的 pi 上安装了 MQTT 代理 Mosquitto,但在让它与我的网络中的盒子一起工作时遇到了一些问题。在本地,如果我放入运行 Mosquitto MQTT 代理的 RPi,一切正常。我可以使用客户端命令(mosquitto_sub, mosquitto_pub)订阅和发布主题,没问题。但是,如果我尝试从另一个机器连接,带有 python 脚本的 Win2k12 服务器表明它无法连接。

  • 我已尝试在路由器中关闭防火墙
  • 我已尝试在我的 Win2k12 服务器上关闭防火墙
  • 我已将 TCP 1883 添加到允许从我的 Win2k12 服务器出站的端口

Python 脚本:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    client.publish("test_mqtt", "test")
    client.subscribe("test")

def on_disconnect(client, userdata, rc):
    print("Disconnect, reason: " + str(rc))
    print("Disconnect, reason: " + str(client))

client = mqtt.Client("testclient")
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect("192.168.1.20", 1883, 60)
client.loop_forever()

这里的输出是

Disconnect, reason: <paho.mqtt.client.Client object at 0x01F41EF0>
Disconnect, reason: 1

我试图查看the documentation,但它只提到了标志,没有定义它们是什么。

运行 Mosquitto 的树莓派也在运行 Node-red。连接到 MQTT 代理没有问题(它们都在同一个 rpi 上运行)

有没有人在 Raspberry Pi 上设置 MQTT 并让它与其他设备一起使用?我希望它可以与 NodeMCU 一起工作,但是当我遇到问题时,我开始编写 python 脚本来进一步调试问题。

【问题讨论】:

  • 您是否在重复使用客户端 ID? ("testclient") 每个客户端都需要一个唯一的 id
  • @hardillb 我刚刚在 python 脚本中使用随机客户端 ID 进行了测试,结果相同。
  • 你运行的是什么版本的 mosquitto。新版 paho 使用 MQTT 3.11,旧版 mosquitto 只支持 3.1
  • @hardillb 我运行 v3.1。那么python lib可能基于3.11并且不兼容?有趣的是 node-red 似乎是如何工作的
  • 3.1 不是 mosquitto 版本,而是协议版本,但如果它只是说 3.1,那么您无论如何都应该升级,因为它非常旧。

标签: python raspberry-pi mqtt mosquitto


【解决方案1】:

您可以通过向 mqtt.Client 构造函数添加一个选项来强制 paho 客户端使用 3.1 级别的协议:

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    client.publish("test_mqtt", "test")
    client.subscribe("test")

def on_disconnect(client, userdata, rc):
    print("Disconnect, reason: " + str(rc))
    print("Disconnect, reason: " + str(client))

client = mqtt.Client("testclient", protocol=mqtt.MQTTv31)
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.connect("192.168.1.20", 1883, 60)
client.loop_forever()

【讨论】:

  • 没有解决问题,仍然无法连接并得到与之前相同的错误。必须添加“”使其成为“MQTTv31”
  • @hardillib 好吧! protocol=mqtt.MQTTv31 有所作为,我的 python 脚本现在可以工作了!耶!
  • 你还是应该尝试寻找更新版本的 mosquitto
  • 请参阅 mosquitto.org/2013/01/mosquitto-debian-repository 以获取最新版本的 mosquitto。
【解决方案2】:

首先,您必须确保可以连接到 Raspberry Pi。您可以尝试使用 Paho 以外的库或使用一个 MQTT 客户端: http://www.hivemq.com/blog/seven-best-mqtt-client-tools

您可以尝试的另一件事是将客户端和代理都设置为使用端口 80,以查看它们是否可以通过该端口进行通信。

【讨论】: