خادم ويب WSGI فريد باستخدام ESP8266. الجزء الأول


تحية للجميع!

هذه المقالة هي الجزء الأول من تعليمي حول تطوير خادم WSGI غير عادي إلى حد ما. في هذه المقالة سأشرح الجزء النظري من فكرتي.

الجمهور الرئيسي هو المطورين المبتدئين الذين هم على دراية بـ Python ولكنهم يريدون معرفة زن بروتوكول http.

جاهز؟ دعنا نذهب تحت القط.

مقدمة


نعم ، هذه المقالة هي مرافقة نصية لمقطع الفيديو الخاص بي (أحاول الاحتفاظ بمدونة فيديو). إذا كنت مهتما ، فيديو على يوتيوب .

هل سبق لك أن فكرت في كتابة برنامج لم يكتبه أي شخص آخر؟ شيء إلى حد الجنون فريد من نوعه ، مطلقًا (أو قريب من مطلق) عديم الفائدة ، ولكنه مثير للاهتمام؟

لا؟ حسنًا ، الحمد لله ، يقرأني الناس العاديون.

وقد تصورت مشروعًا فريدًا ومثيرًا للاهتمام للغاية ، سيسمح تنفيذه والقارئ بفهم عملي لكيفية عمل http وخادم الويب. هذا المشروع سوف يغرق القارئ في عالم مواصفات http الجنون ، مفارقة التعبيرات العادية وعيوب السائق :-). ما سيسمح لك بمعرفة كل آلام التطوير المنخفض المستوى والاستمتاع بمتطلبات المستخدم البكم البسيطة

بالمناسبة ، ربما ستندهش ، لكن فكرة هذا المشروع لم تولد من العدم. الحقيقة هي أن لدي Raspberry PI Zero بدون Wi-Fi و NodeMCU مع wi-fi. لذا فكرت - هل من الممكن كتابة خادم ويب على Django واستضافته على Raspberry PI أثناء الاتصال بالشبكة عبر Wi-Fi. كان يمكن لأي شخص عادي أن يفكر في شراء التوت باستخدام Wi-Fi أو توصيل محول Wi-Fi بتوت العليق. أتتني الفكرة لتوصيل ESP8266 بتوت العليق ، ولكن نظرًا لأن ESP8266 لا يعمل كمحول شبكة ، فقد أتتني الفكرة.

فوه ، آمل أنني بررت. الآن إلى النقطة

نظرية


خادم الويب هو شيء معقد إلى حد ما يعمل على مستوى منخفض مع المقابس ، ويحلل طلبات http الأولية ، وتحليل العناوين ، وإدارة الاتصالات ، وموازنة الحمل ، إلخ. ومن الأفضل الاحتفاظ بهذه الوحدة المعقدة منفصلة لأن تطبيق الويب يعمل بالفعل بمفاهيم عالية المستوى للنماذج ووحدات التحكم وطرق العرض. كلا المكونين ضروريان ومهمان لعمل الويب ، ولكن مجالات المعرفة اللازمة لتطويرها لا تتداخل كثيرًا ، لذا من الأفضل لهم أن يعرفوا أقل قدر ممكن عن بعضهم البعض.

كما تعلم ، هناك العديد من الخوادم المتوافقة المكتوبة في تطبيقات الويب Python (Gunicorn ، Bojern ، CherryPy ، ولكن ليس الكثير منها).

بالإضافة إلى وجود العديد من أطر عمل الويب التي يمكن أن تعمل مع أي من خوادم الويب هذه.

كيف يحدث هذا؟ الأمر بسيط - نحن بحاجة إلى معيار ويسمى هذا المعيار WSGI.

صورة
الشكل 1 WSGI

WSGI جزء من مواصفات PEP ويسمح لك باستخدام مختلف الأطر وتطبيقات الويب دون أي قلق تقريبًا من توافقها.

ويوضح الرسم التوضيحي التالي تمامًا فكرتي عن خادم ويب Python

صورة

الشكل 2

يمكن للقارئ أن يلاحظ ESP8266 في الصورة - لا ، لن أضع خادم الويب على هذا الجهاز ، لأنه سيكون شائعًا جدًا مقارنة بفكرتي.

يتم تومض ESP8266 مع البرامج الثابتة الخاصة بالمصنع ، ويقبل أوامر AT فقط. ولكن الأهم من ذلك ، بمساعدة أوامر AT ، يمكنه رفع sosket شمالًا ، والذي سيتلقى طلبات http من العميل (استلام عبر WiFi) وبثها عبر المنفذ التسلسلي

على المنفذ التسلسلي ، يرسل ESP معلمتين مهمتين - معرف المقبس ، مما يشير إلى أننا سنعيد استجابة إلى العميل. بالمناسبة ، ESP8266 يدعم بحد أقصى 4 وصلات مقبس متزامنة. وبالطبع طلب http يقوم

خادم الويب python 3 بتحليل http عن طريق طي الرؤوس في كائن بيئة خاص ورفع كائن التطبيق بتمريره طريقة start_response التي سيعيد بها تطبيقنا الاستجابة وقاموس البيئة الذي يحتوي على جميع الرؤوس الضرورية ونص طلب http (الطرق الضرورية ومفاتيح قاموس البيئة المطلوبة هي جزء أساسي من مواصفات WSGI)

بعد عمليات إطار الطلب ويولد ردا على ذلك، فإنه يسحب طريقة start_response، في هذه الطريقة نحصل على المعلمات اللازمة لتوليد استجابة HTTP، وبناء سلسلة أتش تي أم أل الخام، ونقل
كل شيء إلى العميل عن طريق المنفذ التسلسلي في ESP8266. ESP8266، بدوره

، لقد وجدت الطريقة الصحيحة لفلاش ESP8266 AT باستخدام برنامج المصنع الثابت في مقالة ممتازة ، رابط ستجده تحت الرقم 2 في قسم عناوين URL المفيدة.

بالنسبة لأوامر AT ، يكون التواصل مع ESP8266 على النحو التالي (أستخدم ESPloter shell للاتصال) أفترض أن ESP8266 لديه WiFi. إذا لم يتم رفع Wi-Fi - فمن السهل أيضًا القيام بذلك من خلال ESPloter

  1. Command AT + CIPMUX = 1 - يفتح اتصالًا متعددًا
  2. Command AT + CIPSERVER = 1.80 (المنفذ 80 ، الذي نفتحه)

بعد إدخال هذه الأوامر ، رفعنا خادم TCP إلى ESP8266 ويمكننا استقبال الطلبات من العميل.

نعيد أيضًا الاستجابة إلى العميل

بأمرين - AT + CIPSEND command = socket number، number bytes
بعد اكتمال هذا الأمر ، ستنتظر الوحدة الطرفية رسالة تحتوي على عدد وحدات البايت المحددة.
عند إدخال أحرف كافية ، ستنتهي جلسة الإرسال وسنحتاج إلى إدخال أمر جديد

AT + CIPCLOSE = number قابس كهرباء.

بعد ذلك ، ينهي المتصفح الجلسة ويعرض النص المرسل.

هذا كل شيء لهذا اليوم. آمل في الأسبوع المقبل أن أضيف وأضع الجزء العملي. لدي عدد من المشاكل ، بشكل رئيسي مع تشغيل المحطة والتحليل المتشعب ، ولكن يبدو أنها قابلة للحل.

شكرا! حتى.

عناوين URL مفيدة


  1. ساعدني هذا المقال من Let`s Build A Web Server كثيرًا في هذا المشروع.
  2. ساعدني المقال استعادة البرامج الثابتة على ESP8266 وميض ESP8266
  3. لا تستهين بقوة الوثائق الرسمية. أمثلة على أوامر AT

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


All Articles