Accueil | ESP8266 - ESP32 | Client Web (communication) | ESP8266 (Client Web – Partie 1) : communication TCP/IP (exemples ESP8266WiFi et ESP866HTTPClient)

ESP8266 (Client Web – Partie 1) : communication TCP/IP (exemples ESP8266WiFi et ESP866HTTPClient)

Avec l’adaptation pour les modules ESP8266 des librairies Arduino WiFiClient (ESP8266WiFi) , HTTPClient (ESP8266HTTPClient) , il est très facile d’échanger des données avec un serveur domotique ou un service en ligne, de piloter le GPIO de l’ESP8266… Dans la série d’article précédente, nous avons vu comment mettre en place un serveur Web stockée dans le système de fichier FPIFFS de l’ESP82266. Ce tutoriel est le premier d’une nouvelle série d’articles consacrés à la communication avec un client ESP8266.

Dans ce premier tutoriel, nous allons découvrir les librairies ESP8266WiFi,  ESP8266HTTPClient et en bonus ESP8266WiFiMulti.

ESP8266WiFi / ESP8266wifi, la confusion !

Si vous débutez dans la programmation des ESP8266, vous avez sans doute rencontré ces deux librairies qui portent un nom très similaire sur internet. La première est la librairie “officielle” (ESP8266WiFi) installée en même temps que les cartes ESP8266. Il est livrée avec de nombreux exemples, notamment ceux proposés par Wemos pour accompagner ces cartes Wemos D1 mini et Wemos R2. Le dépôt GitHub se trouve ici. Comme beaucoup de librairie ESP8266 adaptées du code Arduino, il n’y a pas de documentation, à nous découvrir les fonctions à l’aide des exemples ou aller chercher dans les librairies d’origine https://www.google.com/#safe=on&q=wifi+site:http:%2F%2Fwww.arduino.cc .

Son homonyme, ESP8266wifi est une librairie équivalente développée par Jonas Ekstrand. Elle n’est pas disponible depuis le gestionnaire de bibliothèque, il faudra l’installer manuellement en décompressant le dépôt dans le répertoire libraries de l’IDE Arduino, puis en redémarrant celui-ci. La librairie de Jonas Ekstrand est beaucoup plus complète que la librairie originale. Disons qu’elle combine plusieurs fonctions en une seule librairie. Elle permet de gérer l’ESP8266 comme un point d’accès, de surveiller l’arriver de messages, de gérer la re-connexion automatique…

A vous de choisir celle qui correspond le mieux à vos besoins. Dans ce tutoriel, nous allons utiliser l’adaptation de la librairie Arduino ESP8266WiFi.

La librairie ESP8266WiFi

La librairie ESP8266WiFi s’installe en même temps que le support des cartes ESP8266. Si ce n’est pas le cas, vous pouvez l’installer directement depuis le gestionnaire de bibliothèques.

Exemple : un watchdog

Pour découvrir le fonctionnement de la librairie, le mieux est encore de passer par un petit exemple. On va se connecter au serveur de test (Node.js ou SocketTest) et lui envoyer le temps écoulé depuis le démarrage de l’ESP8266 (obtenu avec la fonction millis()) ainsi que l’adresse IP du module. On restera à l’écoute jusqu’à ce qu’on ait reçu une réponse du serveur (You are alive!).

Un watchdog peut être utile pour surveiller que le module est toujours en fonctionnent et envoyer une alerte. Pour cet exemple, j’ai adapté le code de l’exemple WiFiClient installé en même temps que la carte Wemos D1 R2 & mini.

On doit donc commencer par établir une connexion avec le réseau WiFi. C’est la classe WiFi.begin qui s’en charge.

On continue le déroulement du programme que lorsqu’une connexion a été établie. Attention, c’est un code parfaitement inadapté à une fonctionnement sur batterie. Dans ce cas, il est préférable de mettre un compteur et mettre en sommeil l’ESP pour recommencer plus tard après plusieurs tentatives infructueuses.

Maintenant qu’on dispose d’une connexion WiFi, on va envoyer à intervalle régulier un message au serveur. Pour cela, on doit créer un objet client qui se connectera au serveur.

On construit ensuite une chaine dans laquelle on va encoder les données envoyées au serveur. Ici le temps passé depuis le démarrage de l’ESP8266 ainsi que l’adresse IP de ce dernier.

Il ne reste plus qu’à envoyer le message au serveur

Si comme moi, vous trouvez que l’écriture de cette commande est difficile, nous allons voir comment améliorer ça juste après.

Voici le code complet du sketch.

Connexion sécurisée HTTPS : WiFiClientSecure

La sécurisation de la connexion HTTP n’est pas prise en charge nativement par la librairie ESP8266WiFi. Pour cela, il faut intégrer la librairie WiFiClientSecure.h. Si vous en avez besoin, voici un exemple disponible sur GitHub ainsi que la discussion qui traite du sujet.

La librairie ESP8266WiFiMulti

Avant de présenter la librairie ESP8266HTTPClent, nous allons parler de la librairie ESP8266WiFiMulti. L’objectif de cette librairie est de laisser l’ESP8266 choisir le réseau WiFi sur lequel se connecter en fonction de sa disponibilité et de la force du signal. Cette librairie est incluse avec la librairie ESP8266WiFi.

Elle est très simple à utiliser. On comme par créer un objet wifiMulti.

On ajoute les différents points d’accès dans une liste à l’aide de la classe wifiMulti.addAP()

On ouvre une connexion avec la classe run().

On dispose de plusieurs clés permettant de tester le bon fonctionnement de la connexion :

  • WL_CONNECTED : la connexion est établie
  • WL_NO_SSID_AVAIL : aucun point d’accès indiqué dans la liste n’est disponible
  • WL_CONNECT_FAILED : échec de connexion. Probablement que le mot de passe est mauvais ou un filtrage par adresse MAC a été mis en place sur le routeur.

Pour voir ce qui se passe, vous pouvez ajouter cette option dans le setup().

La librairie ESP8266HTTPClient

Comme vous avez pu voir dans l’exemple précédent, on envoi un message au serveur à l’aide de la fonction client.print() dans laquelle on passe une chaine de caractère qui contient la commande HTTP. C’est efficace mais pas forcément super sympa à utiliser surtout si on est pas un pro du Web. Pour faire quelque chose de “plus propre” et plus poussé, il existe la librairie ESP8266HTTPClient. C’est aussi une adaptation d’une librairie Arduino (ArduinoHTTPClient) pour l’ESP8266. Elle est disponible depuis le gestionnaire de bibliothèque de l’IDE Arduino.

On va donc créer un objet http au début du sketch

On construit l’url exactement de la même façon que précédemment.

Avant d’envoyer la requête on passe les paramètres à l’objet http comme ceci

On dispose maintenant de trois classes distincts correspond aux requêtes HTTP les plus classiques : GET (demande de données), POST (envoi de données) et PUT (envoi de fichier). Ici on va faire un requête GET pour simuler la réception d’une réponse du serveur

Chaque classe renvoi un code permettant de savoir si la requête à pu aboutir. Le code respecte la norme RFC7231 (source).

Il est donc très facile de savoir si le message a bien été reçu par le serveur. On récupère le contenu du message (payload) à l’aide de la classe http.getString().

Voici le code modifié basée. L’ESP8266 cherchera le meilleur réseau WiFi sur lequel se connecter. Durant la phase d’inactivité, le WiFi est coupé à l’aide de la classe WiFi.disconnect().

On peut attendre une éventuelle réponse du serveur. Si vos transmettez à un serveur domotique, il y a de grande change qu’il vous renvoi un status:OK, au minimum, vous devriez recevoir une réponse de code 200 signifiant que le message a correctement été réceptionné par le serveur. Vous pouvez imaginer d’autre traitements en fonction de la réponse : mettre dans un pile et recommencer ultérieurement, supprimer la mesure ou au contraire la stocker dans un journal, ajouter dans un journal l’événement et le message d’erreur (pour faciliter la mise au point), piloter le GPIO (faire clignoter une LED)…

Serveur de test Node.js pour communiquer avec l’ESP8266

Pour tester les différentes librairies, je vous propose de développer rapidement un petit serveur Node.js. Dans les prochains tutoriels, nous irons plus loin en mettant en place une communication complète avec quelques serveurs domotiques (Jeedom, Domoticz, Home Assistant). Si vous débutez avec Node.js, suivez ce tutoriel pour installer et découvrir Node.js

Pour ce serveur, vous aurez besoin d’installer les packages moment, express.

Ouvrez un éditeur de texte et créez un nouveau fichier appelé server.js en y collant ce code

Ouvrez le Terminal (ou PowerShell sous Windows). Placez vous dans le répertoire dans lequel vous avez enregistré le fichier server.js et démarrez le serveur avec la commande node server.js ou nodemon server.js (nodemon s’occupe de redémarrer le serveur à chaque modification des fichiers).

A chaque message reçu, le serveur récupère les données passées en paramètres et construit un message d’information qui est ensuite envoyé sur le Terminal.

serveur test communication tcp ip http esp8266wifi

SocketTest : un serveur de test pour

Si vous n’avez pas le courage de vous lancer avec Node.js, vous pouvez opter pour SocketTest qui est un petit programme qui démarre un serveur de test sur votre machine. Vous pouvez le récupérer sur Sourceforge ici. SocketTest fonctionne sur macOS (lancez SocketTest.jar), Windows (SocketTest.exe) et Linux (SocketTest.sh).

 sockettest sourceforge test esp8266wifi

Allez à l’onglet Server puis indiquez l’adresse ip de votre machine. Il faut absolument indiquer l’adresse ip de la machine sur lequel fonctionne SocketTest pour que ça fonctionne.

Ensuite démarrez le serveur en cliquant sur Start Listening. Vous allez recevoir vos premiers messages (en fonction de la fréquence d’envoi définie par la variable watchdog).

sockettest watchdog esp8266wifi

Vous pouvez envoyer une réponse à l’ESP8266 en le saisissant dans le champ message puis en cliquant sur Send. Par exemple ici, j’ai répondu OK qui apparait dans la console sous S: OK. Si vous avez ouvert le moniteur série sur l’IDE Arduino, vous pourrez voir le message reçu. Si vous ne répondez pas dans le temps prévu dans le programme (ici 5 secondes), vous aurez un message d’erreur (>>> Client Timeout !) avant que le client ne se déconnecte.

Remarque. Les réponses envoyées par SocketTest ne sont pas réceptionnées avec la librairie ESP8266HTTPClient. A creuser…

sockettst watchdog send response esp8266wifi client

Vous connaissez maintenant les 3 principales librairies permettant de faire communiquer un programme Arduino/ESP8266 en TCP/IP à l’aide de requêtes HTTP. Il nous reste maintenant à mettre en pratique tout ça sur des cas concrets. Nous verrons dans les prochains tutoriels comment envoyer simplement des mesures de température (ou n’importe quoi d’autre d’ailleurs) à Domoticz, Jeedom et Home Assistant.