0

请帮我解决一下这个。我在这上面花了两天时间,但没有成功。

我正在使用 Paho-Mqtt python 客户端示例。我的 digitalocean debian 服务器上也有 HiveMq mqtt 服务器。如果我在笔记本电脑或 linux Debian 机器上运行,python 中的客户端示例代码可以连接并订阅 digitalocean 服务器。但。这是但是。当我在 digitalocean 服务器(hivemq mqtt 服务器所在的位置)上运行客户端时,它只能连接而不能订阅!我同时使用了 localhost 和服务器 IP,但仍然没有运气。

然而,在 digitalocean 服务器(以及 hivemq mqtt 服务器)上运行的相同客户端代码可以成功连接和订阅外部服务器,例如 m2m.eclipse.org。

我怎么知道它不是订阅而是连接?好吧,它在连接回调时返回 RC:0,但在订阅回调时不返回任何内容。(它应该返回“订阅:1”等)

结论:当 Clinet 与服务器在同一台机器上运行时,它可以连接但不能订阅。

4

1 回答 1

0

问题似乎是 sub.py 示例(来自这里:http ://git.eclipse.org/c/paho/org.eclipse.paho.mqtt.python.git/tree/examples/sub.py )似乎不正确。它不会在 on_connect 回调中执行订阅,而是在连接后直接执行。我的理解是,connect() 方法不会阻塞 connack。

如果您在连接后睡一秒钟,您可以自己验证这一点。

所以只需在 on_connect 回调中调用 subscribe() 即可。

Paho 官方页面显示了如何正确执行此操作,请参阅此处的入门页面:https ://eclipse.org/paho/clients/python/

这个错误代码适用于 mosquitto 而不是 HiveMQ 的原因是,mosquitto 是单线程的,而 HiveMQ 是异步和多线程的。所以连接和订阅可以并行执行,你最有可能想要顺序行为,这就是你必须使用 on_connect() 回调的原因。

于 2015-07-28T15:54:53.507 回答