Serveur Web WSGI unique utilisant ESP8266. Partie 1


Bonjour à tous!

Cet article est la première partie de mon tutoriel sur le développement d'un serveur WSGI plutôt inhabituel. Dans cet article, je vais expliquer la partie théorique de mon idée.

Le public principal est les développeurs novices qui connaissent Python mais veulent connaître le zen du protocole http.

Prêt? Allons sous le chat.

Intro


Oui, cet article est un accompagnement textuel de ma vidéo (j'essaie de maintenir un blog vidéo). Si vous êtes intéressé, une vidéo sur Youtube .

Avez-vous déjà eu l'idée d'écrire un programme que personne d'autre n'a écrit? Quelque chose au point de la folie unique, absolument (ou presque absolu) inutile, mais intéressant?

Non? Eh bien, Dieu merci, les gens normaux me lisent.

Et j'ai conçu un projet unique et très intéressant, dont la mise en œuvre me permettra, ainsi qu'au lecteur, de comprendre en pratique le fonctionnement de http et du serveur web. Ce projet plongera le lecteur dans le monde de la folie des spécifications http, du paradoxe des expressions régulières et des imperfections des pilotes :-). Ce qui vous permettra de connaître toute la douleur du développement de bas niveau et de profiter des besoins simples des utilisateurs stupides

Au fait, vous serez peut-être surpris, mais l'idée de ce projet n'est pas née de nulle part. Le fait est que j'ai un Raspberry PI Zero sans Wi-Fi et NodeMCU avec wi-fi. J'ai donc pensé - est-il possible d'écrire un serveur Web sur Django et d'héberger sur un Raspberry PI tout en se connectant au réseau via le Wi-Fi. Une personne normale aurait pensé à acheter une framboise avec Wi-Fi ou à connecter un adaptateur Wi-Fi à une framboise. J'ai eu l'idée de connecter l'ESP8266 à la framboise, mais comme l'ESP8266 ne peut pas fonctionner comme adaptateur réseau, l'idée m'est venue.

Fuh, j'espère que je me suis justifié. Maintenant au point

Théorie


Un serveur Web est une chose assez compliquée qui fonctionne à un bas niveau avec les sockets, analyse les requêtes http brutes, analyse les en-têtes, gère les connexions, équilibre la charge, etc. Et il est préférable de garder ce module complexe séparé, car l'application Web fonctionne déjà avec des concepts de niveau supérieur de modèles, de contrôleurs et de vues. Les deux composantes sont nécessaires et importantes pour le travail du web, mais les domaines de connaissances nécessaires à leur développement ne se chevauchent pas beaucoup, il est donc préférable pour eux de se connaître le moins possible l'un de l'autre.

Comme vous le savez, il existe de nombreuses applications compatibles avec les serveurs Web écrits en Python (Gunicorn, Bojern, CherryPy, mais pas beaucoup d'entre elles).

De plus, il existe de nombreux frameworks Web qui peuvent fonctionner avec n'importe lequel de ces serveurs Web.

Comment cela peut-il arriver? C'est simple - nous avons besoin d'une norme et cette norme est appelée WSGI

image
Figure 1 WSGI

WSGI fait partie de la spécification PEP et vous permet d'utiliser divers cadres et applications Web sans presque aucun souci de compatibilité.

Et l'illustration suivante illustre parfaitement mon idée d'un serveur Web Python

image

Figure 2

Le lecteur pourrait remarquer ESP8266 dans l'image - non, je ne placerai pas le serveur Web sur cet appareil, car ce serait trop banal par rapport à mon idée.

L'ESP8266 clignote avec le firmware AT d'origine et n'accepte que les commandes AT. Mais le plus important, à l'aide des commandes AT, il peut lever le sosket vers le nord, qui recevra les requêtes http du client (réception via WiFi) et les diffusera via le port série

Sur le port série, ESP transmet 2 paramètres importants - l'ID de socket, indiquant que nous retournerons une réponse au client. L'ESP8266, en passant, prend en charge un maximum de 4 connexions de socket simultanées. Et bien sûr la requête http

Notre serveur web python 3 analyse http en repliant les en-têtes dans un objet d'environnement spécial et lève l'objet d'application en lui passant la méthode start_response avec laquelle notre application retournera la réponse et le dictionnaire d'environnement qui contient tous les en-têtes nécessaires et le corps de la requête http (méthodes nécessaires et les clés de dictionnaire d'environnement requises sont un élément clé de la spécification WSGI)

Une fois que le framework traite la demande et génère une réponse, il extrait la méthode start_response, dans cette méthode, nous obtenons les paramètres nécessaires pour générer la réponse http, construire la chaîne html brute et transférer le
tout au client via le port série dans ESP8266. ESP8266, à son tour

, J'ai trouvé la bonne façon de flasher ESP8266 AT avec le firmware d'usine dans un excellent article, un lien vers lequel vous trouverez sous le numéro 2 dans la section URL utiles.

Pour les commandes AT, la communication avec ESP8266 est la suivante (j'utilise le shell ESPloter pour la communication) Je suppose que l'ESP8266 dispose du WiFi. Si le Wi-Fi n'est pas augmenté - il est également facile de le faire via ESPloter

  1. Commande AT + CIPMUX = 1 - ouvre une connexion multiple
  2. Commande AT + CIPSERVER = 1,80 (port 80, que nous ouvrons)

Après avoir entré ces commandes, nous avons élevé le serveur TCP à ESP8266 et pouvons recevoir des demandes du client.

Nous

renvoyons également la réponse au client avec 2 commandes - Commande AT + CIPSEND = numéro de socket, nombre d'octets Une
fois cette commande terminée, le terminal attendra un message du nombre d'octets spécifié.
Lorsque nous entrerons suffisamment de caractères, la session de transmission se terminera et nous devrons entrer une nouvelle commande

AT + CIPCLOSE = numéro prise.

Après cela, le navigateur termine la session et affiche le texte transmis.

C'est tout pour aujourd'hui. J'espère que la semaine prochaine j'ajouterai et exposerai la partie pratique. J'ai un certain nombre de problèmes, principalement avec le fonctionnement du terminal et l'analyse http, mais ils semblent être résolubles.

Remercier! Jusqu'à.

URL utiles


  1. Cet article de Let`s Build A Web Server m'a beaucoup aidé dans ce projet.
  2. L'article Restaurer le micrologiciel AT sur l'ESP8266 m'a aidé à flasher ESP8266
  3. Ne sous-estimez pas la puissance de la documentation officielle. Exemples de commandes AT

Source: https://habr.com/ru/post/undefined/


All Articles