La programmation MQTT qui consiste à associer des actions à la réception d'un message via la création de fonctions callback utilise un modèle de programmation événementielle. Dans ce modèle, on doit intégrer une boucle, de gestion de messages, qui doit en continu recevoir les messages, les filtrer et enfin appeler la fonction callback associée. La bibliothèque paho-mqtt offre deux implémentations de cette boucle :
La fonction démarre la boucle et attend les messages, les seules actions possibles se feront sur événement dans une fonction callback. C'est ce qui a été utilisé dans les exemples précédents.
Via cette fonction, on démarre un thread (c'est à dire un processus léger ou une tâche) partageant des variables (celles globales ainsi que "userdata" qui a été passé en paramètre à l'instanciation de la bibliothèque) avec la tâche principale qui continue en exécutant l'instruction suivante.
Il est alors possible de programmer dans la tâche principale une autre boucle contenant des instructions qui surveillent l'état des capteurs, qui interrogent le clavier ou qui attendent un peu de temps (via la fonction python time.sleep()) ...
Via la fonction loop_stop(), il est possible d'arrêter l'exécution de la boucle de traitement des messages MQTT et de son thread.
# -*- coding:Utf-8 -*- import paho.mqtt.client as mqtt import time def on_connect(client,userdata,flags,result): try: if (result==0): client.subscribe("/junia/#",2) else: print("erreur de connexion") quit(0) except Exception as e: print(e) quit(0) def on_message(client,userdata,message): try: print("Received message '" + message.payload.decode("utf8") + "' on topic '" + message.topic + "' with QoS " + str(message.qos)) except Exception as e: print(e) mqttc = mqtt.Client() mqttc.on_connect = on_connect mqttc.on_message = on_message mqttc.connect("test.mosquitto.org", 1883, 60) mqttc.loop_start() while True: # lecture des capteurs et envoies de messages time.sleep(10)