Servidor web WSGI único que utiliza ESP8266. Parte 1


¡Hola a todos!

Este artículo es la primera parte de mi tutorial sobre el desarrollo de un servidor WSGI bastante inusual. En este artículo explicaré la parte teórica de mi idea.

La audiencia principal es desarrolladores novatos que están familiarizados con Python pero quieren conocer el zen del protocolo http.

Listo? Vamos debajo del gato.

Introducción


Sí, este artículo es un acompañamiento textual a mi video (estoy tratando de mantener un blog de video). Si está interesado, un video en Youtube .

¿Alguna vez has tenido la idea de escribir un programa que nadie más escribió? Algo hasta el punto de locura único, absolutamente (o casi absoluto) inútil, pero interesante.

¿No? Bueno, gracias a Dios, la gente normal me lee.

Y concebí un proyecto único y muy interesante, cuya implementación nos permitirá a mí y al lector comprender en la práctica cómo funcionan realmente http y el servidor web. Este proyecto sumergirá al lector en el mundo de las especificaciones http de la locura, la paradoja de las expresiones regulares y las imperfecciones del controlador :-). Lo que le permitirá conocer todo el dolor del desarrollo de bajo nivel y disfrutar de los simples requisitos de usuario tontos

Por cierto, tal vez te sorprendas, pero la idea de este proyecto no nació de la nada. El hecho es que tengo un Raspberry PI Zero sin Wi-Fi y NodeMCU con wi-fi. Entonces pensé: ¿es posible escribir un servidor web en Django y alojarlo en un Raspberry PI mientras se conecta a la red a través de Wi-Fi? Una persona normal habría pensado comprar una frambuesa con Wi-Fi o conectar un adaptador de Wi-Fi a una frambuesa. Pero se me ocurrió la idea de conectar el ESP8266 a la frambuesa, pero como el ESP8266 no puede funcionar como un adaptador de red, se me ocurrió la idea.

Fuh, espero haberlo justificado. Ahora al punto

Teoría


Un servidor web es algo bastante complicado que funciona en un nivel bajo con sockets, analiza solicitudes HTTP sin procesar, analiza encabezados, administra conexiones, equilibra la carga, etc. Y es mejor mantener este módulo complejo separado porque la aplicación web ya está funcionando con conceptos de modelos, controladores y vistas de nivel superior. Ambos componentes son necesarios e importantes para el trabajo de la web, pero las áreas de conocimiento necesarias para su desarrollo no se superponen demasiado, por lo que es mejor que sepan lo menos posible el uno del otro.

Como saben, hay muchos compatibles con aplicaciones de servidor web Python escritas (Gunicorn, Bojern, CherryPy, pero no muchas de ellas).

Además, hay muchos marcos web que pueden funcionar con cualquiera de estos servidores web.

¿Como sucedió esto? Es simple: necesitamos un estándar y este estándar se llama WSGI

imagen
Figura 1 WSGI

WSGI es parte de la especificación PEP y le permite usar varios marcos y aplicaciones web casi sin preocuparse por su compatibilidad.

Y la siguiente ilustración demuestra perfectamente mi idea de un servidor web Python

imagen

Figura 2

El lector pudo notar ESP8266 en la imagen, no, no colocaré el servidor web en este dispositivo, ya que sería demasiado común en comparación con mi idea.

ESP8266 se actualiza con el firmware AT de fábrica y solo acepta comandos AT. Pero lo más importante, con la ayuda de los comandos AT, puede elevar sosket north, que recibirá las solicitudes http del cliente (las recibirá a través de WiFi) y las transmitirá a través del puerto serie

ESP envía 2 parámetros importantes a través del puerto serie: la ID del socket, que indica que devolveremos una respuesta al cliente. ESP8266, por cierto, admite un máximo de 4 conexiones de socket simultáneas. Y, por supuesto, la solicitud http

Nuestro servidor web python 3 analiza http al plegar los encabezados en un objeto de entorno especial y eleva el objeto de la aplicación pasándole el método start_response con el que nuestra aplicación devolverá la respuesta y el diccionario del entorno que contiene todos los encabezados necesarios y el cuerpo de la solicitud http (métodos necesarios y las claves de diccionario de entorno necesarias son una parte clave de la especificación WSGI)

Después de que el marco procesa la solicitud y genera la respuesta, extrae el método start_response, en este método obtenemos los parámetros necesarios para formar la respuesta http, construir la cadena html sin procesar y transferir
todo al cliente a través del puerto serie en ESP8266. ESP8266, a su vez

, Encontré la forma correcta de flashear ESP8266 AT con firmware de fábrica en un excelente artículo, un enlace al que encontrarán en el número 2. En la sección de URL útiles.

Para los comandos AT, la comunicación con ESP8266 es la siguiente (utilizo el shell ESPloter para la comunicación) Supongo que el ESP8266 tiene WiFi. Si no se activa el Wi-Fi, también es fácil hacerlo a través de ESPloter

  1. Comando AT + CIPMUX = 1 - abre múltiples conexiones
  2. Comando AT + CIPSERVER = 1.80 (puerto 80, que abrimos)

Después de ingresar estos comandos, elevamos el servidor TCP a ESP8266 y podemos recibir solicitudes del cliente.

También devolvemos la respuesta al cliente con 2 comandos

: comando AT + CIPSEND = número de socket, número de bytes
Después de completar este comando, el terminal esperará un mensaje del número especificado de bytes.
Cuando ingresamos suficientes caracteres, la sesión de transmisión finalizará y necesitaremos ingresar un nuevo comando

AT + CIPCLOSE = número enchufe.

Después de eso, el navegador finaliza la sesión y muestra el texto transmitido.

Eso es todo por hoy. Espero que en la próxima semana agregue y presente la parte práctica. Tengo una serie de problemas, principalmente con el funcionamiento del terminal y el análisis http, pero parecen ser solucionables.

¡Gracias! Hasta.

URL útiles


  1. Este artículo de Let`s Build A Web Server me ayudó mucho en este proyecto.
  2. El artículo Restaurando el firmware de AT en el ESP8266 me ayudó a flashear ESP8266
  3. No subestimes el poder de la documentación oficial Ejemplos de comandos AT

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


All Articles