S'abonner à un flux d'information
A présent nous allons voir comment nous abonner à un Feed de manière à recevoir les informations en provenance d'autres objets connectés.
Exemple : Station météo
Pour reprendre l'exemple précédent : nous avons un capteur de température qui publie ses informations via MQTT sur un broker (adafruit). Il peut être maintenant intéressant d'avoir d'autres objets qui vont être à l'écoute de ce fil d'information pour les afficher (objet posé sur un meuble qui affiche la température extérieure relevée par l'autre dispositif) ou pour actionner des mécanismes en fonction de la température (actionner un moteur pour aérer lorsque la température extérieure dépasse un certain niveau par exemple).
C'est ce que nous allons voir dans cette partie : comment s'abonner à un fil d'information MQTT pour recevoir les informations qui y circulent.
Méthode : Le programme
Les champs indispensables à renseigner sont
AIO_USER : votre nom d'utilisateur sur le site io.adafruit.com
AIO_APIKEY : Votre clé IO_KEY que vous avez noté précédemment
AIO_FEED : Le nom du Feed que vous avez créé pour accueillir les données récoltées par le capteur.
import dht
import machine
import time
import network # Si connexion dans ce script
import sys
import json
from umqtt.simple import MQTTClient
import ubinascii
# Connexion Wifi
# Supprimer cette partie si elle est
# faite automatiquement au demarrage de la carte
# dans le boot.py
############################
# Debut configuration Wifi #
############################
WIFI_SSID = "MON_WIFI"
WIFI_PASSWORD = "MON_PASSWD"
# turn off the WiFi Access Point
ap_if = network.WLAN(network.AP_IF)
ap_if.active(False)
# connect the device to the WiFi network
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
# wait until the device is connected to the WiFi network
MAX_ATTEMPTS = 20
attempt_count = 0
while not wifi.isconnected() and attempt_count < MAX_ATTEMPTS:
attempt_count += 1
time.sleep(1)
if attempt_count == MAX_ATTEMPTS:
print("could not connect to the WiFi network")
sys.exit()
print(wifi.ifconfig())
################################
# fin de la configuration Wifi #
################################
d = dht.DHT22(machine.Pin(14)) # Broche D5 sur Wemos D1
# parametres MQTTClient
AIO_SERVER = "io.adafruit.com"
AIO_USER = "MON_LOGIN"
AIO_APIKEY = "MA_CLE_IO_KEY"
CLIENT_ID = ubinascii.hexlify(machine.unique_id())
AIO_FEED = "MON_FEED"
client = MQTTClient(
client_id=CLIENT_ID,
server=AIO_SERVER,
user=AIO_USER,
password=AIO_APIKEY,
ssl=False,
)
mqtt_feedname = "{:s}/feeds/{:s}".format(AIO_USER, AIO_FEED)
def mqtt_callback(topic, msg):
"""Cette fonction sera appelée à chaque fois qu'un message sera publié
dans un topic auquel on s'est abonné
- topic : topic qui a reçu le message
- msg : contenu du message"""
print ("message recu: ", msg.decode())
print ("topic: ", topic.decode())
try:
client.connect()
except Exception as e:
print("Connexion au serveur MQTT impossible : {}{}".format(type(e).__name__, e))
sys.exit()
# On definit la fonction qui recoit les messages
client.set_callback(mqtt_callback)
# Abonnement au topic
client.subscribe(mqtt_feedname)
print("Ecoute du topic : ",mqtt_feedname)
while True:
# appeler cette methode regiulierement dans la boucle principale
client.check_msg()
time.sleep(1)
Complément : Quelques explications
Le principe est le suivant : pour récupérer les informations circulant dans un certain topic, on s'abonne à ce topic. Cela est réalisé par la commande
client.subscribe(mqtt_feedname)
La ligne client.set_callback(mqtt_callback)
permet d'indiquer que la fonction mqtt_callback
doit être appelée lorsqu'un message arrive.
Lorsqu'une information est disponible sur un topic auquel on est abonné, la fonction python mqtt_callback
est donc appelée. Ses paramètres topic et msg permettent d'accéder au topic et au contenu du message. L'information topic est importante car il est possible de s'abonner à plusieurs topic, mais ce sera toujours la même fonction mqtt_callback
qui sera appelée. Grâce au contenu de cette variable topic, on peut savoir de quel capteur provient l'information reçue.
Pour finir, la boucle principale doit vérifier régulièrement s'il y a de nouveaux messages arrivés. Cela se fait en insérant en début de boucle
client.check_msg()