Le protocole MQTT (Message Queuing Telemetry Transport) est un protocole de connectivité de machine-to-machine (M2M) utilisé dans l'IoT(Internet of Things).
Il s'agit d'un système de publication et d'abonnement (publish and subscribe) léger où vous pouvez publier et recevoir des messages en tant que client,avec une faible bande passante. C'est donc la solution parfaite pour les applications de l'Internet des objets.
Dans MQTT, il y a quelques concepts de base que vous devez comprendre:
Publish/Subscribe: Dans un système de publication et d'abonnement (Publish/Subscribe), un objet peut publier un message sur un sujet, ou il peut être abonné à un sujet particulier pour recevoir des messages.
Par exemple,
-Le client1 MQTT publie sur un sujet.
-Le client2 MQTT est abonné au même sujet que le client1 MQTT.
-Ainsi, le client2 mqtt reçoit le message.
Remarque: Le client1 MQTT, peut être une carte ESP32 ou Plateforme de contrôle domotique (Home Automation controller platform) par exemple: Node-RED, Home Assistant, Domoticz, OpenHAB.
Les messages: sont les informations que vous souhaitez échanger entre vos appareils. Que ce soit une commande ou des données.
Le sujet (Topic): permet de spécifier où vous souhaitez publier le message
Les sujets sont représentés avec des chaînes séparées par une barre oblique. Chaque barre oblique indique un niveau de sujet. Voici un exemple de création d'un sujet pour une lampe dans votre bureau à domicile:
maison/bureau/lampe
Remarque: les sujets sont sensibles à la casse, ce qui rend le sujet "maison/bureau/lampe" différent de "maison/bureau/Lampe"
Si vous souhaitez allumer une lampe dans votre bureau à domicile à l'aide de MQTT, vous pouvez imaginer le scénario suivant:
Broker:
Le broker(courtier/ intermédiaire) est principalement chargé de recevoir tous les messages, de filtrer les messages, de décider qui les intéresse et de publier le message à tous les clients abonnés.
On peut utiliser un Broker local comme "Mosquitto broker" qui peut être installé sur une carte Raspberry Pi, ou un MQTT broker sur le cloud.
On distingue 2 types de MQTT Broker:
On va utiliser un client web d'un Broker public : public.mqtthq.com https://mqtthq.com/client
1-(client 1) Dans "Subscribe to topic:" choisir le "Topic :" maison/bureau/lampe puis cliquer sur "Subscribe" pour s'abonner au topic lampe
2-(client 2)dans "Publish to topic:" choisir le même "Topic :" maison/bureau/lampe puis saisir un texte dans "Payload to publish:" puis cliquer sur "Publish"
par conséquent, le message est reçu dans "Received payloads:" du (client1) déjà abonné au topic lampe
Remarque: On peut utiliser un autre client de Broker public www.hivmq.com
http://www.hivemq.com/demos/websocket-client/
On peut publier sur le broker en untilisant une application android, par exemple : MQTT Terminal (https://play.google.com/store/apps/details?id=com.mightyit.mqttclientterminal), ou IoT MQTT Dashbord https://apksfull.com/iot-mqtt-dashboard/com.thn.iotmqttdashboard
Pour publier sur le Topic de MQTT Broker, on va utiliser l'application android IoT MQTT Dashboard :
Commencer par télécharger IoT MQTT Dashboard puis l'installer sur votre smartphone.
Remarque :l'application n'est plus disponible sur Playstore, la télécharger à partir de apkfull.com
https://apksfull.com/iot-mqtt-dashboard/com.thn.iotmqttdashboard
Une fois installée, ouvrir l'application, puis cliquer sur le + en bas à droite de l'écran pour créer une nouvelle connexion à un MQTT Broker:
Pour notre exemple de MQTT Broker public, choisir un Client ID de votre choix puis un server: public.mqtthq.com et un port: 1883
Une fois la connexion créée, cliquer dessus pour s'abonner (Subscribe) à un topic pour voir les messages publiés.
Puis choisir l'onglet PUBLISH pour publier un message sur un Topic.
Pour publier sur le topic , il faut écrire ON ou OFF puis cliquer sur le bouton PUBLISH, et pour voir les messages publiés il suffit de réouvrir l'onglet SUBSCRIBE
Remarque: Pour faciliter , on pourra utiliser à la place du type texte, le type switch:
NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône
Commander une lampe LED par Internet en utilisant le protocole MQTT et une application android.
Allumer la LED branché sur le GPIO23 si message envoyé sur le broker est égale ON et l'éteindre dans le cas si le message envoyé est OFF.
import network
from machine import Pin
from time import sleep
from umqtt.simple import MQTTClient
from network import *
import gc
gc.collect()
### connexion wifi ####
ssid = 'NOM_WIFI'
password = 'MOT_DE_PASSE_WIFI'
station = WLAN(STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
pass
print(station.ifconfig())
########################
sleep(2)
topic = b'maison/bureau/lampe'
mqtt_server='public.mqtthq.com'
p=Pin(23,Pin.OUT)
def fonction_de_rappel(topic, msg):
message=msg.decode()
print('topic: ', topic,' Message réçu : ', message)
if message=='ON':
p.on()
if message=='OFF':
p.off()
client = MQTTClient(client_id="",server="public.mqtthq.com" ,user="" ,password="",ssl=False,port=1883)
client.set_callback(fonction_de_rappel)
client.connect()
client.subscribe(topic)
print('Connecté à : %s MQTT broker, abonné au topic : %s ' % (mqtt_server, topic))
while True:
new_message = client.check_msg()
NB:Si l'erreur "IndexError: list index out of rang" s'affiche, alors au lieu d'exécuter à partir de Thonny après téléversement des fichiers, appuyer simplement sur le bouton EN(Enable) de la carte ESP32 pour la redémarrer.
Remarque : On pourra ajouter une gestion des exceptions à notre script pour reinitialiser la carte en cas de non connexion au Broker :
try:
client.connect()
except (OSError,IndexError) as e:
print ('Erreur de conexion au Broker')
sleep(5)
machine.reset()
NB: Ne pas oublier d'ajouter import machine
Récupérer la température avec le capteur DHT11 et la consulter sur une application Android en utilisant le protocole MQTT.
On va utiliser un MQTT Broker public sur le cloud: www.mqtthq.com/client/
import dht
import network
from machine import Pin
from time import sleep
from umqtt.simple import MQTTClient
from network import *
import gc
gc.collect()
### connexion wifi ####
ssid = 'NOM_WIFI'
password = 'MOT_DE_PASSE_WIFI'
station = WLAN(STA_IF)
station.active(True)
station.connect(ssid, password)
while station.isconnected() == False:
pass
print(station.ifconfig())
########################
sleep(2)
def settimeout(duration):
pass
client = MQTTClient(client_id="",server="public.mqtthq.com" ,user="" ,password="",ssl=False,port=1883)
client.settimeout = settimeout
client.connect()
sensor = dht.DHT11(Pin(4))
while True:
sensor.measure()
temp = sensor.temperature()
print("Envoyer la température=",temp)
client.publish(b"maison/temperature", str(temp))
sleep(5)
NB:Si l'erreur "IndexError: list index out of rang" s'affiche, alors au lieu d'exécuter à partir de Thonny après téléversement des fichiers, appuyer simplement sur le bouton EN(Enable) de la carte ESP32 pour la redémarrer.
Pour afficher la température capturée et envoyée vers le MQTT Broker, on va utiliser une application android, Commencer par télécharger, par exemple : MQTT Terminal (https://play.google.com/store/apps/details?id=com.mightyit.mqttclientterminal), ou IoT MQTT Dashbord https://apksfull.com/iot-mqtt-dashboard/com.thn.iotmqttdashboard puis l'installer sur votre smartphone.
Pour IoT MQTT Dashboard : Une fois installée, ouvrir l'application, puis cliquer sur le + en bas à droite de l'écran pour créer une nouvelle connexion à un MQTT Broker, choisir un Client ID de votre choix puis un server: public.mqtthq.com et un port: 1883
Une fois la connexion créée, cliquer dessus pour s'abonner (Subscribe) à un topic pour voir les messages publiés. Choisir le topic maison/temperature .
NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône
Sources:
https://mqtt.org
https://www.youtube.com/watch?v=EIxdz-2rhLs
https://randomnerdtutorials.com/what-is-mqtt-and-how-it-works/
https://rntlab.com/question/how-to-use-cloud-mqtt-broker-with-esp32-using-async-mqtt-client-library/
http://embeddedlaboratory.blogspot.com/2018/01/getting-started-with-mqtt-using-python.html
https://stackoverflow.com/questions/49099911/micropython-paho-module-missing
https://randomnerdtutorials.com/micropython-mqtt-esp32-esp8266/
https://lecluseo.scenari-community.org/CircuitPython/co/g_mqtt_sub.html
https://autsoft.net/choosing-an-mqtt-broker-for-your-iot-project/
https://github.com/mqtt/mqtt.github.io/wiki/servers
https://github.com/mqtt/mqtt.org/wiki/brokers
https://www.hivemq.com/mqtt-essentials/
https://mntolia.com/10-free-public-private-mqtt-brokers-for-testing-prototyping/