Esp8266 udp server
Introduction
Soyez sûr de comprendre la section sur comment écrire un sketch avant de poursuivre. Le code ci-dessous fait référence à des parties bien spécifiques, détaillées et expliquées dans la section suscitée. De plus, il est impératif d'avoir configuré la puce comme client WiFi ! |
Dans cet exemple, nous allons créer un serveur UDP qui va écouter les messages en unicast et multicast
Connexion au réseau
Commençons par nous connecter à un réseau en utilisant le DHCP :
#include <ESP8266WiFi.h>
const char ssid[] = "e900";
const char password[] = "********";
void setup() {
// on démarre le port série
Serial.begin(115200);
// On attend "un peu" que le buffer soit prêt
delay(10);
// On efface la configuration précédente
WiFi.disconnect(true);
// Initialisation de la connection
WiFi.begin(ssid, password);
// Test pour déterminer quand la connection est prete
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
// Affichage des informations
Serial.print("\nConnecte a ");
Serial.print(ssid);
Serial.print(" avec l'ip ");
Serial.println(WiFi.localIP());
}
void loop() {
}
Le code précédent vous donne le résultat suivant sur le port série :
Connecte a e900 avec l'ip 192.168.1.188
Serveur UDP unicast
Création du serveur
Nous allons maintenant ajouter la partie écoute en UDP.
Dans la partie des imports ajoutez la ligne suivante :
#include <WiFiUDP.h>
Dans la partie des variables statiques ajoutez les lignes suivantes :
// Port d'écoute UDP
const uint16_t PORT = 4321;
// Taille du tampon de réception
const uint16_t BUFFER_SIZE = 512;
// Tampon de réception
char buffer[BUFFER_SIZE];
// L'instance du serveur UDP
WiFiUDP udp;
A la fin de la fonction setup() nous allons ajouter la ligne suivante :
// Démarrage de l'écoute
udp.begin(PORT);
Serial.print("Démarrage de l'ecoute sur le port ");
Serial.println(PORT);
Récupération et affichage des paquets
Pour récupérer et afficher le contenu du paquet, nous allons créer une fonction :
void readPacket() {
uint16_t len = udp.parsePacket();
Serial.print("Paquet de ");
Serial.print(len);
Serial.print(" octets recu de ");
Serial.print(udp.remoteIP());
Serial.print(":");
Serial.print(udp.remotePort());
Serial.print(" contenant '");
// Mise en tampon du paquet
udp.read(buffer, len);
// Affichage du contenu du paquet
for (int i = 1; i <= len; i++) {
Serial.print(buffer[i - 1]);
}
Serial.println("'");
}
Que nous allons appeler dans la fonction loop():
void loop() {
if (udp.available() > 0) {
readPacket();
}
}
Il est désormais possible, en utilisant un logiciel comme Packet Sender d'envoyer un paquet à notre ESP:
Lorsque vous appuyer sur send, vous devriez voir le message suivant s'afficher dans la console :
Paquet de 11 octets recu de 192.168.1.1:62971 contenant 'Hello World'
Envoie d'un paquet UDP
Maintenant que nous recevons les paquets, il faudrait que nous puissions répondre ! Pour cela nous allons créer la fonction suivante :
void sendPacket(const char content[], IPAddress ip, uint16_t port) {
udp.beginPacket(ip, port);
udp.write(content);
udp.endPacket();
}
Pour créer un serveur echo, après la ligne:
readPacket();
Il nous suffit d'ajouter:
sendPacket(buffer, udp.remoteIP(), udp.remotePort());
On a maintenant une réponse de l'ESP:
Serveur UDP multicast
Pour commencer, nous allons ajouter dans la partie des variables statiques les lignes suivantes :
// Adresse IP multicast
const IPAddress IP_MCAST(239, 0, 0, 50);
Ensuite, dans la fonction setup(), nous allons remplacer les lignes suivantes :
// Démarrage de l'écoute
udp.begin(PORT);
Serial.print("Démarrage de l'ecoute sur le port ");
Serial.println(PORT);
par les lignes :
// Démarrage de l'écoute en multicast
udp.beginMulticast(WiFi.localIP(), IP_MCAST, PORT);
Serial.print("Demarrage de l'ecoute sur les adresses ");
Serial.print(WiFi.localIP());
Serial.print(" et ");
Serial.print(IP_MCAST);
Serial.print(" sur le port ");
Serial.println(PORT);