我有一个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()
我不确定如何影响。
答案 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()
connectMQTT
在Connection
全球范围内存储新连接和配置的MQTT客户端。