Introduction à MQTT
Prérequis
Pour aborder ce cours, il est essentiel d'avoir des bases solides en programmation, notamment en Python. Une connaissance des structures de données, des fonctions et des boucles est indispensable. De plus, une familiarité avec les concepts de base des réseaux informatiques, tels que les adresses IP et les ports, sera utile.
Ce cours s'inscrit dans le programme de Numérique et Sciences Informatiques (NSI) de Terminale Générale, plus précisément dans le chapitre consacré à l'Internet des Objets (IoT) et aux protocoles de communication. Il vient après l'étude des bases de la programmation et des réseaux, et prépare à des projets plus avancés impliquant la collecte et l'échange de données entre des dispositifs connectés.
Chapitre 1 : Les Fondamentaux de MQTT
1.1 Introduction à l'Internet des Objets (IoT)
L'Internet des Objets (IoT) désigne l'interconnexion de dispositifs physiques (objets) via Internet, leur permettant de collecter et d'échanger des données. Ces objets peuvent être des capteurs, des actionneurs, des appareils électroménagers, des véhicules, etc. MQTT (Message Queuing Telemetry Transport) est un protocole de communication léger, conçu spécifiquement pour l'IoT.
1.2 Qu'est-ce que MQTT ?
MQTT est un protocole de messagerie de type *publish-subscribe* (publication-abonnement). Contrairement aux protocoles de communication directe (comme HTTP), MQTT utilise un *broker* (courtier) central qui reçoit les messages des *publishers* (éditeurs) et les distribue aux *subscribers* (abonnés) intéressés.
Publisher (Éditeur) : Un dispositif qui envoie des messages au broker.
Subscriber (Abonné) : Un dispositif qui s'abonne à un ou plusieurs *topics* (sujets) pour recevoir les messages correspondants.
Broker (Courtier) : Un serveur qui reçoit les messages des publishers et les distribue aux subscribers.
Topic (Sujet) : Une chaîne de caractères hiérarchique utilisée pour catégoriser les messages. Par exemple : “maison/temperature/salon”.
1.3 Le Modèle Publish-Subscribe
Le modèle publish-subscribe offre plusieurs avantages :
Découplage : Les publishers et les subscribers ne connaissent pas l'existence l'un de l'autre. Ils interagissent uniquement avec le broker.
Scalabilité : Le broker peut gérer un grand nombre de publishers et de subscribers.
Efficacité : Les messages sont envoyés uniquement aux subscribers intéressés, ce qui réduit la bande passante utilisée.
1.4 Les Niveaux de Qualité de Service (QoS)
MQTT propose trois niveaux de qualité de service (QoS) pour garantir la fiabilité de la transmission des messages :
QoS 0 (At Most Once) : Le message est envoyé une seule fois, sans confirmation de réception. C'est le niveau le plus rapide, mais le moins fiable.
QoS 1 (At Least Once) : Le message est envoyé au moins une fois, avec une confirmation de réception. Le message peut être envoyé plusieurs fois en cas de problème de réseau.
QoS 2 (Exactly Once) : Le message est envoyé exactement une fois, même en cas de problème de réseau. C'est le niveau le plus fiable, mais le plus lent.
Chapitre 2 : MQTT en Pratique avec Python
2.1 Installation de la Bibliothèque Paho MQTT
Pour utiliser MQTT en Python, nous allons utiliser la bibliothèque Paho MQTT. Vous pouvez l'installer avec la commande suivante :
```bash
pip install paho-mqtt
```
2.2 Publication d'un Message
Voici un exemple de code Python pour publier un message sur un broker MQTT :
```python
import paho.mqtt.client as mqtt
Configuration du broker
broker_address = "test.mosquitto.org" # Broker public pour les tests
port = 1883
topic = "mon/topic"
message = "Bonjour le monde !"
Création du client MQTT
Connexion au broker
client.connect(broker_address, port, 60)
Publication du message
client.publish(topic, message)
Déconnexion du broker
2.3 Abonnement à un Topic
Voici un exemple de code Python pour s'abonner à un topic et recevoir les messages :
```python
import paho.mqtt.client as mqtt
Configuration du broker
broker_address = "test.mosquitto.org"
port = 1883
topic = "mon/topic"
Fonction de callback pour gérer les messages reçus
def on_message(client, userdata, msg):
print(f"Message reçu sur le topic {msg.topic}: {msg.payload.decode()}")
Création du client MQTT
Connexion au broker
client.connect(broker_address, port, 60)
Abonnement au topic
Définition de la fonction de callback
client.on_message = on_message
Boucle principale pour écouter les messages
client.loop_forever()
```
2.4 Utilisation de JSON pour les Payloads
JSON (JavaScript Object Notation) est un format d'échange de données léger et facile à lire. Il est souvent utilisé pour structurer les payloads (contenus) des messages MQTT.
En Python, vous pouvez utiliser la bibliothèque `json` pour encoder et décoder les données JSON.
```python
import json
Création d'un dictionnaire Python
data = {
"temperature": 25.5,
"humidity": 60.2,
"timestamp": "2023-10-27T10:00:00"
}
Conversion du dictionnaire en chaîne JSON
json_data = json.dumps(data)
Publication du message JSON
client.publish(topic, json_data)
Dans la fonction on_message, décoder le JSON
def on_message(client, userdata, msg):
json_payload = json.loads(msg.payload.decode())
print(f"Température: {json_payload['temperature']}")
print(f"Humidité: {json_payload['humidity']}")
```
Chapitre 3 : Exercices et Applications
3.1 Exercice 1 : Capteur de Température
Créez un programme Python qui simule un capteur de température. Le programme doit publier la température actuelle (une valeur aléatoire entre 20 et 30 degrés Celsius) sur un topic MQTT toutes les 5 secondes, en utilisant un payload JSON contenant la température et un timestamp.
Corrigé Guidé :
Importez les bibliothèques `paho.mqtt.client`, `json`, `time` et `random`.
Définissez les paramètres du broker, du topic et de la fréquence de publication.
Créez un client MQTT et connectez-vous au broker.
Dans une boucle infinie, générez une température aléatoire, créez un dictionnaire Python contenant la température et le timestamp, convertissez le dictionnaire en chaîne JSON, publiez le message sur le topic, et attendez 5 secondes.
N'oubliez pas de déconnecter le client MQTT lorsque le programme se termine.
3.2 Exercice 2 : Contrôle d'un Actionneur
Créez un programme Python qui s'abonne à un topic MQTT et contrôle un actionneur (par exemple, une LED) en fonction des messages reçus. Si le message reçu est “ON”, allumez l'actionneur. Si le message reçu est “OFF”, éteignez l'actionneur.
Corrigé Guidé :
Importez les bibliothèques `paho.mqtt.client` et `json`.
Définissez les paramètres du broker et du topic.
Créez un client MQTT et connectez-vous au broker.
Abonnez-vous au topic.
Définissez une fonction de callback `on_message` qui reçoit les messages. Dans cette fonction, décodez le message et, en fonction de sa valeur (“ON” ou “OFF”), allumez ou éteignez l'actionneur (simulé par une simple instruction `print`).
Démarrez la boucle principale pour écouter les messages.
Résumé
IoT (Internet des Objets) : Interconnexion de dispositifs physiques via Internet.
MQTT (Message Queuing Telemetry Transport) : Protocole de messagerie de type publish-subscribe, léger et adapté à l'IoT.
Publisher (Éditeur) : Dispositif qui envoie des messages.
Subscriber (Abonné) : Dispositif qui reçoit des messages.
Broker (Courtier) : Serveur central qui distribue les messages.
Topic (Sujet) : Chaîne de caractères hiérarchique pour catégoriser les messages.
QoS (Quality of Service) : Niveau de qualité de service pour garantir la fiabilité de la transmission des messages (QoS 0, QoS 1, QoS 2).
JSON (JavaScript Object Notation) : Format d'échange de données léger et facile à lire, souvent utilisé pour structurer les payloads des messages MQTT.
La bibliothèque `paho-mqtt` en Python permet d'implémenter facilement le protocole MQTT.
La fonction `json.dumps()` convertit un dictionnaire Python en chaîne JSON.
La fonction `json.loads()` convertit une chaîne JSON en dictionnaire Python.