中断paho mqtt客户端重新加载订阅

时间:2017-05-17 22:14:39

标签: python-3.x mqtt paho pyinotify

我有一个mqtt客户端应用程序,它根据配置文件订阅主题。类似的东西:

def connectMQTT():
    global Connection
    Connection = Client()
    Connection.on_message = handleQuery
    for clientid in clientids.allIDs(): # clientids.allIDs() reads files to get this
        topic = '{}/{}/Q/+'.format(Basename, clientid)
        print('subscription:', topic)
        Connection.subscribe(topic)

我一直在使用它,例如:

def main():
    connectMQTT()
    Connection.loop_forever()

loop_forever将永远阻止。但是我想注意clientids.allIDs()读取的信息何时过时,我应该重新连接,迫使它重新订阅。

我可以使用pyinotify检测文件中的更改:

def filesChanged():
    # NOT SURE WHAT TO DO HERE

def watchForChanges():
    watchManager = pyinotify.WatchManager()
    notifier = pyinotify.ThreadedNotifier(watchManager, FileEventHandler(eventCallback))
    notifier.start()
    watchManager.add_watch('/etc/my/config/dir', pyinotify.IN_CLOSE_WRITE | pyinotify.IN_DELETE)

基本上,我需要运行loop_forever(或其他一些paho mqtt机制)直到某些信号来自pyinotify机器。我不知道如何将这两者焊接在一起。在伪代码中,我想要像

这样的东西
def main():
    signal = setup_directory_change_signal()
    while True:
        connectMQTT()
        Connection.loop(until=signal)
        Connection.disconnect()

我不确定如何影响。

1 个答案:

答案 0 :(得分:0)

我终于绕过以下似乎有效的解决方案。虽然我试图在另一个线程和主线程中的mqtt循环中运行通知程序,但诀窍似乎是反转设置:

def restartMQTT():
    if Connection:
        Connection.loop_stop()
    connectMQTT()
    Connection.loop_start()

class FileEventHandler(pyinotify.ProcessEvent):
    def process_IN_CREATE(self, fileEvent):
        restartMQTT()

    def process_IN_DELETE(self, fileEvent):
        restartMQTT()


def main():
    restartMQTT()
    watchManager = pyinotify.WatchManager()
    notifier = pyinotify.Notifier(watchManager, FileEventHandler())
    watchManager.add_watch('/etc/my/config_directory', pyinotify.IN_CREATE | pyinotify.IN_DELETE)
    notifier.loop()

connectMQTTConnection全球范围内存储新连接和配置的MQTT客户端。