Algo.tn

IoT-MQTT

Le protocole MQTT

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.

led esp32
×

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.

led esp32
×

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:

Client MQTT:

On va utiliser un client web d'un Broker public : public.mqtthq.com https://mqtthq.com/client

client MQTT
×

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/ client mqtt

×

Client MQTT Android

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

Utilisation d'une application mobile pour publier sur le topic:

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.

IoT MQTT Dashboard

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:

bouton led esp32
×

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.

bouton led esp32
×

Puis choisir l'onglet PUBLISH pour publier un message sur un Topic.

bouton led esp32
×

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:

bouton led esp32
×

NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône connect

Mini-projet 1: Allumer une lampe led en utilisant le protocole MQTT

Commander une lampe LED par Internet en utilisant le protocole MQTT et une application android.

  1. Lancer le Broker public public.mqtthq.com puis créer le topic maison/bureau/lampe
  2. Programmer la carte esp32 pour se connecter au MQTT broker puis s'abonner Subscribe au topic maison/bureau/lampe pour recevoir les messages de ce dernier.
    • Si message = ON alors allumer la LED sur le pin 23
    • Si message = OFF alors éteindre la LED sur le pin 23
  3. Utiliser l'application Android IoT MQTT Dashboard pour publier (Publish) sur le topic maison/bureau/lampe le message ON/OFF par conséquent allumer ou éteindre la lampe LED.
led esp32
×

Programmation de la carte ESP32 (Réception des messages) :

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.

Code MicroPython :

En utilisant Thonny IDE:

main.py

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

Mini-projet 2: Récupérer la température en utilisant le protocole MQTT

Récupérer la température avec le capteur DHT11 et la consulter sur une application Android en utilisant le protocole MQTT.

DHT11 et MQTTt
×

Etapes:

  1. Se connecter à un MQTT Broker sur le cloud
  2. Programmer la carte esp32 (Client1 MQTT) pour se connecter au MQTT broker puis publier publish dans le topic maison/temperature un messages contenant la température capturée par le DHT11(capteur de température et d'humidité).
  3. Utiliser l'application Android IoT MQTT Dashboard pour consulter la température sur le topic maison/temperature .

Etape1: MQTT Broker:

On va utiliser un MQTT Broker public sur le cloud: www.mqtthq.com/client/

DHT11 et MQTTt
×

Etape 2: Programmation de la carte ESP32 (Client 1 MQTT) :

Code MicroPython :

En utilisant Thonny IDE:

main.py

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.

Etape 3: Utilisation d'une application mobile pour afficher la température:

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 .

bouton led esp32
×

NB:Pour se connecter/déconnecter , il suffit de cliquer sur l'icône connect

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/

Algo.tn ©