Les Bases d'un Serveur Web sur ESP-01 en commande AT

Donc pour résumer:

On configure

AT+RESTORE
AT+CWMODE=1
AT+CWJAP="SSID","MotDePasse"
AT+CIPMUX=1
AT+CIPSERVER=1,80

puis on doit attendre de recevoir une commande TCP

Pour cela on analyse les lignes reçues de l'ESP et on cherche +IPD,[color=red]x[/color],yyy:[color=blue]GET[/color] [color=purple]/[/color] HTTP/1.1 qui est c'est une requête HTTP de type GET avec comme numéro de connection (linkID) x (souvent 0 si vous êtes tout seul à vous connecter) pour la resource /.

Si vous avez ces 3 conditions alors vous pouvez bâtir une réponse HTTP correcte. pour cela on fait autant de cycle de

AT+CIPSEND=[color=red]linkID[/color],<[i]length[/i]>
[color=purple]ici on met[/color] <[i]length[/i]> [color=purple]octets[/color]

que l'on veut en s'assurant de ne pas avoir plus de 2048 octets pour et de faire une pause de 20ms entre deux envois consécutifs.

l'information que l'on envoie doit respecter le protocole HTTP, idéalement vous mettez un header conforme, puis vous envoyez une ligne vide, puis le corps en HTML de votre page

Enfin on termine en fermant la connexion en envoyant un

AT+CIPCLOSE=[color=red]linkID[/color]

Oui mais c'est super laborieux ton truc....

Ben oui.. mais heureusement vous avez un Arduino sous la main... il peut donc automatiser énormément de choses pour vous si d'aventure vous programmez correctement la bête...

la partie configuration initiale peut être dans le setup(), puis dans la boucle on va écouter la voie série, en récupérant ligne par ligne ce que nous dit le module ESP (cf mon tuto pour écouter une entrée asynchrone). et on attend la ligne qui commence par +IPD,. On extrait les valeurs importantes de cette commande pour décider si on doit répondre ou ignorer (renvoyer un CIPCLOSE) et si on répond alors on alterne les CIPSEND et le contenu pour bâtir la réponse et on termine la connexion.

Si on veut pousser un peu la résistance du code, il est bon de tester la réponse de l'ESP-01 à toute commande, au moins en s'assurant qu'il dit 'ready' ou 'OK' ou que l'on a le prompt '>' pour envoyer les data par exemple avant d'envoyer la nouvelle commande.

ça semble jouable, non?

plus difficile, le fait que deux navigateurs peuvent envoyer des commandes en même temps et donc sur le port série, en réponse à des commandes vous allez peut-être voir arriver en plus d'autre ordres... donc faudra un analyseur un peu robuste si vous voulez gérer cela bien (quand votre ESP est en mode envoi de données il met ce qu'il reçoit de côté donc ça ne vient pas vous polluer)

Mettre tout cela en musique avec du code

Une bonne pratique quand on veut faire du code c'est de bien comprendre ce dont on a besoin. Tous les tests ci dessus peuvent sembler laborieux, mais à la main, nous avons réussi à envoyer l'ensemble des commandes AT nécessaire à

  • La configuration de l'ESP-01 pour qu'il rejoigne le réseau Wi-Fi et écoute des requêtes TCP entrantes
  • On a compris comment détecter une requête web pertinente - pas de code on ouvre les yeux :slight_smile:
  • La structuration d'une réponse respectant les contraintes techniques de l'ESP
  • La clôture d'une session

On a aussi en tête maintenant la structure générale de notre programme

  • Le setup() doit établir la configuration initiale et rejoindre le réseau. Pour ce faire on doit établir une communication série avec l'ESP et envoyer un certain nombre de commandes AT.

  • La loop() doit détecter une requête pertinente et la traiter. Pour ce faire on doit écouter un flux de données structuré sur le port Série de l'ESP-01, détecter une ligne spéciale qui commence par "+IPD,", extraire de l'information de cette ligne (le linkID et l'URL) en confirmant que c'est une requête pertinente (le GET, le HTTP) et si c'est le cas bâtir et envoyer la réponse et clore la connexion.

J'ai déjà rédigé un tuto sur les bases de l'écoute sur le port série, on va s'inspirer de ce qui est fait et je vous engage à le lire pour comprendre le principe.

Enfin, toute bonne pratique de code doit se faire en décomposant les problèmes et ensuite en agrégeant les solutions, on va donc explorer diverses fonctions qui nous sont nécessaires