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

لنفترض أن لدينا بالفعل برنامج Python فائق يقوم بعمل مهم للغاية ، من وميض مؤشر LED إلى التحكم في "المنزل الذكي" أو على الأقل وحدة تغذية من Cat. سأريكم طرقًا مختلفة ، من البسيط إلى المعقد ، كيفية جعل الوصول إلى الويب إلى مثل هذا التطبيق عن طريق إضافة بعض الرموز.
هذه المقالة مخصصة للمبتدئين ، من غير المحتمل أن يجد المحترفون شيئًا جديدًا بشكل أساسي هنا ، لكنني آمل أن يكون مفيدًا للمبتدئين في Linux. بالنسبة لأولئك الذين يهتمون ، واصلت تحت خفض.
ملاحظة : هذه المقالة هي نوع من "التجربة" ، بمجرد أن اشتكوا في التعليقات من عدم وجود مقالات كافية لـ Habré للمبتدئين. حاولت ملء الفجوة ، ولكن حسب التقديرات ، سيكون من الواضح ما إذا كان من المنطقي الاستمرار في هذا التنسيق أم لا.
لذلك دعونا نبدأ.
تكوين التوت بي
دعنا نأمل أن يكون للقارئ Raspberry Pi متصل بالشبكة المنزلية عبر WiFi أو Ethernet ، ويعرف القارئ ماهية عنوان IP وكيفية تسجيل الدخول عن بُعد إلى Raspberry Pi عبر SSH باستخدام المعجون. سننظر في ما يسمى التكوين مقطوعة الرأس - بدون لوحة مفاتيح وشاشة. ولكن قبل أن تفعل شيئًا ما مع Raspberry Pi ، زوجين من المتسللين الصغار.
نصيحة N1 . للقيام بشيء عن بُعد باستخدام Raspberry Pi ، تحتاج إلى تكوين SSH عليه ، ويتم إيقاف تشغيله افتراضيًا. يمكنك الانتقال بالطريقة التقليدية وبدء المكون القياسي ، ولكن يمكن أن يكون الأمر أكثر بساطة - بعد تسجيل صورة القرص ، قم فقط بإنشاء ملف
ssh فارغ (بدون امتداد) في جذر بطاقة SD. علاوة على ذلك ، بعد تحميل Raspberry Pi ، سوف يكون SSH نشطًا على الفور.
للوصول إلى الجهاز عن بُعد ، تحتاج إلى معرفة عنوان IP الخاص بـ Raspberry Pi. للقيام بذلك ، فقط افتح لوحة التحكم الخاصة بالموجه الخاص بك ، وابحث عن قائمة عملاء DHCP هناك ، وانسخ عنوان IP المطلوب من هناك (على سبيل المثال ، سيكون 192.168.1.102) ، وأدخل الأمر
putty.exe pi@192.168.1.102 (لنظام التشغيل Windows) أو
ssh pi @ 192.168.1.102 لنظام التشغيل Linux أو OSX.
ومع ذلك ، يمكن أن تتغير عناوين IP ، على سبيل المثال ، بعد إعادة تشغيل جهاز التوجيه ، هذا ليس مناسبًا دائمًا. من هذا يلي
نصيحة N2 - تكوين عنوان IP ثابت. للقيام بذلك ، قم بتشغيل الأمر
sudo nano /etc/dhcpcd.conf على Raspberry Pi ، وأدخل الإعدادات التالية:
interface eth0 static ip_address=192.168.1.152/24 static routers=192.168.1.1 static domain_name_servers=192.168.1.1 8.8.8.8
إذا كنت بحاجة إلى عنوان WiFi ، فستكون الواجهة wlan0 ، إذا Ethernet ثم eth0. عناوين IP ، بالطبع ، تحتاج إلى استبدال عنوانك. بعد إعادة التشغيل ، تأكد من صحة عنوان IP عن طريق
إصدار الأمر
ifconfig .
الآن كل شيء جاهز ، يمكننا أن نبدأ بيثون. يتم إعطاء جميع الأمثلة لبيثون 3.7 ، لأنه تم إهمال 2.7 منذ فترة طويلة ، وليس من المنطقي الحفاظ عليه. ولكن مع تغييرات الرمز الصغير ، كل شيء سوف يعمل هناك ، إذا لزم الأمر. بالمناسبة ، لغة Python عبارة عن منصة مشتركة - وهذا يعني أنه يمكن تشغيل جميع التعليمات البرمجية أدناه على كل من Windows و OSX ، وبالطبع على Raspberry Pi. يتبع هذا
المجلس N3 - يمكنك تصحيح البرنامج على جهاز كمبيوتر عادي ، وتحميل النسخة النهائية إلى Raspberry Pi. قد تضطر فقط إلى إنشاء وظائف مجمعة لأساليب GPIO ؛ كل شيء آخر سوف يعمل.
لذلك ، مهمتنا هي توفير الوصول إلى التطبيق من خلال متصفح منتظم. لأنه أنيق وعصري ، والشباب ، و "إنترنت الأشياء" هو كل شيء لدينا.
الأسلوب 1: سطر الأوامر
أسهل طريقة ، لا تتطلب أي برمجة على الإطلاق.
حدد المجلد المطلوب في Raspberry Pi ، وأدخل الأمر:
python3 -m http.server 5000
هذا كل شيء ، يعمل خادم الملفات على Raspberry Pi! يكفي الانتقال إلى صفحة
http: //192.168.1.102►000 وسنرى ملفاتنا في المتصفح:

هذا ملائم بدرجة كافية إذا كنت بحاجة إلى فتح الوصول عن بعد إلى أي ملفات بأقل جهد ممكن. يمكنك أيضًا إدخال الأمر
sudo python3 -m http.server 80 وبدء تشغيل الخادم باستخدام المنفذ 80 القياسي ، وهذا لن يشير إلى المنفذ الموجود في شريط العناوين في المتصفح.
بالمناسبة ، إذا أردنا أن يعمل الخادم حتى بعد إغلاق الجهاز ، فيمكننا استخدام الأمر
sudo nohup python3 -m http.server 80 & command - هذا سيبدأ العملية في الخلفية. يمكنك قتل مثل هذا البرنامج عن طريق إعادة التشغيل ، أو عن طريق إدخال الأمر
sudo killall python3 في سطر الأوامر.
الطريقة 2: SimpleHTTPServer
يمكننا ببساطة دمج نفس الخادم في برنامج Python الخاص بنا ، ولهذا يكفي تشغيله في سلسلة رسائل منفصلة عند بدء البرنامج. الآن ، لا نحتاج إلى عناء سطر الأوامر ، أثناء تشغيل البرنامج ، سيعمل الخادم.
import http.server import socketserver from threading import Thread import os def server_thread(port): handler = http.server.SimpleHTTPRequestHandler with socketserver.TCPServer(("", port), handler) as httpd: httpd.serve_forever() if __name__ == '__main__': port = 8000 print("Starting server at port %d" % port) os.chdir("/home/pi/Documents") Thread(target=server_thread, args=(port,)).start()
يكون الأمر os.chdir اختياريًا إذا أردنا توفير الوصول من الخادم إلى مجلد آخر غير المجلد الحالي.
الطريقة الثالثة: HTTPServer
هذا هو بالفعل خادم ويب متكامل ، قادر على معالجة طلبات GET و POST ، وإرجاع بيانات مختلفة ، وما إلى ذلك. لكن بالطبع ، سوف تحتاج إلى المزيد من التعليمات البرمجية.
النظر في إصدار خادم العمل الحد الأدنى:
from http.server import BaseHTTPRequestHandler, HTTPServer html = "<html><body>Hello from the Raspberry Pi</body></html>" class ServerHandler(BaseHTTPRequestHandler): def do_GET(self): if self.path == "/": self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(html.encode('utf-8')) else: self.send_error(404, "Page Not Found {}".format(self.path)) def server_thread(port): server_address = ('', port) httpd = HTTPServer(server_address, ServerHandler) try: httpd.serve_forever() except KeyboardInterrupt: pass httpd.server_close() if __name__ == '__main__': port = 8000 print("Starting server at port %d" % port) server_thread(port)
نطلق المتصفح ونرى صفحة HTML فيه:

من السهل تعليم هذا الخادم لإعطاء الملفات ، مثل الصور.
أضف علامة img إلى HTML:
html = '<html><body><h3>Hello from the Raspberry Pi</h3><img src="raspberrypi.jpg"/></body></html>'
الملف المصدر "raspberrypi.jpg" ، بالطبع ، يجب أن يكون في مجلد البرنامج. أضف القدرة على استقبال الملفات إلى وظيفة do_GET:
def do_GET(self): print("GET request, Path:", self.path) if self.path == "/": self.send_response(200) self.send_header('Content-type', 'text/html') self.end_headers() self.wfile.write(html.encode('utf-8')) elif self.path.endswith(".jpg"): self.send_response(200) self.send_header('Content-type', 'image/jpg') self.end_headers() with open(os.curdir + os.sep + self.path, 'rb') as file: self.wfile.write(file.read()) else: self.send_error(404, "Page Not Found {}".format(self.path))
نبدأ الخادم ، ونرى الصورة المقابلة:

من غير المرجح أن يفوز مثل هذا الخادم بمسابقة تصميم الويب ، لكنه يعمل جيدًا. يمكن إجبار الخادم بسهولة على تقديم المزيد من البيانات المفيدة ، على سبيل المثال ، لإرجاع معلومات حول تشغيل البرنامج. على سبيل المثال ، أضف معالجًا لوظيفة الحالة الجديدة:
import psutil import json def cpu_temperature(): return psutil.sensors_temperatures()['cpu-thermal'][0].current def disk_space(): st = psutil.disk_usage(".") return st.free, st.total def cpu_load() -> int: return int(psutil.cpu_percent()) def ram_usage() -> int: return int(psutil.virtual_memory().percent) def do_GET(self): ... elif self.path == "/status": self.send_response(200) self.send_header('Content-Type', 'application/json') self.end_headers() health = {'CPUTemp': cpu_temperature(), 'CPULoad': cpu_load(), "DiskFree": disk_space()[0], "DiskTotal": disk_space()[1], "RAMUse": ram_usage()} self.wfile.write(json.dumps(health).encode('utf-8'))
الآن يمكننا فتح الرابط
http: //192.168.1.102►000/status في المتصفح ورؤية معلمات النظام الحالية:

بالمناسبة ، كما ترون ، نرسل البيانات بتنسيق JSON ، مما سيتيح لنا استخدامه لبعض الطلبات الأخرى.
استنتاج
كل تصور في قطعة واحدة لا يصلح. الجزء الثاني
متاح هنا .
مهم: التدابير الأمنيةإذا كان سيتم استخدام عنوان IP خارجي لـ Raspberry Pi ، فيجب عليك بالتأكيد أن تضع في اعتبارك تدابير الأمان. قد يبدو أن لا أحد يحتاج إلى خادمك المصغر ، ولكن من السهل الآن إجراء مسح ضوئي لجميع نطاقات عناوين IP (على سبيل المثال ،
أوكرانيا والنمسا ) والعثور على جميع الأجهزة المتاحة. لذلك يجب عليك
بالتأكيد تغيير كلمة المرور على Raspberry Pi ، ويجب ألا تخزن أي معلومات سرية على الجهاز (مجلدات Dropbox والأسماء / كلمات المرور التي تم ترميزها في البرامج النصية والصور وما إلى ذلك).
ملاحظة: تمت إضافة استطلاع لفهم الصورة