Dans le dernier épisode de cette série, nous nous sommes intéressés pour la première fois à la carte Pretzel qui réunit un ATmega328 et une puce Wi-Fi ESP8266. J'ai connecté la carte Pretzel à un port USB de mon PC ; à l'aide de quelques commandes au clavier que l'ATmega328 s'est contenté de transmettre à l'ESP8266, j'ai pu piloter la puce Wi-Fi depuis l'émulateur de terminal sur le PC, me connecter sur mon réseau local sans fil (WLAN) et transmettre ainsi des chaînes de caractères sur mon intranet via TCP/IP.
 
Mais nous sommes un peu restés sur notre faim, un comble avec un carte Pretzel (voir l'introduction de l'épisode précédent). Il nous faut donc maintenant étendre cela aux services MQTT. La perspective de la création manuelle des commandes nécessaires et de leur saisie dans l'émulateur de terminal ne m'enchante guère. Heureusement, j'ai déjà écrit une bibliothèque minimale pour PC dans l'épisode 9 de la série. Elle permet d'assembler des chaînes de caractères pour les commandes MQTT CONNECT et PUBLISH puis de les envoyer à un courtier MQTT sur Internet pour les essais.
 
J'ai simplement adapté la routine de connexion à un serveur TCP en réseau
TCPClient_Connect(String IPAddressString, int Port)
 
ainsi que la routine d'envoi des données à ce serveur
TCPClient_Send(Byte[] data, int length, Boolean Answer)
 
de sorte que l'ESP8266 effectue juste le travail nécessaire en lieu et place de l'interface réseau intégrée. Ainsi, j'ai ensuite pu réutiliser à 100% les routines d'assemblage des commandes MQTT.
 
La carte Pretzel est devenue une sorte de dongle Wi-Fi pour mon PC. Le microprogramme de l'ATmega328 est toujours en première ligne : il transmet vaillamment à l'ESP8266 tous les caractères reçus du PC via un port COM virtuel et vice-versa. J'avais également dans mes tiroirs les routines C# nécessaires pour communiquer par l'interface série. J'avais cependant encore besoin d'un processus (thread) de lecture en continu des caractères entrants, afin de pouvoir faire afficher le retour de l'ESP8266 par le programme du PC. J'ai emprunté la plus grande partie du code à la documentation C#/.NET- officielle.
J'ai ensuite équipé mon programme PC de plusieurs boutons afin de déclencher différentes actions : d'une part pour réinitialiser l'ESP8266 et d'autre part pour la connexion au réseau sans fil de mon bureau. Pour le contrôle de l'ensemble, j''ai aussi défini un grand champ texte pour afficher sur le PC les messages retournés par l'ESP8266.
 
On voit le résultat de mes tentatives sur la copie d'écran. Avec mon « client MQTT minimaliste avec ESP8266 » il faut tout d'abord sélectionner (liste déroulante en haut à droite) le port COM que la carte Pretzel exploite pour se connecter au PC. Ensuite, il faut réinitialiser la puce Wi-Fi au moyen du bouton juste au dessous. Puis il faut taper le SSID et le mot de passe du réseau Wi-Fi dans les champs correspondants et actionner le bouton « WiFi Connect ». Dans la grande fenêtre de texte on reconnaîtra la commande AT et un peu plus bas la réponse de la puce Wi-Fi (en cas de réussite c'est juste « OK »).
 
Si tout a fonctionné jusque là, le bouton suivant permet d'entrer en communication réseau directement avec le serveur TCP qui fonctionne en courtier MQTT (dans mon cas le courtier HiveMQ). Ici une commande « CONNECT » suivie de « OK » signifie que la communication TCP/IP est établie.
 
Nous pouvons alors entrer dans le vif du sujet : MQTT. Grâce à la bibliothèque minimale, un appui sur le bouton « MQTT Connect », déclenche l'assemblage de la commande MQTT nécessaire et l'envoie au courtier de test via TCP/IP. Tout fonctionne comme déjà décrit dans l'épisode 9. Une seule vraie différence : c'est l'ESP8266 qui réalise la tâche réseau. La similitude des programmes ressort aussi dans le code source que l'on peut télécharger ci-dessous. Il suffit pour s'en convaincre de le comparer au code source du programme de l'épisode 9.
 
Après saisie d'un Topic et d'un texte, nous pouvons envoyer des messages au courtier MQTT d'essai. Un client MQTT abonné peut les recevoir et les afficher n'importe où dans le monde. Il est à noter qu'avec le courtier HiveMQ ainsi qu'avec le courtier test Mosquitto (déjà utilisé dans d'autres épisodes de cette série) l'adjonction des caractères « CrLf  » est permise. L'ESP8266 les ajoute d'ailleurs systématiquement à la fin des messages TCP/IP ; les courtiers mettent alors fin à la communication TCP. Il faut également indiquer le nombre exact de caractères de la chaîne MQTT dans la commande AT+CIPSEND.
 
Par ailleurs, au bout de deux minutes environ et si l'ESP8266 n'a rien reçu de plus à envoyer, il ferme la connexion TCP/IP (« CLOSED ») ; Il faudra alors ultérieurement rétablir la communicaton. Nous pourrions l'en empêcher, en adjoignant au programme du PC un compteur pour qu'il envoie un nouveau message MQTT toutes les minutes. Ce serait typiquement le cas pour un capteur de température publiant ses mesures via MQTT. Nous en reparlerons lors d'un prochain épisode de la série !