Ignorer et passer au contenu

Livraison offerte à partir de 50€ d'achats, livrée sous 48h !

Livraison à partir de seulement 2.50€ !

Contents Menu Expand Light mode Dark mode Auto light/dark mode

Créer un point d’accès Wi-Fi avec un ESP32 en MicroPython

(Mis à jour le 05/04/2023)

En mode Point d’Accès, l’ESP32 se comporte comme un réseau Wi-Fi, tout comme une box. D’autres appareils peuvent se connecter à l’ESP32 et y accéder. Dans ce mode, l’ESP32 n’est connecté à aucun autre réseau et ne peut donc pas accéder à Internet. Cependant, ce mode est plus gourmand en calcul et en énergie, car l’ESP32 doit simuler un routeur Wifi complet (Soft AP). En conséquence, la carte ESP32 peut chauffer.

Note

Il ne faut donc pas s’attendre à avoir les mêmes performances qu’avec un routeur Wi-Fi classique, surtout sur un microcontrôleur qui fait tourner MicroPython (double peine).

Dans ce mode, l’ESP32 est isolé d’Internet : le réseau créé par l’ESP32 n’est pas relié au vôtre.

Mettre l’ESP32 en mode Access Point (AP) :

Créer un AP avec un mot de passe

Pour créer un point d’accès sur l’ESP32, 3 lignes de code Python suffisent :

import network
import time


if __name__=="__main__":
    my_ap = network.WLAN(network.AP_IF)
    my_ap.active(True)
    my_ap.config(essid='ESP-AP', authmode=network.AUTH_WPA_WPA2_PSK, password='123456789')

Ce script permet de créer un point d’accès Wi-Fi qui s’appelle “ESP-AP” avec comme mot de passe 123456789 (à changer bien sûr de votre côté).

Important

Si vous faites des modifications, pour que MicroPython prennent en compte la nouvelle configuration Wi-Fi du point d’accès, il faut penser à soit reset l’ESP32 en appuyant sur le bouton ou soit à utiliser le bouton STOP (Stop/Restart back-end) :

On peut ensuite se connecter au réseau WiFi créée depuis n’importe quel appareil. Dans cet exemple, c’est un téléphone Android qui va se connecter sur l’ESP32.

L’ESP32 apparaît dans la liste des réseaux Wi-Fi sous le nom que l’on a choisi dans le script : “ESP-AP”.

liste box wifi android

On renseigne le mot de passe du réseau (ici 123456789 ) pour se connecter à l’ESP32.

entrer mot de passe box Wi-Fi Android

On peut obtenir des informations sur la box Wi-Fi créé par l’ESP32 depuis le téléphone:

informations box Wi-Fi Android

Note

C’est bien indiqué dans les informations sur le réseau, que le point d’accès de l’ESP32 n’est pas relié à Internet.

Créer un réseau ouvert

Si l’on veut avoir un réseau Wi-Fi ouvert, sans mot de passe, le code se simplifie encore:

import network
import time


if __name__=="__main__":
    my_ap = network.WLAN(network.AP_IF)
    my_ap.active(True)
    my_ap.config(essid='ESP-AP)

Configurer d’autres paramètres lors de la création de l’AP

On peut aussi configurer plus de paramètres lors de la création de l’AP :

  • Changer l’adresse IP locale du point d’accès de l’ESP32

  • Le nombre maximal d’appareils connectés sur le réseau avec max_clients

  • Le canal Wi-Fi utilisé avec channel . Cela peut être intéressant d’en choisir un qui n’est pas utilisé par les box à proximité, pour éviter les perturbations.

  • Changer l’adresse MAC de l’ESP32, par exemple mac=b'\xcc\x44\x63\xcc\x44\x63' pour simuler une adresse MAC d’Apple.

  • Cacher le réseau Wi-Fi pour qu’il ne soit pas détectable par un simple scan réseau avec hidden=True

import network
import time


def display_ap_info(ap):
    print("\nLocal IP: {}\nSubnet mask: {}\nIP Gateway: {}\nDNS:{}".format(*ap.ifconfig()))
    print("SSID: {}\nChannel: {}".format(ap.config("essid"),ap.config("channel")))
    print("BSSID: {:02x}:{:02x}:{:02x}:{:02x}:{:02x}:{:02x}".format(*ap.config("mac")))


if __name__=="__main__":
    my_ap = network.WLAN(network.AP_IF)
    my_ap.active(True)
    my_ap.ifconfig(('192.168.4.1', '255.255.255.0', '192.168.4.1', '0.0.0.0'))
    my_ap.config(
        essid='ESP-AP',
        authmode=network.AUTH_WPA_WPA2_PSK,
        password='123456789',
        max_clients=2,
        channel=11,
        mac=b'\xcc\x44\x63\xcc\x44\x63'
        # hidden=True
        )
    display_ap_info(my_ap)

Le script propose aussi la fonction display_ap_info() pour afficher des informations sur l’AP de l’ESP32 :

informations AP Micropython

On garde en tête l’adresse IP locale 192.168.4.1 pour pouvoir communiquer avec le point d’accès depuis un autre appareil. Tel quel, si on rentre cette IP dans un navigateur web, il ne se passe rien. C’est tout à fait normal, car notre point d’accès n’a aucun serveur, aucun service qui tourne dessus.

informations AP Micropython

Actuellement aucun service tourne sur le point d’Accès

Avoir un mini-serveur WEB sur l’ESP32 AP

Pour démontrer que cela est possible, on va créer un serveur ultra-simple, qui va juste afficher une ligne de texte :

import network
import time
import socket

def minimal_web_page():
    return """
        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>ESP AP Webserver - uPesy</title>
        </head>
        <body>
            <h1>My ESP32 AP Server</h1>
            <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. At excepturi laudantium ut. Consequatur minus distinctio saepe dolorem placeat delectus quos assumenda culpa explicabo! Consequuntur vitae vel ea libero sunt commodi.</p>
        </body>
        </html>
"""

if __name__=="__main__":
    my_ap = network.WLAN(network.AP_IF)
    my_ap.active(True)
    my_ap.config(essid='ESP-AP', authmode=network.AUTH_WPA_WPA2_PSK, password='123456789')


    my_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    my_socket.bind(('', 80))
    my_socket.listen(5)

    while True:
        conn, addr = my_socket.accept()
        print('Got a connection from %s' % str(addr))
        request = conn.recv(1024)
        print('Content = %s' % str(request))
        response = minimal_web_page()
        conn.write("HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n")
        conn.send(response)
        conn.close()

Important

Pour pouvoir accéder à la page web, il faut bien penser à faire une requête HTTP et non HTTPS . Voici l’adresse à taper dans le navigateur pour cet exemple : http://192.168.4.1

informations AP Micropython

Le serveur web affiche 2 requêtes dans la console

Ici, Firefox lance automatiquement une première requête en HTTPS. La seconde requête HTTP faite manuellement permet d’accéder à la page HTML.

page html venant du serveur web de l’esp

Dans vos projets, je vous conseille d’utiliser des librairies qui proposent un serveur web plus évolué. On peut utiliser les mêmes librairies que lorsque l’ESP32 est en mode Station (connecté à votre box).