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


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 :


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


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


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é


Pour aller plus loin

Vous pouvez enrichir ce programme avec des fonctionnalités avancées comme :

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.