Einzigartiger WSGI-Webserver mit ESP8266. Teil 1


Hallo alle zusammen!

Dieser Artikel ist der erste Teil meines Tutorials zur Entwicklung eines eher ungewöhnlichen WSGI-Servers. In diesem Artikel werde ich den theoretischen Teil meiner Idee erklären.

Das Hauptpublikum sind unerfahrene Entwickler, die mit Python vertraut sind, aber den Zen des http-Protokolls kennen möchten.

Bereit? Lass uns unter die Katze gehen.

Intro


Ja, dieser Artikel ist eine Textbegleitung zu meinem Video (ich versuche, ein Videoblog zu führen). Bei Interesse ein Video auf Youtube .

Haben Sie jemals die Idee gehabt, ein Programm zu schreiben, das sonst niemand geschrieben hat? Etwas bis zum Wahnsinn einzigartiges, absolut (oder fast absolut) nutzloses, aber interessantes?

Nein? Gott sei Dank lesen mich normale Leute.

Und ich habe ein einzigartiges und sehr interessantes Projekt konzipiert, dessen Implementierung es mir und dem Leser ermöglichen wird, in der Praxis zu verstehen, wie http und der Webserver tatsächlich funktionieren. Dieses Projekt wird den Leser in die Welt der Wahnsinns-http-Spezifikationen eintauchen lassen, das Paradoxon regulärer Ausdrücke und Treibermängel :-). Was ermöglicht es Ihnen, alle Schmerzen der Entwicklung auf niedriger Ebene zu kennen und einfache dumme Benutzeranforderungen zu genießen

Übrigens, vielleicht werden Sie überrascht sein, aber die Idee dieses Projekts wurde nicht aus dem Nichts geboren. Tatsache ist, dass ich einen Raspberry PI Zero ohne Wi-Fi und NodeMCU mit Wi-Fi habe. Also dachte ich - ist es möglich, einen Webserver auf Django zu schreiben und auf einem Raspberry PI zu hosten, während eine Verbindung zum Netzwerk über Wi-Fi hergestellt wird. Ein normaler Mensch hätte daran gedacht, entweder eine Himbeere mit WLAN zu kaufen oder einen WLAN-Adapter an eine Himbeere anzuschließen. Ich hatte die Idee, den ESP8266 an die Himbeere anzuschließen, aber da der ESP8266 nicht als Netzwerkadapter funktionieren kann, kam mir die Idee.

Fuh, ich hoffe ich habe es gerechtfertigt. Nun zum Punkt

Theorie


Ein Webserver ist eine ziemlich komplizierte Sache, die auf niedriger Ebene mit Sockets arbeitet, rohe http-Anforderungen analysiert, Header analysiert, Verbindungen verwaltet, die Last ausgleicht usw. Es ist besser, dieses komplexe Modul getrennt zu halten, da die Webanwendung bereits mit übergeordneten Konzepten von Modellen, Controllern und Ansichten arbeitet. Beide Komponenten sind für die Arbeit des Webs notwendig und wichtig, aber die für ihre Entwicklung erforderlichen Wissensbereiche überschneiden sich nicht sehr, so dass es für sie besser ist, so wenig wie möglich voneinander zu wissen.

Wie Sie wissen, gibt es viele, die mit Python-Webserver-Anwendungen kompatibel sind (Gunicorn, Bojern, CherryPy, aber nicht viele davon).

Außerdem gibt es viele Webframeworks, die mit jedem dieser Webserver funktionieren können.

Wie kommt es dazu? Es ist einfach - wir brauchen einen Standard, und dieser Standard heißt WSGI.

Bild
Abbildung 1 WSGI

WSGI ist Teil der PEP-Spezifikation und ermöglicht Ihnen die Verwendung verschiedener Frameworks und Webanwendungen, ohne dass die Kompatibilität beeinträchtigt wird.

Die folgende Abbildung zeigt perfekt meine Vorstellung von einem Python-Webserver.

Bild

Abbildung 2

Der Leser konnte ESP8266 auf dem Bild erkennen. Nein, ich werde den Webserver nicht auf diesem Gerät platzieren, da er im Vergleich zu meiner Idee zu alltäglich wäre.

ESP8266 wird mit der werkseitigen AT-Firmware geflasht und akzeptiert nur AT-Befehle. Am wichtigsten ist jedoch, dass er mithilfe von AT-Befehlen sosket north anheben kann, das http-Anforderungen vom Client empfängt (über WLAN empfängt) und diese über die serielle Schnittstelle sendet

An der seriellen Schnittstelle überträgt ESP zwei wichtige Parameter - die Socket-ID, die angibt, dass wir eine Antwort an den Client zurückgeben. ESP8266 unterstützt übrigens maximal 4 gleichzeitige Socket-Verbindungen. Und natürlich die http-Anfrage

Unser Python 3-Webserver analysiert http, indem er die Header in ein spezielles Umgebungsobjekt faltet und das Anwendungsobjekt auslöst, indem er die Methode start_response übergibt, mit der unsere Anwendung die Antwort und das Umgebungswörterbuch zurückgibt, das alle erforderlichen Header und den Hauptteil der http-Anfrage enthält (erforderliche Methoden) und die erforderlichen Umgebungswörterbuchschlüssel sind ein wesentlicher Bestandteil der WSGI-Spezifikation.

Nachdem der Rahmen die Anforderung verarbeitet und erzeugt eine Antwort, zieht es die start_response Methode, bei diesem Verfahren wir die Parameter erhalten benötigt , um die HTTP - Antwort zu erzeugen, bauten den rohen HTML - String, und übertragen Sie die
ganze Sache an den Client über die serielle Schnittstelle in Esp8266. Esp8266, wiederum

, Ich habe den richtigen Weg gefunden, um ESP8266 AT mit der werkseitigen Firmware zu flashen, in einem ausgezeichneten Artikel, auf den Sie unter Nummer 2 im Abschnitt Nützliche URLs

verweisen . Bei AT-Befehlen lautet die Kommunikation mit ESP8266 wie folgt (ich verwende die ESPloter-Shell für die Kommunikation). Ich gehe davon aus, dass der ESP8266 WiFi hat. Wenn Wi-Fi nicht aktiviert ist, ist dies auch über ESPloter einfach

  1. Befehl AT + CIPMUX = 1 - öffnet mehrere Verbindungen
  2. Befehl AT + CIPSERVER = 1.80 (Port 80, den wir öffnen)

Nach Eingabe dieser Befehle haben wir den TCP-Server auf ESP8266 erhöht und können Anforderungen vom Client empfangen.

Wir

senden die Antwort auch mit 2 Befehlen an den Client zurück - AT + CIPSEND-Befehl = Socket-Nummer, Anzahl der Bytes
Nach Abschluss dieses Befehls wartet das Terminal auf eine Nachricht mit der angegebenen Anzahl von Bytes.
Wenn wir genügend Zeichen eingeben, endet die Übertragungssitzung und wir müssen einen neuen Befehl

AT + CIPCLOSE = Nummer eingeben Steckdose.

Danach beendet der Browser die Sitzung und zeigt den übertragenen Text an.

Das ist alles für heute. Ich hoffe, dass ich in der nächsten Woche den praktischen Teil hinzufügen und auslegen werde. Ich habe eine Reihe von Problemen, hauptsächlich mit dem Betrieb des Terminals und dem http-Parsing, aber sie scheinen lösbar zu sein.

Danke! Tschüss.

Nützliche URLs


  1. Dieser Artikel von Let`s Build A Web Server hat mir in diesem Projekt sehr geholfen.
  2. Der Artikel Wiederherstellen der AT-Firmware auf dem ESP8266 hat mir beim Flashen des ESP8266 geholfen
  3. Unterschätzen Sie nicht die Macht der offiziellen Dokumentation. Beispiele für AT-Befehle

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


All Articles