【问题标题】:How to view the topic of the mosquitto broker subscription如何查看mosquitto经纪人订阅的话题
【发布时间】:2019-09-11 02:36:46
【问题描述】:

我正在编写一个需要通过 mqtt 发送消息的 python 项目。我发现一个问题,当我发送一个需要订阅者下载一个需要花费几分钟的大文件的订单时,订阅者再次调用 on_connect 函数,此时订阅者无法收到它订阅的任何消息。这个错误偶尔会发生。

经过多次测试,我发现ss下载大文件后只要调用on_connect函数,订阅者就收不到其他消息了。 并且订阅者可以发送消息说mqtt没有问题,也可以打开终端订阅消息后接收。

所以,我猜想在下载大文件后订阅已断开。我需要查看 broker 的内部连接订阅的主题来验证我的猜测。

但我不知道如何检查它。请告诉我检查经纪人的方法以及如果猜测被证明是正确的如何解决这个问题

因为代码太多,我先来概括一下

cloud send a series of order including download file, modified and the likes by mqtt
devices receive message by mqtt, then operate order and feedback

设备下载大文件后,终端打印wait handle : Connected with result code 0 of on_connect func 类型的结果时,有可能收不到其他MQTT消息

def on_connect(client, userdata, flags, rc):
    print("wait handle : Connected with result code " + str(rc))

【问题讨论】:

  • 您是通过 MQTT 发送大文件吗?虽然可以这样做,但协议的目的是另一个目的。它的设计目的不是为了传输大量数据,而是通过不保证可靠或快速的连接传输少量数据。
  • 不行,MQTT只发送操作指令和几M以内的数据。我设置qos等于2,应该是可靠的,但是下载文件打印后订阅者没有收到后续消息on_connect 函数的结果

标签: python python-3.x mqtt mosquitto


【解决方案1】:

问题很可能是您在 on_connecton_message 回调中执行长时间运行的任务。

这些回调运行在 MQTT 客户端的网络线程上,该线程用于处理网络数据包的发送和接收。如果阻塞时间过长,则保持活动(MQTT 数据包之间的时间)将过期,并且代理将断开客户端。

如果您有长时间运行的任务,它们需要在单独的线程上运行。

使用subprocess 并等待它完成,这样您就可以获得输出,然后您将阻塞进程运行所需的时间,因此您不妨在同一个线程上运行它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-13
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 2015-12-04
    相关资源
    最近更新 更多