MQTT : le protocole que tout le monde devrait connaître

MQTT (Message Queuing Telemetry Transport) est devenu incontournable dans l’univers de l’IoT et des architectures événementielles. Pourtant, ce protocole créé par IBM dans les années 1990 reste méconnu de nombreux développeurs. Changeons ça et regardons de plus près…

Pourquoi MQTT ?

Contrairement à HTTP qui fonctionne en requête/réponse, MQTT implémente un modèle publish/subscribe ultra-léger. Son principal atout ? Une empreinte réseau minimale, parfaite pour les objets connectés aux ressources limitées ou les connexions instables.

Là où HTTP envoie des headers volumineux à chaque requête, MQTT peut transmettre un message avec seulement 2 octets de surcharge. Sur une connexion 3G instable ou un capteur alimenté par batterie, la différence est considérable.

Architecture : topics et QoS

MQTT repose sur trois acteurs : les publishers qui publient des messages, les subscribers qui s’abonnent à des topics, et le broker qui fait la jonction en tant que serveur. Le broker (Mosquitto, HiveMQ, AWS IoT Core) gère le routage des messages selon une arborescence de topics.

Un topic ressemble à un chemin de fichier : maison/salon/temperature ou usine/ligne3/capteur12/vibration. On peut s’abonner avec des wildcards : maison/+/temperature (+ pour un niveau) ou maison/# (# pour tous les sous-niveaux).

MQTT propose trois niveaux de qualité de service (QoS) :

  • QoS 0 : fire and forget, aucune garantie de livraison
  • QoS 1 : au moins une fois, avec accusé de réception
  • QoS 2 : exactement une fois, avec handshake en quatre étapes

Exemple pratique : monitoring de température

Voici un publisher Python avec Paho MQTT :

import paho.mqtt.client as mqtt
import json
import time
import random

def on_connect(client, userdata, flags, rc):
    if rc == 0:
        print("Connecté au broker MQTT")
    else:
        print(f"Échec de connexion, code: {rc}")

# Configuration
client = mqtt.Client(client_id="capteur_temp_salon")
client.on_connect = on_connect
client.username_pw_set("username", "password")

# Connexion au broker
client.connect("mqtt.exemple.com", 1883, 60)
client.loop_start()

# Publication en boucle
while True:
    temperature = 20 + random.uniform(-2, 5)
    payload = json.dumps({
        "temp": round(temperature, 2),
        "timestamp": int(time.time()),
        "unit": "celsius"
    })
    
    result = client.publish(
        "maison/salon/temperature",
        payload,
        qos=1,
        retain=True  # Garde le dernier message pour les nouveaux subscribers
    )
    
    print(f"Message publié: {payload}, status: {result.rc}")
    time.sleep(60)

Et le subscriber correspondant :

import paho.mqtt.client as mqtt
import json

def on_connect(client, userdata, flags, rc):
    print(f"Connecté avec le code: {rc}")
    # S'abonner à la connexion garantit la réabonnement après déconnexion
    client.subscribe("maison/+/temperature", qos=1)

def on_message(client, userdata, msg):
    data = json.loads(msg.payload.decode())
    room = msg.topic.split('/')[1]
    print(f"🌡️  {room}: {data['temp']}°C à {data['timestamp']}")
    
    # Logique métier
    if data['temp'] > 25:
        print(f"⚠️  Alerte: température élevée dans {room}")

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set("username", "password")

client.connect("mqtt.exemple.com", 1883, 60)
client.loop_forever()

Fonctionnalités avancées

Last Will and Testament (LWT) : chaque client peut définir un message qui sera automatiquement publié par le broker en cas de déconnexion inattendue. Pratique pour détecter des capteurs hors ligne.

client.will_set("maison/salon/status", "offline", qos=1, retain=True)

Retained messages : le broker conserve le dernier message publié avec le flag retain=True. Les nouveaux subscribers le reçoivent immédiatement, sans attendre une nouvelle publication.

Sessions persistantes : avec clean_session=False, le broker conserve les abonnements et messages QoS>0 pendant une déconnexion.

Cas d’usage concrets

J’ai vu MQTT briller dans des contextes variés : une ferme urbaine avec 200 capteurs d’humidité du sol communiquant via LoRaWAN puis MQTT, un système de suivi de flotte où chaque véhicule publie sa position GPS toutes les 30 secondes, ou encore une usine avec des milliers de machines publiant leurs métriques de production en temps réel. Plus loin ? Une ville et des capteurs sur les conteneurs à ordures présents dans les rues : s’ils sont pleins, une alerte via MQTT est relativement rapide et simple à envoyer, déclenchant l’intervention d’un camion poubelle.

Un cas particulièrement élégant : un système domotique où la simple publication sur maison/salon/lumiere/set avec payload {"state": "ON", "brightness": 80} contrôle l’éclairage, tandis que la lampe confirme son état sur maison/salon/lumiere/state.

MQTT et ses alternatives

Comparé à WebSockets, MQTT gère nativement la reconnexion, les QoS et le routage par topics. Face à AMQP, il est beaucoup plus simple et léger. CoAP est encore plus compact mais moins mature en termes d’écosystème.

La version MQTT 5.0 ajoute des fonctionnalités intéressantes : propriétés utilisateur dans les messages, raison de déconnexion, expiration des messages, et request/response pattern pour simplifier les interactions bidirectionnelles.

Pour démarrer

Sur Linux, installez Mosquitto localement (apt install mosquitto mosquitto-clients sur Ubuntu), lancez un subscriber dans un terminal avec mosquitto_sub -t "test/#" -v, et publiez depuis un autre avec mosquitto_pub -t "test/hello" -m "Hello MQTT". Vous verrez immédiatement l’intérêt !

MQTT n’est pas la solution universelle, mais pour tout ce qui touche à l’événementiel, l’IoT ou les architectures temps réel, il mérite clairement sa place dans votre boîte à outils et dans vos développements.

Publications similaires

  • RaspiDomo compatible Chacon

    Notre solution domotique, RaspiDomo, basée sur Raspberry Pi B+, est désormais utilisable avec les modules Chacon / MyFox. Vous allez ainsi pouvoir venir intégrer un module à l’intérieur d’un interrupteur (ce modèle) et activer l’interrupteur à distance. Cela ne change rien au fonctionnement du dit interrupteur : il reçoit simplement une possibilité d’être activé à distance, oh miracle domotique ultime. Sur notre photo d’illustration, nous voyons les deux fils à relier à l’interrupteur d’origine (prévoyez un modèle assez plat du…

  • Tunderbird OS/X : copier d’une machine à l’autre

    Il peut arriver de devoir dupliquer vos emails d’une machine OS/X à une autre, par exemple lors d’un SAV de votre iBidule. Si, comme moi, vous utilisez Thunderbird, l’opération de copie est des plus simples. Avec le finder, utilisez Aller au Dossier et rendez-vous dans /Users/utilisateur/Library/Thunderbirds/Profiles, utilisateur étant votre nom d’utilisateur d’OS/X (dupont, durant, infracom, ou ce que vous utilisez d’autre). Là, vous allez trouver un ou plusieurs dossiers xxxxxx.default : prenez le plus rempli, l’autre n’étant que local à la…

  • NUC : un hackintosh à portée de main !

    Le NUC d’Intel, disponible chez Materiel.net, souvenez-vous, présenté dans ce billet de Minimachine.net par exemple, un ordinateur on ne peut plus petit, silencieux à souhait, tout en restant fort bien équipé. Au hasard d’un surf, je me suis aperçu qu’il était utilisable comme hackintosh, cette machine hybride fonctionnant sous OX/S 10.8.2 sans toutefois être estampillée par la Pomme. Impossible ? Lisez ce billet sur Tonymacx86… Ni une, ni deux, simulons un peu le coût d’un tel équipement chez Materiel.net :…

  • Liens ajoutés

    Deux liens ont été ajoutés ce matin, sur deux sites très différents qui nous plaisent fortement : le premier sur les Viellles Charrues, il aurait été difficile de faire l’impasse alors que nous allons y participer 😉 Le second, sur Blogeee, un blog destiné aux eeePC, ces petits ordinateurs, souvent miniaturisés à l’extrême mais extrêmement modulables et évolutifs. Un blog que nous fréquentons avec assiduité car il fourmille d’idées, infos, astuces, et de tous ces petits détails que le geek…

  • Ubuntu aux Charrues

    Ubuntu annonce sa participation au 20ème Festival des Vieilles Charrues, et évoque la connexion satellite SkyDSL2+ qui sera utilisée pour 6 de ses postes en libre service, au Webcafé Ubuntu. Pour mieux vous situer, voici un plan du site. Le Webcafé se situe à « La Garenne », là où est il est indiqué « Stands Associatifs ». Au plaisir donc de vous retrouver sur site lors de cette démonstration d’internet par satellite un peu inédite 😉 Source : Ubuntu-fr

  • mFi : présentation

    Allons-y pour une série de billets sur mFi, la gamme domotique proposée par Ubiquiti, et intéressons-nous de plus près au capteur de température, délicieusement prénommé mFi-THS par le constructeur américain. Installons le logiciel mFi sur notre iMac, relions mFi-THS au contrôleur mPort de base : et laissons mFi découvrir le matériel… en quelques minutes, le contrôleur a été adopté, mis à jour, et sa sonde de température également : simple, pratique, on n’a vraiment rien à faire, c’est de l’Ubiquiti, un…

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.