Se connecter à un broker MQTT avec Paho-MQTT
MQTT (Message Queuing Telemetry Transport) est un protocole léger de messagerie, particulièrement utilisé dans l’IoT (Internet des objets) pour la communication entre capteurs, appareils et applications. Pour exploiter MQTT en Python, la bibliothèque Paho-MQTT, développée par Eclipse, est la solution la plus répandue.
Ce tutoriel vous guidera à travers la connexion à un broker MQTT, l’abonnement à un topic et l’envoi de messages, en insistant sur chaque étape avec explications détaillées et exemples concrets.
Prérequis
- Python 3.6 ou supérieur installé sur votre machine.
- Un broker MQTT fonctionnel — vous pouvez utiliser
mosquitto
localement ou un broker public commetest.mosquitto.org
. - Installation de la bibliothèque
paho-mqtt
.
Installation de la bibliothèque Paho-MQTT
Pour installer paho-mqtt
, utilisez la commande pip :
pip install paho-mqtt
Comprendre les concepts de base
Avant d’écrire du code, il est essentiel de comprendre quelques notions clés du protocole MQTT :
- Broker MQTT : Serveur central qui reçoit, filtre et distribue les messages.
- Client MQTT : Un appareil ou programme qui se connecte au broker pour publier ou recevoir des messages.
- Topic : Canal de communication hiérarchique où les messages sont publiés et auxquels les clients peuvent s’abonner.
- QoS (Quality of Service) : Niveau de garantie de livraison du message (0, 1 ou 2).
Créer un client MQTT et se connecter au broker
Voici un exemple simple pour connecter un client MQTT au broker test.mosquitto.org
, un broker public accessible sans authentification :
import paho.mqtt.client as mqtt
# Fonction callback appelée lorsque la connexion au broker est réussie
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connexion au broker réussie")
else:
print(f"Échec de connexion, code erreur: {rc}")
# Création d'un client MQTT
client = mqtt.Client()
# Attachement de la fonction de callback
client.on_connect = on_connect
# Connexion au broker (adresse, port 1883 par défaut)
client.connect("test.mosquitto.org", 1883, 60)
# Boucle réseau pour gérer la communication (bloquante)
client.loop_forever()
Explications détaillées
- La fonction
on_connect
est appelée automatiquement par la bibliothèque dès que la connexion au broker est établie. Le paramètrerc
(return code) indique le succès (0) ou une erreur. mqtt.Client()
crée un nouvel objet client MQTT.client.connect()
lance la tentative de connexion au broker.client.loop_forever()
démarre une boucle qui écoute en continu les messages et événements réseau. Cette boucle bloque le programme tant que la connexion est active.
S’abonner à un topic et recevoir des messages
Pour que votre client MQTT puisse recevoir des messages, il doit s’abonner à un topic. Voici comment procéder :
def on_message(client, userdata, message):
print(f"Message reçu sur le topic {message.topic} : {str(message.payload.decode('utf-8'))}")
client.on_message = on_message
# S'abonner au topic "maison/salon/température"
client.subscribe("maison/salon/température", qos=1)
Cette fonction doit être ajoutée avant de démarrer la boucle réseau :
client.loop_forever()
Explication de l’abonnement
client.subscribe(topic, qos)
enregistre l’abonnement à un topic précis.qos
indique la qualité de service, ici 1 signifie que le message sera reçu au moins une fois.- La fonction
on_message
est appelée dès qu’un message arrive sur un topic auquel le client est abonné. Elle décode le message reçu (qui est en bytes) en UTF-8.
Publier un message sur un topic
Envoyer un message sur un topic est tout aussi simple :
result = client.publish("maison/salon/température", "22.5°C", qos=1)
# Vérification du résultat
status = result[0]
if status == 0:
print("Message publié avec succès")
else:
print(f"Erreur lors de la publication : {status}")
Note importante
La méthode publish
retourne un tuple (result[0]
est le code de statut, 0 = succès) qui permet de vérifier si l’envoi a été accepté.
Exemple complet d’un client MQTT en Python
Voici un programme complet qui connecte un client MQTT, s’abonne à un topic, publie un message, puis reste à l’écoute des messages reçus :
import paho.mqtt.client as mqtt
import time
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connecté avec succès au broker MQTT")
client.subscribe("maison/salon/température", qos=1)
else:
print(f"Connexion échouée avec code {rc}")
def on_message(client, userdata, message):
print(f"Message reçu : Topic={message.topic}, Payload={message.payload.decode('utf-8')}")
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("test.mosquitto.org", 1883, 60)
# Publication d'un message
result = client.publish("maison/salon/température", "23.0°C", qos=1)
if result[0] == 0:
print("Message publié avec succès")
else:
print("Erreur lors de la publication")
# Démarrage de la boucle réseau (bloquante)
client.loop_forever()
Résumé
- Paho-MQTT simplifie la gestion des connexions MQTT en Python.
- La connexion au broker s’effectue via
connect()
et la boucle réseauloop_forever()
. - L’abonnement à un topic permet de recevoir les messages avec une fonction callback
on_message
. - La publication de messages utilise
publish()
et peut être contrôlée via le code retour. - Le protocole MQTT, avec ses QoS et topics hiérarchiques, est particulièrement adapté aux scénarios IoT et streaming léger.
Pour aller plus loin
Vous pouvez enrichir ce programme avec des fonctionnalités avancées comme :
- Gestion des reconnexions automatiques en cas de perte de connexion.
- Authentification via username et password.
- Publication et réception de messages dans des formats JSON.
- Utilisation des topics avec jokers (wildcards) pour s’abonner à plusieurs topics à la fois.
Ce tutoriel vous donne une base solide pour intégrer MQTT dans vos projets Python, que ce soit pour de la domotique, des capteurs IoT, ou des systèmes distribués.