2017-05-17 1 views
1

Ich habe eine mqtt Client-Anwendung, die Themen basierend auf einer Konfigurationsdatei abonniert. Etwas wie:Paho MQTT-Client unterbrechen, um Abonnements neu zu laden

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) 

Ich habe, wie es mit einem einfachen Aufruf mit:

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

Die loop_forever wird für immer blockieren. Aber ich würde gerne bemerken, wenn die Information gelesen von clientids.allIDs() veraltet ist und ich neu verbinden sollte, zwingt es neu zu abonnieren.

kann ich eine Änderung der Dateien mit pyinotify erkennen:

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) 

Grundsätzlich, ich brauche loop_forever (oder einen anderen paho MQTT Mechanismus) zu laufen, bis ein Signal von den pyinotify Maschinen kommt. Ich bin mir nicht sicher, wie man diese zwei zusammenschweißt. In Pseudo-Code, ich etwas möchte ich wie

Ich bin mir nicht sicher, wie das aber zu tun.

+0

Haben Sie sich die anderen "loop" -Funktionen in den Dokumenten angesehen? – hardillb

+0

Ja, ich spiele mit 'loop_start()' und 'loop_stop()' und versuche im selben Moment einen non-threaded Notifier. Bis jetzt noch kein Glück. –

+0

Auch keine Notwendigkeit, die Verbindung zu trennen, nur eine Liste der Themen abonniert zu halten, dann Diff gegen die neue Liste, für die alten nicht mehr abbestellen und abonnieren Sie die neue – hardillb

Antwort

0

Ich umrundete schließlich die folgende Lösung, die zu funktionieren scheint. Während ich versuchte, den Antragsteller in einem anderen Thread und der MQTT Schleife im Hauptthread zu laufen, schien der Trick, dass das Setup umkehren werden:

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() 

Wo connectMQTT speichert eine neu verbunden und konfiguriert MQTT Client im Connection global .

Verwandte Themen