Server web WSGI unik menggunakan ESP8266. Bagian 1


Halo semuanya!

Artikel ini adalah bagian pertama dari tutorial saya tentang mengembangkan server WSGI yang agak tidak biasa. Pada artikel ini saya akan menjelaskan bagian teoretis dari ide saya.

Audiens utama adalah pengembang pemula yang terbiasa dengan Python tetapi ingin mengetahui zen dari protokol http.

Siap? Ayo pergi di bawah kucing.

Intro


Ya, artikel ini adalah iringan tekstual untuk video saya (saya mencoba untuk mempertahankan blog video). Jika tertarik, video di Youtube .

Pernahkah Anda memiliki ide untuk menulis sebuah program yang tidak ditulis oleh orang lain? Sesuatu yang gila, unik, benar-benar (atau hampir absolut) tidak berguna, tetapi menarik?

Tidak? Terima kasih Tuhan, orang normal membaca saya.

Dan saya menyusun proyek yang unik dan sangat menarik, yang implementasinya akan memungkinkan saya dan pembaca memahami dalam praktik bagaimana sebenarnya http dan server web bekerja. Proyek ini akan menjerumuskan pembaca ke dunia spesifikasi http kegilaan, paradoks ekspresi reguler dan ketidaksempurnaan driver :-). Apa yang akan memungkinkan Anda untuk mengetahui semua rasa sakit dari pengembangan tingkat rendah dan menikmati kebutuhan pengguna yang sederhana dan bodoh

Ngomong-ngomong, mungkin Anda akan terkejut, tetapi gagasan proyek ini tidak lahir begitu saja. Faktanya adalah bahwa saya memiliki Raspberry PI Zero tanpa Wi-Fi dan NodeMCU dengan wi-fi. Jadi saya pikir - apakah mungkin untuk menulis server web pada Django dan host pada Raspberry PI saat terhubung ke jaringan melalui Wi-Fi. Orang normal akan berpikir untuk membeli raspberry dengan Wi-Fi atau menghubungkan adaptor Wi-Fi ke raspberry. Saya datang dengan ide menghubungkan ESP8266 ke raspberry, tetapi karena ESP8266 tidak dapat berfungsi sebagai adaptor jaringan, ide itu datang kepada saya.

Fuh, saya harap saya dibenarkan. Sekarang to the point

Teori


Server web adalah hal yang agak rumit yang bekerja pada level rendah dengan soket, mem-parsing permintaan http mentah, mem-parsing header, mengelola koneksi, menyeimbangkan beban, dll. Dan lebih baik memisahkan modul kompleks ini karena aplikasi web sudah beroperasi dengan konsep model, pengontrol, dan tampilan tingkat tinggi. Kedua komponen tersebut diperlukan dan penting untuk pekerjaan web, tetapi bidang pengetahuan yang diperlukan untuk pengembangannya tidak banyak tumpang tindih, sehingga lebih baik bagi mereka untuk mengetahui sesedikit mungkin tentang satu sama lain.

Seperti yang Anda tahu, ada banyak yang kompatibel dengan yang ditulis dalam aplikasi server web Python (Gunicorn, Bojern, CherryPy, tetapi tidak banyak dari mereka).

Serta ada banyak kerangka kerja web yang dapat bekerja dengan salah satu dari server web ini.

Bagaimana ini bisa terjadi? Ini sederhana - kita memerlukan standar dan standar ini disebut WSGI

gambar
Gambar 1 WSGI

WSGI adalah bagian dari spesifikasi PEP dan memungkinkan Anda untuk menggunakan berbagai kerangka kerja dan aplikasi web dengan hampir tidak mempedulikan kompatibilitasnya.

Dan ilustrasi berikut menunjukkan dengan sempurna ide saya tentang server web Python

gambar

Gambar 2

Pembaca dapat melihat ESP8266 dalam gambar - tidak, saya tidak akan menempatkan server web pada perangkat ini, karena itu akan terlalu umum dibandingkan dengan ide saya.

ESP8266 di-flash dengan firmware AT pabrik, dan hanya menerima perintah AT. Tetapi yang paling penting, dengan bantuan perintah AT, ia dapat meningkatkan sosket utara, yang akan menerima permintaan http dari klien (menerima melalui WiFi) dan menyiarkannya melalui port serial

Pada port serial, ESP mentransmisikan 2 parameter penting - ID soket, yang menunjukkan bahwa kami akan mengembalikan respons kepada klien. ESP8266, omong-omong, mendukung maksimum 4 koneksi soket simultan. Dan tentu saja, permintaan http

Server web python 3 kami mem-parsing http dengan melipat header menjadi objek lingkungan khusus dan mengangkat objek aplikasi dengan meneruskannya metode start_response yang dengannya aplikasi kami akan mengembalikan respons dan kamus lingkungan yang berisi semua header yang diperlukan dan tubuh permintaan http (metode yang diperlukan) dan kunci kamus lingkungan yang diperlukan adalah bagian kunci dari spesifikasi WSGI)

Setelah kerangka kerja memproses permintaan dan menghasilkan respons, ia menarik metode start_response, dalam metode ini kami mendapatkan parameter yang diperlukan untuk menghasilkan respons http, membangun string html mentah, dan mentransfer
semuanya ke klien melalui port serial di ESP8266. ESP8266, pada gilirannya

, Saya menemukan cara yang benar untuk mem-flash ESP8266 AT dengan firmware pabrik di artikel yang bagus, tautan yang akan Anda temukan di bawah nomor 2 di bagian "URL Berguna".

Untuk perintah AT, komunikasi dengan ESP8266 adalah sebagai berikut (saya menggunakan shell ESPloter untuk komunikasi) Saya berasumsi bahwa ESP8266 memiliki WiFi. Jika Wi-Fi tidak dinaikkan - ini juga mudah dilakukan melalui ESPloter

  1. Command AT + CIPMUX = 1 - membuka banyak koneksi
  2. Command AT + CIPSERVER = 1.80 (port 80, yang kami buka)

Setelah memasukkan perintah ini, kami menaikkan server TCP ke ESP8266 dan dapat menerima permintaan dari klien.

Kami juga mengembalikan respons ke klien dengan 2 perintah

- Perintah AT + CIPSEND = nomor soket, jumlah byte
Setelah perintah ini selesai, terminal akan menunggu pesan dari jumlah byte yang ditentukan.
Ketika kita memasukkan karakter yang cukup, sesi transmisi akan berakhir dan kita perlu memasukkan perintah baru

AT + CIPCLOSE = angka stopkontak.

Setelah itu, browser mengakhiri sesi dan menampilkan teks yang dikirimkan.

Itu saja untuk hari ini. Saya berharap di minggu depan saya akan menambah dan menjabarkan bagian praktisnya. Saya memiliki sejumlah masalah, terutama dengan pengoperasian terminal dan parsing http, tetapi tampaknya dapat dipecahkan.

Terima kasih! Sampai.

URL yang bermanfaat


  1. Artikel Let`s Build A Web Server ini banyak membantu saya dalam proyek ini.
  2. Artikel Memulihkan AT Firmware pada ESP8266 membantu saya menginstal ESP8266
  3. Jangan meremehkan kekuatan dokumentasi resmi. Contoh perintah AT

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


All Articles