Différences entre versions de « Esp8266 wifi »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Ligne 142 : Ligne 142 :
 
= Programmation événementielle =
 
= Programmation événementielle =
 
Il est possible de définir une [https://fr.wikipedia.org/wiki/Fonction_de_rappel fonction de callback] qui sera appelée lorsqu'un événements arrive. Les événements possibles sont les suivants :
 
Il est possible de définir une [https://fr.wikipedia.org/wiki/Fonction_de_rappel fonction de callback] qui sera appelée lorsqu'un événements arrive. Les événements possibles sont les suivants :
*
+
<div align="center">
*
+
{|class="wikitable" width="85%"
*
+
! Événement !! Description !! Mode
*
+
|-valign=top
*
+
||AP
*
+
||WIFI_EVENT_MAX
*
+
||Nombre maximum de clients atteint
*
+
|-valign=top
*
+
||AP / client
 +
||WIFI_EVENT_MODE_CHANGE
 +
||Changement de mode de connexion
 +
|-valign=top
 +
||AP
 +
||WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED
 +
||Réception d'une requête ''probe'' (découverte des clients WiFi)
 +
|-valign=top
 +
||AP
 +
||WIFI_EVENT_SOFTAPMODE_STACONNECTED
 +
||Connexion d'un client
 +
|-valign=top
 +
||client
 +
||WIFI_EVENT_SOFTAPMODE_STADISCONNECTED
 +
||Déconnexion d'un client
 +
|-valign=top
 +
||client
 +
||WIFI_EVENT_STAMODE_AUTHMODE_CHANGE
 +
||Changement du mode d'authentification
 +
|-valign=top
 +
||client
 +
||WIFI_EVENT_STAMODE_CONNECTED
 +
||Connexion au réseau réussie
 +
|-valign=top
 +
||client
 +
||WIFI_EVENT_STAMODE_DHCP_TIMEOUT
 +
||Configuration DHCP non reçue
 +
|-valign=top
 +
||client
 +
||WIFI_EVENT_STAMODE_GOT_IP
 +
||Configuration OSI 3 reçue
 +
|-valign=top
 +
||client
 +
||WIFI_EVENT_STAMODE_DISCONNECTED
 +
||Déconnexion du réseau
 +
|}
 +
</div>
 +
Pour activer la gestion événementiel, après la ligne :
 +
<source lang="c">
 +
WiFi.disconnect(true);
 +
</source>
 +
ajoutez :
 +
<source lang="c">
 +
WiFi.onEvent(handleEvent);
 +
</source>
 +
Il ne nous reste plus qu'à ajouter la fonction suivante :
 +
<source lang="c">
 +
void handleEvent(WiFiEvent_t event){
 +
Serial.printf("WiFi event %d received\n", event);
 +
}
 +
</source>
 +
Seul le contenu de la fonction va changer en fonction du rôle (client ou AP).
 +
==AP==
 +
Voici un le contenu de la fonction handleEvent:
 +
<source lang="c">
 +
void handleEvent(WiFiEvent_t event){
 +
Serial.printf("WiFi event %d received\n", event);
 +
if(event == WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED){
 +
Serial.println("Requete probe recue !");
 +
}else if(event == WIFI_EVENT_SOFTAPMODE_STACONNECTED){
 +
Serial.println("Client connecte !");
 +
}else if(event == WIFI_EVENT_SOFTAPMODE_STADISCONNECTED){
 +
Serial.println("Client deconnecte !");
 +
}
 +
}
 +
</source>
 +
Le résultat sera le suivant :
 +
<pre>
 +
Demarrage du point d'acces...
 +
Adresse MAC: 2E:3A:E8:17:2C:A7
 +
Adresse IP: 192.168.10.1
 +
WiFi event 7 received
 +
Requete probe recue !
 +
WiFi event 5 received
 +
Client connecte !
 +
WiFi event 6 received
 +
Client deconnecte !
 +
</pre>

Version du 17 janvier 2018 à 12:39

Introduction

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.

La puce ESP8266 peut se configurer en point d'accès, en client WiFi ou les deux en même temps.

Client WiFi

Commençons par nous connecter à un réseau en utilisant le DHCP :

#include <ESP8266WiFi.h>

const char* ssid = "CAMPUSCD-CROIXVERTE2";
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);
	Serial.println();
	Serial.print("Connexion a ");
	Serial.println(ssid);
	// Initialisation de la connection
	WiFi.begin(ssid, password);
	// Test pour déterminer quand la connection est prete
	while (WiFi.status() != WL_CONNECTED) {
		delay(500);
		Serial.print(".");
	}
	// Affichage des informations
	Serial.println("");
	Serial.println(" connecte");
	Serial.print("Adresse IP: ");
	Serial.println(WiFi.localIP());
	Serial.print("Adresse MAC: ");
	Serial.println(WiFi.macAddress());
	Serial.print("Masque : ");
	Serial.println(WiFi.subnetMask());
	Serial.print("Passerelle : ");
	Serial.println(WiFi.gatewayIP());
	Serial.print("RSSI (force du signal): ");
	Serial.println(WiFi.RSSI());
	Serial.print("Canal: ");
	Serial.println(WiFi.channel());
}

Le code précédent vous donne le résultat suivant sur le port série :

Connexion a CAMPUSCD-CROIXVERTE2.. connecte
Adresse MAC: 2E:3A:E8:17:2C:A7
Adresse IP: 192.168.52.85
Masque : 255.255.252.0
Passerelle : 192.168.55.250
RSSI (force du signal): -67
Canal: 6

Maintenant que nous connaissons les paramètres données par le réseau, essayons de nous y connecter de manière statique. Dans la partie des variables statiques ajoutez les lignes suivantes :

IPAddress ip(192, 168, 52, 85);
IPAddress dns(192, 168, 55, 250);
IPAddress gw(192, 168, 55, 250);
IPAddress mask(255, 255, 252, 0);

Avant la ligne :

WiFi.begin(ssid, password);

Insérez les lignes :

// Application de la configuration de niveau 3 OSI
WiFi.config(ip, gw, mask, dns);

La connexion devrait être quasiment instantanée !

Point d'accès

Pour mettre en place un point d'accès, rien de plus simple :

#include <ESP8266WiFi.h>

const char *ssid = "tala";
const char *password = "informatique";

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);
	Serial.println();
	Serial.println("Demarrage du point d'acces...");
	// Initialisation du point d'accès
	WiFi.softAP(ssid, password);
	// Réglage de la puissance (0dBm < x < 20dBm)
	WiFi.setOutputPower(5);
	// Affichage de l'adresse IP
	Serial.print("Adresse MAC: ");
	Serial.println(WiFi.softAPmacAddress());
	Serial.print("Adresse IP: ");
	Serial.println(WiFi.softAPIP());
}

void loop() {
}

Le code précédent vous donne le résultat suivant sur le port série :

Demarrage du point d'acces...
Adresse MAC: 2E:3A:E8:17:2C:A7
Adresse IP: 192.168.4.1

Il est possible de modifier certain paramètres de niveau 3 OSI. Dans la partie des variables statiques ajoutez les lignes suivantes :

IPAddress ip(192, 168, 10, 1);
IPAddress gw(192, 168, 10, 254);
IPAddress mask(255, 255, 252, 0);

Avant la ligne :

WiFi.softAP(ssid, password);

Insérez les lignes :

// Application de la configuration de niveau 3 OSI
WiFi.softAPConfig(ip, gw, mask);

La sorite console doit afficher :

Demarrage du point d'acces... 
Adresse MAC: 2E:3A:E8:17:2C:A7
Adresse IP: 192.168.10.1

Lorsque vous utilisez l'ESP comme point d'accès, un serveur DHCP fournira automatiquement la configuration de niveau 3 OSI.

Programmation événementielle

Il est possible de définir une fonction de callback qui sera appelée lorsqu'un événements arrive. Les événements possibles sont les suivants :

Événement Description Mode
AP WIFI_EVENT_MAX Nombre maximum de clients atteint
AP / client WIFI_EVENT_MODE_CHANGE Changement de mode de connexion
AP WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED Réception d'une requête probe (découverte des clients WiFi)
AP WIFI_EVENT_SOFTAPMODE_STACONNECTED Connexion d'un client
client WIFI_EVENT_SOFTAPMODE_STADISCONNECTED Déconnexion d'un client
client WIFI_EVENT_STAMODE_AUTHMODE_CHANGE Changement du mode d'authentification
client WIFI_EVENT_STAMODE_CONNECTED Connexion au réseau réussie
client WIFI_EVENT_STAMODE_DHCP_TIMEOUT Configuration DHCP non reçue
client WIFI_EVENT_STAMODE_GOT_IP Configuration OSI 3 reçue
client WIFI_EVENT_STAMODE_DISCONNECTED Déconnexion du réseau

Pour activer la gestion événementiel, après la ligne :

WiFi.disconnect(true);

ajoutez :

WiFi.onEvent(handleEvent);

Il ne nous reste plus qu'à ajouter la fonction suivante :

void handleEvent(WiFiEvent_t event){
	Serial.printf("WiFi event %d received\n", event);
}

Seul le contenu de la fonction va changer en fonction du rôle (client ou AP).

AP

Voici un le contenu de la fonction handleEvent:

void handleEvent(WiFiEvent_t event){
	Serial.printf("WiFi event %d received\n", event);
	if(event == WIFI_EVENT_SOFTAPMODE_PROBEREQRECVED){
		Serial.println("Requete probe recue !");
	}else if(event == WIFI_EVENT_SOFTAPMODE_STACONNECTED){
		Serial.println("Client connecte !");
	}else if(event == WIFI_EVENT_SOFTAPMODE_STADISCONNECTED){
		Serial.println("Client deconnecte !");
	}
}

Le résultat sera le suivant :

Demarrage du point d'acces... 
Adresse MAC: 2E:3A:E8:17:2C:A7 
Adresse IP: 192.168.10.1
WiFi event 7 received
Requete probe recue !
WiFi event 5 received
Client connecte !
WiFi event 6 received
Client deconnecte !