import paho.mqtt.client as mqtt
Au début de notre programme, on définit une fonction callback qui sera ensuite appelée une fois que la connexion aura été réellement effectuée. La fonction callback sera appelée avec les 4 arguments suivant (dont vous pouvez changer les noms si vous le souhaitez) :
Ce premier paramètre est une copie de l'objet de gestion de MQTT utilisé pour cette connexion
Ce deuxième paramètre est la structure de données utilisateur que l'on a passée à la connexion
Ce troisième paramètre est un tableau de l'ensemble des drapeaux communiqués par le broker.
Ce quatrième paramètre indique si la connexion a réussi (valeur égale à 0) ou a échoué (voir tableau ci-dessous)
valeur | raison |
---|---|
0 | Connexion effectuée avec succès |
1 | Connexion refusée pour cause de version de protocole incorrecte |
2 | Connexion refusée pour cause d'identifiant de client non valide |
3 | Connexion refusée pour cause serveur inaccessible |
4 | Connexion refusée pour cause username/password refusé |
5 | Connexion refusée pour non autorisation. |
On remplacera, les lignes de 3 à 5, par le traitement que l'on souhaite effectuer après la connexion.
def on_connect(client,userdata,flags,result): try: # corps du traitement qui sera exécuté # print("phase de connexion terminée") except Exception as e: print(e) quit(0)
Remarque : l'instruction de la ligne 8 provoque l'arrêt du programme si une erreur survient dans le bloc du "try". Sans l'utilisation de la structure "try: ... except: ..." le callback stoppe son exécution au niveau de l'erreur sans la signaler ni arrêter l'exécution du programme principal.
Il est également possible d'utiliser l'instruction traceback.print_exc() (qui affiche une version plus détaillée de l'erreur) à la place de print(e) à condition de mettre au début du programme import traceback
On commence par utiliser le constructeur d'un client de la bibliothèque mqtt en lui passant éventuellement les trois paramètres nommés de la ligne 1 de l'exemple.
Si la chaine est vide (longueur égale à 0 ou valeur null) qui est la valeur par défaut, un identifiant de client est tiré au hasard. Sinon on utilise celui passé en paramètre, mais attention, un broker ne supporte pas deux clients ayant le même identifiant, le second arrivant déconnecte alors le premier connecté.
Si cela vaut True (la valeur par défaut), le broker retirera toutes les informations concernant ce client quand il se déconnectera.
C'est la structure de données qui doit être transmise à chaque appel d'une fonction callback.
C'est une constante qui correspond à la version de protocole MQTT.
mqttc = mqtt.Client(client_id="", clean_session=True, userdata=None, protocol=MQTTv311, transport="tcp") mqttc.on_connect = on_connect mqttc.connect("test.mosquitto.org", 1883, 60)
A la ligne 2, on définit la fonction callback qui sera appelée lorsque la phase de connexion sera terminée. A la ligne 3, on demande la connexion qui s'exécutera ensuite de façon asynchrone (on n'attend pas la fin de la phase de connexion pour passer à l'instruction suivante).
Le premier paramètre de la procédure "connect" est une chaine de caractères contenant le nom ou l'adresse IP du broker. Le second est un entier indiquant le port de connexion du broker. Le troisième est un entier qui indique le temps minimum en seconde entre deux communications client/broker.
# -*- coding:Utf-8 -*- import paho.mqtt.client as mqtt def on_connect(client,userdata,flags,result): try: # corps du traitement qui sera exécuté # if (result==0): print("connexion établie") else: print("erreur de connexion") quit(0) except Exception as e: print(e) quit(0) mqttc = mqtt.Client() mqttc.on_connect = on_connect mqttc.connect("test.mosquitto.org", 1883, 60) mqttc.loop_forever() |
# -*- coding:Utf-8 -*- import paho.mqtt.client as mqtt import traceback def on_connect(client,userdata,flags,result): try: # corps du traitement qui sera exécuté # if (result==0): print("connexion établie") else: print("erreur de connexion") quit(0) except: traceback.print_exc() quit(0) mqttc = mqtt.Client() mqttc.on_connect = on_connect mqttc.connect("test.mosquitto.org", 1883, 60) mqttc.loop_forever() |