Esp8266 udp server

De The Linux Craftsman
Aller à la navigation Aller à la recherche

Introduction

Warning manual.jpg

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.available();
	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.parsePacket() > 0) {
		readPacket();
	}
}

Il est désormais possible, en utilisant un logiciel comme Packet Sender d'envoyer un paquet à notre ESP:

Send packet udp esp unicast.png

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:

Send packet udp esp unicast response.png

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);