Servidor Web WSGI exclusivo usando ESP8266. Parte 1


Olá a todos!

Este artigo é a primeira parte do meu tutorial sobre o desenvolvimento de um servidor WSGI bastante incomum. Neste artigo, explicarei a parte teórica da minha ideia.

O público principal são desenvolvedores iniciantes que estão familiarizados com o Python, mas desejam conhecer o zen do protocolo http.

Pronto? Vamos embaixo do gato.

Introdução


Sim, este artigo é um acompanhamento textual do meu vídeo (estou tentando manter um blog de vídeo). Se estiver interessado, um vídeo no Youtube .

Você já teve a idéia de escrever um programa que ninguém mais escreveu? Algo ao ponto da loucura único, absolutamente (ou quase absoluto) inútil, mas interessante?

Não? Bem, graças a Deus, as pessoas normais me lêem.

E concebi um projeto único e muito interessante, cuja implementação permitirá a mim e ao leitor entender na prática como o http e o servidor da web realmente funcionam. Este projeto mergulhará o leitor no mundo da loucura, nas especificações http, no paradoxo das expressões regulares e nas imperfeições do driver :-). O que permitirá que você conheça toda a dor do desenvolvimento de baixo nível e desfrute de requisitos simples e burros do usuário

A propósito, talvez você se surpreenda, mas a idéia deste projeto não nasceu do nada. O fato é que eu tenho um Raspberry PI Zero sem Wi-Fi e NodeMCU com Wi-Fi. Então eu pensei - é possível escrever um servidor web no Django e hospedar em um PI Raspberry enquanto estiver conectado à rede via Wi-Fi. Uma pessoa normal pensaria em comprar uma framboesa com Wi-Fi ou conectar um adaptador Wi-Fi a uma framboesa. Mas surgiu a idéia de conectar o ESP8266 ao raspberry, mas como o ESP8266 não pode funcionar como um adaptador de rede, a ideia veio a mim.

Espero que justifique. Agora ao ponto

Teoria


Um servidor da Web é algo bastante complicado, que funciona em um nível baixo com soquetes, analisa solicitações http brutas, analisa cabeçalhos, gerencia conexões, equilibra a carga, etc. E é melhor manter esse módulo complexo separado porque o aplicativo Web já está operando com conceitos de modelos, controladores e visualizações de nível superior. Ambos os componentes são necessários e importantes para o trabalho da web, mas as áreas de conhecimento necessárias para o seu desenvolvimento não se sobrepõem muito; portanto, é melhor que saibam o mínimo possível sobre o outro.

Como você sabe, existem muitos compatíveis com os aplicativos de servidor da Web Python (Gunicorn, Bojern, CherryPy, mas não muitos).

Assim como existem muitas estruturas da web que podem funcionar com qualquer um desses servidores da web.

Como isso acontece? É simples - precisamos de um padrão e esse padrão é chamado WSGI.

imagem
Figura 1 WSGI

WSGI faz parte da especificação do PEP e permite que você use várias estruturas e aplicativos da Web sem quase nenhuma preocupação com sua compatibilidade.

E a ilustração a seguir demonstra perfeitamente minha ideia de servidor Web Python.

imagem

Figura 2

O leitor pode observar o ESP8266 na imagem - não, não colocarei o servidor Web neste dispositivo, pois seria muito comum em comparação com a minha ideia.

O ESP8266 pisca com o firmware AT de fábrica e aceita apenas comandos AT. Mas o mais importante é que, com a ajuda dos comandos AT, ele pode subir para o norte, que receberá solicitações http do cliente (recebimento via WiFi) e transmiti-las pela porta serial

Na porta serial, o ESP transmite 2 parâmetros importantes - o ID do soquete, indicando que retornaremos uma resposta ao cliente. A propósito, o ESP8266 suporta no máximo 4 conexões de soquete simultâneas. E, é claro, a solicitação http

Nosso servidor web python 3 analisa http dobrando os cabeçalhos em um objeto de ambiente especial e gera o objeto de aplicativo passando o método start_response com o qual nosso aplicativo retornará a resposta e o dicionário de ambiente que contém todos os cabeçalhos necessários e o corpo da solicitação http (métodos necessários e as chaves de dicionário do ambiente necessárias são uma parte essencial da especificação WSGI)

Após o quadro processa a solicitação e gera a resposta, ele puxa o método start_response, neste método obtemos os parâmetros necessários para formar a resposta http, construir a string html cru, e transferir a
coisa toda para o cliente através da porta serial em esp8266. Esp8266, por sua vez

, Encontrei a maneira correta de atualizar o ESP8266 AT com firmware de fábrica em um excelente artigo, um link para o qual você encontrará o número 2 na seção URLs úteis.

Para comandos AT, a comunicação com o ESP8266 é a seguinte (eu uso o shell do ESPloter para comunicação) Presumo que o ESP8266 tenha WiFi. Se o Wi-Fi não aumentar, também é fácil fazer isso com o ESPloter

  1. Comando AT + CIPMUX = 1 - abre várias conexões
  2. Comando AT + CIPSERVER = 1,80 (porta 80, que abrimos)

Após inserir esses comandos, aumentamos o servidor TCP para ESP8266 e podemos receber solicitações do cliente.

Também retornamos a resposta ao cliente com 2 comandos

- comando AT + CIPSEND = número do soquete, número de bytes
Após a conclusão desse comando, o terminal aguardará uma mensagem com o número especificado de bytes.
Quando

digitarmos caracteres suficientes, a sessão de transmissão será encerrada e precisaremos inserir um novo comando AT + CIPCLOSE = number tomada.

Depois disso, o navegador encerra a sessão e exibe o texto transmitido, e

é tudo por hoje. Espero que na próxima semana eu acrescente e explique a parte prática. Eu tenho vários problemas, principalmente com a operação do terminal e a análise de http, mas eles parecem ser solucionáveis.

Obrigado! Até.

URLs úteis


  1. Este artigo de Vamos construir um servidor da Web me ajudou muito neste projeto.
  2. O artigo Restaurando o firmware AT no ESP8266 me ajudou a atualizar o ESP8266
  3. Não subestime o poder da documentação oficial.Exemplos de comandos AT

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


All Articles