Différences entre versions de « Esp8266 wifi »

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Ligne 147 : Ligne 147 :
 
|-valign=top
 
|-valign=top
 
||AP
 
||AP
||WIFI_EVENT_MAX
+
||WiFi.onSoftAPModeStationConnected(<function>)
||Nombre maximum de clients atteint
+
||Connexion d'un client
|-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
 
|-valign=top
 
||AP
 
||AP
||WIFI_EVENT_SOFTAPMODE_STACONNECTED
+
||WiFi.onSoftAPModeStationDisconnected(<function>)
||Connexion d'un client
 
|-valign=top
 
||client
 
||WIFI_EVENT_SOFTAPMODE_STADISCONNECTED
 
 
||Déconnexion d'un client
 
||Déconnexion d'un client
 
|-valign=top
 
|-valign=top
 
||client
 
||client
||WIFI_EVENT_STAMODE_AUTHMODE_CHANGE
+
||WiFi.onStationModeAuthModeChanged(<function>)
 
||Changement du mode d'authentification
 
||Changement du mode d'authentification
 
|-valign=top
 
|-valign=top
 
||client
 
||client
||WIFI_EVENT_STAMODE_CONNECTED
+
||WiFi.onStationModeConnected(<function>)
 
||Connexion au réseau réussie
 
||Connexion au réseau réussie
 
|-valign=top
 
|-valign=top
 
||client
 
||client
||WIFI_EVENT_STAMODE_DHCP_TIMEOUT
+
||WiFi.onStationModeDHCPTimeout(<function>)
 
||Configuration DHCP non reçue
 
||Configuration DHCP non reçue
 
|-valign=top
 
|-valign=top
 
||client
 
||client
||WIFI_EVENT_STAMODE_GOT_IP
+
||WiFi.onStationModeGotIP(<function>)
 
||Configuration OSI 3 reçue
 
||Configuration OSI 3 reçue
 
|-valign=top
 
|-valign=top
 
||client
 
||client
||WIFI_EVENT_STAMODE_DISCONNECTED
+
||WiFi.onStationModeDisconnected(<function>)
 
||Déconnexion du réseau
 
||Déconnexion du réseau
 
|}
 
|}
 
</div>
 
</div>
Pour activer la gestion événementiel, après la ligne :
+
==AP==
 +
Pour gérer les événements, il faut créer un ''handler'' qui va se charger d'appeler la bonne fonction. Dans la partie des variables statiques ajoutez les lignes suivantes :
 +
<source lang="c">
 +
WiFiEventHandler stationConnectedHandler;
 +
WiFiEventHandler stationDisconnectedHandler;
 +
</source>
 +
Pour spécifier les fonctions à exécuter, après la ligne :
 
<source lang="c">
 
<source lang="c">
 
WiFi.disconnect(true);
 
WiFi.disconnect(true);
Ligne 193 : Ligne 187 :
 
ajoutez :
 
ajoutez :
 
<source lang="c">
 
<source lang="c">
WiFi.onEvent(handleEvent);
+
// Gestion des événements
 +
WiFi.onSoftAPModeStationConnected(onConnect);
 +
WiFi.onSoftAPModeStationDisconnected(onDisconnect);
 
</source>
 
</source>
Il ne nous reste plus qu'à ajouter la fonction suivante :
+
Il ne nous reste plus qu'à ajouter les fonctions suivantes :
 
<source lang="c">
 
<source lang="c">
void handleEvent(WiFiEvent_t event){
+
/**
Serial.printf("WiFi event %d received\n", event);
+
* Gestion des connexions
 +
*/
 +
void onConnect(const WiFiEventSoftAPModeStationConnected& evt){
 +
Serial.println("client connecte\n");
 +
Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x", evt.mac[0], evt.mac[1], evt.mac[2], evt.mac[3], evt.mac[4], evt.mac[5]);
 
}
 
}
</source>
+
 
Seul le contenu de la fonction va changer en fonction du rôle (client ou AP).
+
/**
==AP==
+
* Gestion des déconnexions
Voici un le contenu de la fonction handleEvent:
+
*/
<source lang="c">
+
void onDisconnect(const WiFiEventSoftAPModeStationDisconnected& evt){
void handleEvent(WiFiEvent_t event){
+
Serial.println("client deconnecte\n");
Serial.printf("WiFi event %d received\n", event);
+
Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x", evt.mac[0], evt.mac[1], evt.mac[2], evt.mac[3], evt.mac[4], evt.mac[5]);
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>
 
</source>
Ligne 221 : Ligne 214 :
 
Adresse MAC: 2E:3A:E8:17:2C:A7  
 
Adresse MAC: 2E:3A:E8:17:2C:A7  
 
Adresse IP: 192.168.10.1
 
Adresse IP: 192.168.10.1
WiFi event 7 received
+
client connecte: d8:eb:97:19:7b:55
Requete probe recue !
+
client deconnecte: d8:eb:97:19:7b:55
WiFi event 5 received
 
Client connecte !
 
WiFi event 6 received
 
Client deconnecte !
 
 
</pre>
 
</pre>

Version du 17 janvier 2018 à 23:14

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.onSoftAPModeStationConnected(<function>) Connexion d'un client
AP WiFi.onSoftAPModeStationDisconnected(<function>) Déconnexion d'un client
client WiFi.onStationModeAuthModeChanged(<function>) Changement du mode d'authentification
client WiFi.onStationModeConnected(<function>) Connexion au réseau réussie
client WiFi.onStationModeDHCPTimeout(<function>) Configuration DHCP non reçue
client WiFi.onStationModeGotIP(<function>) Configuration OSI 3 reçue
client WiFi.onStationModeDisconnected(<function>) Déconnexion du réseau

AP

Pour gérer les événements, il faut créer un handler qui va se charger d'appeler la bonne fonction. Dans la partie des variables statiques ajoutez les lignes suivantes :

WiFiEventHandler stationConnectedHandler;
WiFiEventHandler stationDisconnectedHandler;

Pour spécifier les fonctions à exécuter, après la ligne :

WiFi.disconnect(true);

ajoutez :

// Gestion des événements
WiFi.onSoftAPModeStationConnected(onConnect);
WiFi.onSoftAPModeStationDisconnected(onDisconnect);

Il ne nous reste plus qu'à ajouter les fonctions suivantes :

/**
 * Gestion des connexions
 */
void onConnect(const WiFiEventSoftAPModeStationConnected& evt){
	Serial.println("client connecte\n");
	Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x", evt.mac[0], evt.mac[1], evt.mac[2], evt.mac[3], evt.mac[4], evt.mac[5]);
}

/**
 * Gestion des déconnexions
 */
void onDisconnect(const WiFiEventSoftAPModeStationDisconnected& evt){
	Serial.println("client deconnecte\n");
	Serial.printf("%02x:%02x:%02x:%02x:%02x:%02x", evt.mac[0], evt.mac[1], evt.mac[2], evt.mac[3], evt.mac[4], evt.mac[5]);
}

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
client connecte: d8:eb:97:19:7b:55
client deconnecte: d8:eb:97:19:7b:55