Créer un point d’accès Wi-Fi avec un ESP32
(Mis à jour le 05/01/2023)
Le mode Access Point permet d’utiliser l’ESP32 pour créer un réseau Wi-Fi sur lequel on peut se connecter. C’est un peu comme le partage de connexion Wi-Fi disponible sur les téléphones. Comme sur les téléphones, le fonctionnement d’une box Wi-Fi est simulé : on parle de Soft AP (pour point d’accès Wi-Fi “logiciel”). Il ne faut donc pas s’attendre à avoir les mêmes performances qu’avec un routeur Wi-Fi classique, surtout sur un microcontrôleur !
À noter également que contrairement au partage de connexion du téléphone, l’ESP32 n’est pas connecté à Internet : on peut donc juste utiliser le mode Access Point pour créer un réseau local Wi-Fi privé complètement isolé d’internet.
Voici quelques utilisations du mode Access Point :
On se connecte à l’ESP32 en mode Access Point provisoirement pour rentrer les identifiants de sa box Wi-Fi et permettre ainsi à l’ESP32 de se connecter à notre réseau Wi-Fi classique. La plupart des objets connectés utilisent ce principe pour se connecter au Wi-Fi domestique.
Avoir un réseau séparé de son réseau domestique et non relié à Internet.
Pour pouvoir communiquer facilement entre plusieurs ESP32 par Wi-Fi
Avoir un serveur local sur un réseau Wi-Fi isolé
Mettre l’ESP32 en mode Access Point (AP) :
Il suffit d’utiliser les fonctions WiFi.mode(WIFI_AP)
et WiFi.softAP()
pour activer le mode Access Point. Voici un exemple très simple qui permet de créer un réseau Wi-Fi avec une ESP32 :
#include <WiFi.h>
const char* ssid = "uPesy_AP";
const char* password = "super_strong_password";
void setup()
{
Serial.begin(115200);
Serial.println("\n[*] Creating AP");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
Serial.print("[+] AP Created with IP Gateway ");
Serial.println(WiFi.softAPIP());
}
void loop(){}
Astuce
Il ne faut pas oublier d’importer le module WiFi.h
pour que le code fonctionne avec #include <WiFi.h>
.
Important
Si le mot de passe choisi fait moins de 8 caractères, le compilateur renverra une erreur. Le mot de passe doit être au minimum de 8 jusqu’à 63 caractères.
Sortie du terminal
[*] Creating AP
[+] AP Created with IP Gateway 192.168.4.1
On peut ensuite se connecter au réseau WiFi en rentrant le mot de passe. Dans cet exemple, c’est un ordinateur sur Windows 10 qui va se connecter sur l’ESP32.
On peut aussi créer un réseau WiFi ouvert en mettant NULL
pour le mot de passe :
#include <WiFi.h>
const char* ssid = "uPesy_AP";
const char* password = NULL;
void setup()
{
Serial.begin(115200);
Serial.println("\n[*] Creating AP");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password);
Serial.print("[+] AP Created with IP Gateway ");
Serial.println(WiFi.softAPIP());
}
void loop(){}
Le point d’accès apparaît bien comme un réseau ouvert :
Astuce
L’IP affichée dans le terminal série correspond à l’IP locale du routeur sur le nouveau réseau Wi-Fi.
On peut aussi customiser un peu plus le point d’accès en précisant le canal Wi-Fi utilisé (plus d’informations sur les canaux Wi-Fi sont disponibles sur Wikipédia ), la visibilité ou non du réseau ainsi que le nombre maximal d’appareils qui peuvent être connectés en même temps.
#include <WiFi.h>
const char* ssid = "uPesy_AP"; // SSID Name
const char* password = "super_strong_password"; // SSID Password - Set to NULL to have an open AP
const int channel = 10; // WiFi Channel number between 1 and 13
const bool hide_SSID = false; // To disable SSID broadcast -> SSID will not appear in a basic WiFi scan
const int max_connection = 2; // Maximum simultaneous connected clients on the AP
void setup()
{
Serial.begin(115200);
Serial.println("\n[*] Creating AP");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password, channel, hide_SSID, max_connection);
Serial.print("[+] AP Created with IP Gateway ");
Serial.println(WiFi.softAPIP());
}
void loop(){}
Une fois connecté au réseau Wi-Fi depuis un appareil, on peut ensuite pinger le routeur, c’est-à-dire ici l’ESP32 dans l’invite de commande Windows avec :
ping 192.168.4.1
Nous avons notre propre routeur Wi-Fi local sur un ESP32 sur lequel on peut ajouter plusieurs appareils (ordinateur, téléphone, ESP32, Raspberry Pi …)
Configuration avancée
L’adresse IP 192.168.4.1
du point d’accès peut être modifiée, au même titre que l’adresse IP de la passerelle et du masque sous réseau. Il suffit d’utiliser la fonction WiFi.softAPConfig()
avant de créer le point d’accès via la fonction WiFi.softAP
. La fonction WiFi.softAPConfig(local_ip, gateway, subnet)
prend les paramètres suivant :
IPAddress local_ip
: L’adresse IP locale de notre point d’accès dans le réseau qu’il va créerIPAddress gateway
: L’adresse IP de la passerelle, dans notre cas, cela sera la même que l’IP locale.subnet
: Le masque de sous réseau du réseau créé par l’ESP32, en général255.255.255.0
Par exemple, pour avoir un point d’accès Wi-Fi, dont son IP locale est 192.168.0.1
avec un masque de sous-réseau de 255.255.255.0
, le code serait de la forme :
#include <WiFi.h>
const char* ssid = "uPesy_AP";
const char* password = "super_strong_password";
IPAddress local_ip(192,168,0,1);
IPAddress gateway(192,168,0,1);
IPAddress subnet(255,255,255,0);
void setup()
{
Serial.begin(115200);
Serial.println("\n[*] Creating AP");
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(local_ip, gateway, subnet);
WiFi.softAP(ssid, password);
Serial.print("[+] AP Created with IP Gateway ");
Serial.println(WiFi.softAPIP());
}
void loop(){}
Sortie du terminal
[*] Creating AP
[+] AP Created with IP Gateway 192.168.0.1
Exemples d’application
Voici un exemple qui permet d’afficher une liste des appareils connectés sur l’ESP32 avec leurs adresses MAC et leur adresse IP locale. C’est une version simplifiée de celle que l’on peut avoir sur une box Wi-Fi classique.
#include <WiFi.h>
#include "esp_wifi.h"
const char* ssid = "uPesy_AP"; // SSID Name
const char* password = "super_strong_password"; // SSID Password - Set to NULL to have an open AP
const int channel = 10; // WiFi Channel number between 1 and 13
const bool hide_SSID = false; // To disable SSID broadcast -> SSID will not appear in a basic WiFi scan
const int max_connection = 2; // Maximum simultaneous connected clients on the AP
void display_connected_devices()
{
wifi_sta_list_t wifi_sta_list;
tcpip_adapter_sta_list_t adapter_sta_list;
esp_wifi_ap_get_sta_list(&wifi_sta_list);
tcpip_adapter_get_sta_list(&wifi_sta_list, &adapter_sta_list);
if (adapter_sta_list.num > 0)
Serial.println("-----------");
for (uint8_t i = 0; i < adapter_sta_list.num; i++)
{
tcpip_adapter_sta_info_t station = adapter_sta_list.sta[i];
Serial.print((String)"[+] Device " + i + " | MAC : ");
Serial.printf("%02X:%02X:%02X:%02X:%02X:%02X", station.mac[0], station.mac[1], station.mac[2], station.mac[3], station.mac[4], station.mac[5]);
Serial.println((String) " | IP " + ip4addr_ntoa(&(station.ip)));
}
}
void setup()
{
Serial.begin(115200);
Serial.println("\n[*] Creating AP");
WiFi.mode(WIFI_AP);
WiFi.softAP(ssid, password, channel, hide_SSID, max_connection);
Serial.print("[+] AP Created with IP Gateway ");
Serial.println(WiFi.softAPIP());
}
void loop()
{
display_connected_devices();
delay(5000);
}
Sortie du terminal
[+] Device 0 | MAC : 44:E2:42:08:D7:11 | IP 192.168.4.2
[+] Device 1 | MAC : 00:0A:F7:42:42:42 | IP 192.168.4.3
-----------
[+] Device 0 | MAC : 44:E2:42:08:D7:11 | IP 192.168.4.2
[+] Device 1 | MAC : 00:0A:F7:42:42:42 | IP 192.168.4.3
On pourrait aussi empêcher certains appareils de se connecter en filtrant les adresses MAC. Par exemple autoriser uniquement les ESP32 à se connecter dessus. En effet, on peut utiliser la fonction esp_wifi_deauth_sta(int device_id)
en précisant le numéro de l’appareil que l’on veut enlever.
Astuce
La première personne qui m’envoie un exemple de code qui permet de faire un filtrage des adresses mac sur le routeur WiFi crée par l’ESP32 verra sa solution proposée ici !
Utiliser le mode STATION et AP en même temps
Il est possible d’avoir l’ESP32 qui fonctionne avec les modes STATION et AP en même temps. C’est-à-dire que l’ESP32 est connecté à une box Wi-Fi classique (mode STATION) avec aussi un point d’accès Wi-Fi d’activé (mode AP). Ce mode est appelé WIFI_AP_STA
.
Note
Il y a une interface réseau distincte pour chacun des modes. Puisque les interfaces sont séparées, elles ont chacune une adresse IP différente.
Une des applications possibles est de pouvoir relier à Internet le réseau Wi-Fi local crée par l’ESP32 en mode Soft AP.
Le code Arduino mélange à la fois la gestion du mode STATION et du mode AP. Le code est relativement simple lorsqu’on utilise déjà les 2 modes séparément :
On utilise le mode Wi-Fi
WIFI_AP_STA
On crée notre point d’accès Wi-Fi local (Soft AP)
Puis on se connecte à la box Wi-Fi classique
Voici un exemple qui permet d’avoir les 2 modes en même temps :
#include <WiFi.h>
const char* wifi_network_ssid = "Lounge";
const char* wifi_network_password = "cupcakes";
const char *soft_ap_ssid = "uPesy_AP";
const char *soft_ap_password = NULL;
void setup()
{
Serial.begin(115200);
WiFi.mode(WIFI_AP_STA);
Serial.println("\n[*] Creating ESP32 AP");
WiFi.softAP(soft_ap_ssid, soft_ap_password);
Serial.print("[+] AP Created with IP Gateway ");
Serial.println(WiFi.softAPIP());
WiFi.begin(wifi_network_ssid, wifi_network_password);
Serial.println("\n[*] Connecting to WiFi Network");
while(WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(100);
}
Serial.print("\n[+] Connected to the WiFi network with local IP : ");
Serial.println(WiFi.localIP());
}
void loop() {}
Sortie du terminal
[*] Creating ESP32 AP
[+] AP Created with IP Gateway 192.168.4.1
[*] Connecting to WiFi Network
.............................................................
[+] Connected to the WiFi network with local IP : 192.168.85.37
Important
Il ne faut pas se tromper dans les identifiants :
wifi_network
correspond aux identifiants de la box Wi-Fi classique (Orange, SFR, Free …)soft_ap
correspond au identifiants du point d’accès que l’on va créer avec l’ESP32. Il faudra rentrer ce mot de passe sur les appareils qui voudront se connecter sur l’ESP32.
À consulter également :
Un article détaillé sur le fonctionnement du protocole Wi-Fi et sur la sécurité disponible sur OpenClassrooms .
La documentation officielle sur la gestion du Wi-Fi sur l’ESP32