|

Réception de messages avec ESP32 WebSerial

Dans cet article, nous allons apprendre comment recevoir des messages envoyés depuis l’interface WebSerial sur l’ESP32. Nous utiliserons le cœur Arduino pour programmer l’ESP32.

Dans ce tutoriel, nous allons apprendre comment gérer la réception de messages introduits dans l’interface WebSerial et envoyés à l’ESP32. Cela sera réalisé avec une fonction de rappel (callback), qui est exécutée à chaque fois que des données sont envoyées depuis WebSerial et nous donne accès à ces données. À titre d’illustration, notre fonction de traitement se contentera d’imprimer le contenu reçu sur l’interface série câblée. Dans un scénario d’application réelle, vous pouvez plutôt utiliser ces données à de nombreuses fins, telles que le contrôle d’un périphérique, par exemple.

Les tests présentés ci-dessous ont été réalisés sur une carte ESP32-E FireBeetle de DFRobot. La version du cœur Arduino utilisée était la 2.0.0 et la version de l’IDE Arduino était la 1.8.15, sous Windows 8.1. Le code a également été testé sur Platformio.

Le Code

La première chose que nous allons faire est de nous occuper de toutes les bibliothèques incluses. Nous aurons besoin des suivantes :

WiFi.h : Permet de connecter l’ESP32 à un réseau WiFi.
ESPAsyncWebServer.h : Permet de configurer un serveur web HTTP sur l’ESP32, qui sera utilisé en interne par la bibliothèque WebSerial.
WebSerial.h : Expose la fonctionnalité WebSerial. Notez que cela exposera une variable appelée WebSerial, qui est une instance de la classe WebSerialClass.

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <WebSerial.h>

Ensuite, nous allons définir deux variables globales pour contenir les informations d’identification du réseau WiFi (le nom du réseau et le mot de passe). Ci-dessous, j’utilise des espaces réservés que vous devez remplacer par les informations réelles de votre réseau WiFi.

const char* ssid = "NomDeVotreRéseau";
const char* password = "MotDePasseDeVotreRéseau";

Ensuite, nous allons créer un objet de la classe AsyncWebServer, que nous utiliserons pour configurer le serveur HTTP qui fonctionnera sur l’ESP32. Le constructeur de cette classe reçoit en argument le port sur lequel le serveur HTTP écoutera les requêtes entrantes. Comme d’habitude, nous utiliserons le port 80, qui correspond au port HTTP par défaut.

AsyncWebServer server(80);

Maintenant, nous allons passer à la mise en œuvre de la fonction de configuration Arduino. La première chose que nous ferons est d’ouvrir une connexion série câblée, afin que nous puissions ultérieurement afficher les données que nous avons reçues de WebSerial.

Serial.begin(115200);

Ensuite, nous allons connecter l’ESP32 au réseau WiFi. Notez que nous imprimons l’adresse IP attribuée à l’ESP32 sur le réseau local une fois que la connexion est établie. Nous aurons besoin de cette adresse IP pour accéder à la page WebSerial.

WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
    Serial.println("Impossible d'initialiser le WiFi");
    return;
}
Serial.println(WiFi.localIP());

Ensuite, nous initialiserons l’instance WebSerial en appelant la méthode begin. En tant qu’entrée de cette méthode, nous devrions passer l’adresse de notre objet AsyncWebServer.

WebSerial.begin(&server);

Ensuite, nous enregistrons la fonction de rappel qui gérera l’événement de réception de message WebSerial. Cela se fait en appelant la méthode msgCallback sur la variable externe WebSerial, en passant en entrée la fonction de rappel. Nous appellerons cette fonction handleMessage et vérifierons sa mise en œuvre plus tard.

WebSerial.msgCallback(handleMessage);

Pour finaliser la configuration Arduino, nous initialiserons le serveur HTTP asynchrone avec un appel à la méthode begin sur notre objet AsyncWebServer. À partir de ce moment, le serveur devrait être prêt à commencer à recevoir des requêtes entrantes.

La configuration Arduino complète, incluant déjà cet appel de méthode, peut être vue ci-dessous.

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("Impossible d'initialiser le WiFi");
        return;
    }
    Serial.println(WiFi.localIP());
    WebSerial.begin(&server);
    WebSerial.msgCallback(handleMessage);
    server.begin();
}

Étant donné que la réception du message sera basée sur une fonction de rappel et que nous n’avons aucune autre opération à effectuer, nous pouvons laisser la boucle principale Arduino vide.

void loop() {}

Enfin, nous analyserons la mise en œuvre de la fonction de rappel handleMessage. Notez que cette fonction doit respecter la signature définie ici :

La fonction renvoie void
La fonction reçoit un pointeur vers un tampon de données contenant le message et la longueur des données.

void handleMessage(uint8_t *data, size_t len){
    // implémentation de la fonction
}

Dans la mise en œuvre de la fonction, nous allons simplement itérer à travers tous les octets des données et les imprimer sur l’interface série câblée.

for(int i=0; i < len; i++){
   Serial.print((char)data[i]);
}

Serial.println();

La fonction de rappel complète est disponible ci-dessous.

void handleMessage(uint8_t *data, size_t len){
  for(int i=0; i < len; i++){
    Serial.print((char)data[i]);
  }
  Serial.println();
}

Le code complet peut être vu ci-dessous.

#include <WiFi.h>
#include <ESPAsyncWebServer.h>
#include <WebSerial.h>

const char* ssid = "NomDeVotreRéseau";
const char* password = "MotDePasseDeVotreRéseau";

Async

WebServer server(80);

void handleMessage(uint8_t *data, size_t len){
  for(int i=0; i < len; i++){
    Serial.print((char)data[i]);
  }
  Serial.println();
}

void setup() {
    Serial.begin(115200);
    WiFi.begin(ssid, password);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("Impossible d'initialiser le WiFi");
        return;
    }
    Serial.println(WiFi.localIP());
    WebSerial.begin(&server);
    WebSerial.msgCallback(handleMessage);
    server.begin();
}

void loop() {}

Tester le code

Pour tester le code, compilez-le simplement et téléchargez-le sur votre ESP32 à l’aide de l’outil de votre choix. Une fois la procédure terminée, ouvrez un outil de surveillance série et attendez que la connexion WiFi soit établie. Ensuite, l’adresse IP attribuée à l’ESP32 sur le réseau devrait être imprimée. Copiez-la.

Ensuite, ouvrez un navigateur web de votre choix et saisissez ce qui suit, en remplaçant YourESPIp par l’adresse IP que vous venez de copier.

http://YourESPIp/webserial

Vous devriez alors accéder à l’interface WebSerial. Dans la zone de texte, saisissez un contenu (comme indiqué ci-dessous dans la figure 1) et cliquez sur le bouton « Envoyer ».

Si vous accédez ensuite à l’outil de surveillance série que vous utilisez, vous devriez voir le message que vous avez envoyé depuis WebSerial imprimé, comme illustré ci-dessous dans la figure 2.

WebSerial message printed to the Serial port.
Figure 2 – Message WebSerial imprimé sur le port série. 
Tiré des tests sur Platformio.

A lire également

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *