Dans les épisodes précédents, nous avons créé plusieurs clients MQTT capables d'envoyer et de recevoir des données au travers de messages Internet. Pour cela, j'ai écrit un logiciel pour PC et Smartphone et j'ai également mis en œuvre deux cartes Wi‑Fi à microcontrôleur. Comme application de démonstration, nous avons envoyé des valeurs recueillies par un capteur et commuté une LED. Dans tous les cas, les messages étaient envoyés depuis l'un des clients MQTT de notre cru à l'autre, seul le courtier MQTT était « à l'extérieur », c'est-à-dire dans le nuage.

Après cette pause estivale, nous allons donc effectuer un bond en avant et enfin pouvoir tester une plate-forme capable d'enregistrer des données dans le nuage et de les afficher. Parmi divers portails, j'ai jeté mon dévolu sur AllThingsTalk, d'autant plus qu'il est aussi recommandé dans l'article GoNotify (Elektor 9/10 2017). Dans sa version Maker, la plate-forme peut être utilisée gratuitement après enregistrement. Elle est d'utilisation agréable, dotée de nombreuses fonctions utiles et, ce n'est pas le moindre, la documentation est bonne.

Voici une brève description qui résume tout ce que AllThingsTalk peut faire : après l'enregistrement, il est possible d'adjoindre à une page personnalisée des Devices (appareils) avec lesquels on peut échanger des données dans le monde entier. Il peut s'agir de cartes à microcontrôleur mais également de smartphones et naturellement d'ordinateurs monocartes comme le Raspberry Pi. À chaque Device, on peut alors attribuer plusieurs Assets (fonctions). Par exemple, dans le cas où une carte dispose d'un capteur de lumière, de température et d'humidité, on lui associe les trois Assets light, temperature et humidity. Pour chacune de ces grandeurs, il est alors possible d'envoyer au serveur AllThingsTalk, à différents intervalles, des mesures depuis les cartes. Le serveur peut les afficher sur une page que l'utilisateur aura créée lui-même. Cela fonctionne également dans la direction inverse : il est donc entre autres possible de commuter des broches de la carte depuis la page.
 

Mon premier appareil AllThingsTalk

L'enregistrement se résume à indiquer un nom d'utilisateur, une adresse de courriel et un mot de passe que l'on choisit soi-même. Pour aborder cet environnement en douceur, je conseille de choisir une carte ou un kit Internet directement pris en charge ; je souhaitais cependant pouvoir réutiliser le matériel du dernier épisode. Pour connecter un nouvel appareil (+ Connect a Device) j'ai donc choisi WIFI/LAN devices puis Your own (le vôtre). Sur la nouvelle page du nouvel appareil, que j'ai baptisé MyJourneyIoT_Sensor, j'ai attribué une fonction (Asset) temperature (voir la copie d'écran). Je devais ensuite écrire mon propre microprogramme (firmware), mais cela n'a pas été aussi difficile qu'il y paraissait à première vue. En effet, comme vous vous en doutez, AllThingsTalk met un courtier MQTT à disposition. Ma carte peut communiquer avec lui en tant que client MQTT, pour transmettre à la plateforme du nuage des messages contenant des mesures.

MQTT est un protocole relativement simple, et j'avais déjà une petite bibliothèque sous la main (écrite lors des épisodes précédents). Pour être plus précis, je devais réussir à envoyer les bons octets au serveur AllThingsTalk pour une requête MQTT-CONNECT et un message MQTT-PUBLISH. Après avoir un peu étudié la documentation et fait quelques essais, je m'en suis sorti :
  1. Tout d'abord, il faut se connecter via TCP/IP avec le courtier MQTT AllThingsTalk à l'adresse api.allthingstalk.io, Port 1883.
  2. Ensuite, il faut envoyer la requête CONNECT. Pour l'identifiant MQTT Client ID, il faut indiquer celui de l'appareil concerné, le Device ID. La dernière partie de l'URL de la page de l'appareil constitue ce Device ID ; pour moi, il comprenait 23 caractères. En plus, dans les octets CONNECT, il faut ajouter le nom d'utilisateur (cela ne faisait pas encore partie de ma bibliothèque MQTT, voir ci-dessous). Comme nom d'utilisateur, il faut prendre le Device Token, qu'AllThingsTalk fabrique pour chaque nouvel appareil afin de l'identifier. Il se trouve sur la page de l'appareil à la rubrique Settings (réglages). Différentes bibliothèques MQTT exigent d'envoyer un mot de passe en même temps que le nom de l'utilisateur. AllThingsTalk n'attend cependant aucun mot de passe de sorte que l'on peut par exemple choisir quelque chose de simple comme « abc ».
  3. Pour transmettre une mesure, il faut envoyer un message PUBLISH qui stipule toujours le même sujet (Topic) et les données elles-mêmes (Payload). Le Topic est constitué comme détaillé ci-dessous :
    Topic = "device/" + Device ID + "/asset/" + Asset Name + "/state"
    Pour moi l'Asset Name serait « temperature ».
    En ce qui concerne les données Payload, pour transmettre une mesure en virgule flottante, il faut avoir défini le type de l'Asset comme « number ». Si on veut envoyer la valeur 10,0, la charge utile (Payload) doit être constituée de la chaîne de caractères suivante :
    {"value": 10.0}
 
Mesures du capteur dans le nuage
Il me restait à tester tout cela dans une expérience simple. Comme déjà évoqué, j'ai utilisé le matériel du dernier épisode, à savoir le DevKitC ESP32, sur une petite plaque d'essai avec une LED RGB connectée. Comme base de départ du microprogramme, j'ai repris le croquis Arduino de l'épisode précédent (les bibliothèques rudimentaires TCP/IP et MQTT). Pour commencer, j'ai étoffé le passage de paramètres de la fonction
 
int MQTTClient_Connect(String clientid)
 
comme suit :
 
int MQTTClient_Connect(String clientid, String username, String password)

Cette fonction peut également être utilisée pour les applications. Dans celles-ci (comme dans les épisodes précédents), la requête CONNECT ne doit contenir aucun Username/Password, le Username étant simplement une chaîne vide.
 
La fonction Setup reste identique : l'ESP32 se connecte sur le Wi-Fi local, et la LED verte s'allume.
Dans la fonction Loop, au lieu de la fonction ConnectAndSubscribeToTopic(), nous appelons maintenant ConnectToATT(). La carte se connecte ici au courtier AllThingsTalk via TCP/IP, et envoie ensuite la requête CONNECT avec les données présentées ci-dessus.
 
Pour une démo, il me suffisait d'envoyer une mesure effectuée par un capteur de température virtuel. Pour produire des valeurs, j'ai utilisé un compteur de 10 à 40 lancé de manière cyclique. La fonction
 
void SendSensorDateToATT(byte SensorDate)
 
est exécutée toutes les secondes. Le Topic et la Payload sont élaborés comme décrit ci-dessus et pour finir, la fonction
 
MQTTClient_Publish(ATT_SensorTopic, MQTTClient_PayloadBuffer, Slength);
 
est appelée pour envoyer les octets PUBLISH.

Youpi ! Ça marche (voir la copie d'écran). AllThingsTalk permet également de visualiser les mesures (diffusées) dans un diagramme, ce que j'ai également essayé.

Si vous avez un kit DevKitC ESP32, (disponible dans l'e-choppe), vous pourrez essayer tout ça immédiatement. Téléchargez le croquis Arduino et comparez d'abord le code avec le croquis de l'épisode précédent. Ensuite, outre votre SSID Wi-Fi et votre mot de passe Wi-Fi (comme dans l'épisode précédent), ajoutez également dans le code du croquis votre Device ID, le Device Token et un nom d'Asset de votre compte personnel AllThingsTalk, compilez le tout et transférez-le dans la carte.
Avec un peu d'expérience, vous n'aurez aucune difficulté à adapter le tout au capteur de votre choix que vous aurez raccordé à la carte ESP32.
 
La suite au prochain épisode !