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.

ExempleStation 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éthodeLe 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.

1
import dht
2
import machine
3
import time
4
import network  # Si connexion dans ce script
5
import sys
6
import json
7
from umqtt.simple import MQTTClient
8
import ubinascii
9
10
# Connexion Wifi
11
# Supprimer cette partie si elle est
12
# faite automatiquement au demarrage de la carte
13
# dans le boot.py
14
############################
15
# Debut configuration Wifi #
16
############################
17
WIFI_SSID = "MON_WIFI"
18
WIFI_PASSWORD = "MON_PASSWD"
19
20
# turn off the WiFi Access Point
21
ap_if = network.WLAN(network.AP_IF)
22
ap_if.active(False)
23
24
# connect the device to the WiFi network
25
wifi = network.WLAN(network.STA_IF)
26
wifi.active(True)
27
wifi.connect(WIFI_SSID, WIFI_PASSWORD)
28
29
# wait until the device is connected to the WiFi network
30
MAX_ATTEMPTS = 20
31
attempt_count = 0
32
while not wifi.isconnected() and attempt_count < MAX_ATTEMPTS:
33
    attempt_count += 1
34
    time.sleep(1)
35
36
if attempt_count == MAX_ATTEMPTS:
37
    print("could not connect to the WiFi network")
38
    sys.exit()
39
print(wifi.ifconfig())
40
41
################################
42
# fin de la configuration Wifi #
43
################################
44
45
d = dht.DHT22(machine.Pin(14))  # Broche D5 sur Wemos D1
46
47
# parametres MQTTClient
48
AIO_SERVER = "io.adafruit.com"
49
AIO_USER = "MON_LOGIN"
50
AIO_APIKEY = "MA_CLE_IO_KEY"
51
CLIENT_ID = ubinascii.hexlify(machine.unique_id())
52
AIO_FEED = "MON_FEED"
53
54
client = MQTTClient(
55
    client_id=CLIENT_ID,
56
    server=AIO_SERVER,
57
    user=AIO_USER,
58
    password=AIO_APIKEY,
59
    ssl=False,
60
)
61
mqtt_feedname = "{:s}/feeds/{:s}".format(AIO_USER, AIO_FEED)
62
63
def mqtt_callback(topic, msg):
64
    """Cette fonction sera appelée à chaque fois qu'un message sera publié 
65
    dans un topic auquel on s'est abonné
66
    - topic : topic qui a reçu le message
67
    - msg : contenu du message"""
68
    print ("message recu: ", msg.decode())
69
    print ("topic: ", topic.decode())
70
71
try:
72
    client.connect()
73
except Exception as e:
74
    print("Connexion au serveur MQTT impossible : {}{}".format(type(e).__name__, e))
75
    sys.exit()
76
77
# On definit la fonction qui recoit les messages
78
client.set_callback(mqtt_callback)
79
# Abonnement au topic
80
client.subscribe(mqtt_feedname)
81
82
print("Ecoute du topic : ",mqtt_feedname)
83
while True:
84
    # appeler cette methode regiulierement dans la boucle principale
85
    client.check_msg()
86
    time.sleep(1)
87

ComplémentQuelques 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()