रास्पबेरी पाई पर पायथन सर्वर बनाने के 5 तरीके भाग 1

हाय, हैब्र।

आज, बड़ी संख्या में होम ऑटोमेशन प्रोजेक्ट (और न केवल) रास्पबेरी पाई का उपयोग करते हैं। उसी समय, यह सुविधाजनक है कि न केवल डिवाइस तक सीधी पहुंच हो, बल्कि एक ब्राउज़र का उपयोग करने के लिए भी - यह आपको कंप्यूटर से, और मोबाइल फोन से आवश्यक कार्रवाई करने की अनुमति देता है, और यहां तक ​​कि दुनिया में कहीं से भी दूरस्थ रूप से।



मान लीजिए कि हमारे पास पहले से ही एक सुपर पायथन कार्यक्रम है जो एक एलईडी को चमकाने से लेकर "स्मार्ट होम" या कम से कम बिल्ली फीडर तक कुछ बहुत महत्वपूर्ण कार्य करता है। मैं अलग-अलग तरीके दिखाऊंगा, सरल से जटिल तक, कुछ कोड जोड़कर इस तरह के एप्लिकेशन तक वेब एक्सेस कैसे करें।

लेख शुरुआती के लिए अभिप्रेत है, पेशेवरों को यहां मौलिक रूप से कुछ नया मिलने की संभावना नहीं है, लेकिन मुझे उम्मीद है कि यह लिनक्स में शुरुआती लोगों के लिए उपयोगी होगा। जो रुचि रखते हैं, उनके लिए कटौती जारी है।

नोट : यह लेख एक तरह का "प्रयोग" है, एक बार टिप्पणियों में उन्होंने शिकायत की थी कि शुरुआती लोगों के लिए हैबे के लिए पर्याप्त लेख नहीं थे। मैंने अंतराल को भरने की कोशिश की, लेकिन अनुमानों से यह स्पष्ट हो जाएगा कि इस प्रारूप में इसे जारी रखने का कोई मतलब है या नहीं।

तो चलिए शुरू करते हैं।

रास्पबेरी पाई कॉन्फ़िगर करें


चलो आशा करते हैं कि पाठक के पास रास्पबेरी पाई है जो वाईफाई या ईथरनेट के माध्यम से होम नेटवर्क से जुड़ा है, और पाठक को पता है कि आईपी एड्रेस क्या है और पोटीन का उपयोग करके एसएसएच के माध्यम से रास्पबेरी पाई को दूरस्थ रूप से कैसे लॉग इन किया जाए। हम तथाकथित हेडलेस कॉन्फ़िगरेशन पर विचार करेंगे - बिना कीबोर्ड और मॉनिटर के। लेकिन इससे पहले कि आप रास्पबेरी पाई के साथ कुछ करें, एक जोड़ी छोटे जीवन को हैक करती है।

युक्ति N १ । रास्पबेरी पाई के साथ दूरस्थ रूप से कुछ करने के लिए, आपको उस पर SSH को कॉन्फ़िगर करने की आवश्यकता है, और डिफ़ॉल्ट रूप से इसे बंद कर दिया गया है। आप पारंपरिक तरीके से जा सकते हैं और मानक विन्यासकर्ता को शुरू कर सकते हैं, लेकिन यह सरल हो सकता है - डिस्क छवि को रिकॉर्ड करने के बाद, एसडी कार्ड की जड़ में एक खाली ssh फ़ाइल (बिना एक्सटेंशन के) बनाएं। इसके अलावा, रास्पबेरी पाई लोड करने के बाद, SSH तुरंत सक्रिय हो जाएगा।

डिवाइस को दूरस्थ रूप से एक्सेस करने के लिए, आपको रास्पबेरी पाई के आईपी पते का पता लगाने की आवश्यकता है। ऐसा करने के लिए, बस अपने राउटर का कंट्रोल पैनल खोलें, वहां डीएचसीपी क्लाइंट की सूची ढूंढें, वहां से वांछित आईपी पते की प्रतिलिपि बनाएं (उदाहरण के लिए, यह 192.168.1.102 होगा), और कमांड putty.exe pi@195.168.1.102 (विंडोज के लिए) या ssh pi दर्ज करें। @ 192.168.1.102 लिनक्स या OSX के लिए।

हालांकि, आईपी पते बदल सकते हैं, उदाहरण के लिए, राउटर को रिबूट करने के बाद, यह हमेशा सुविधाजनक नहीं होता है। इस से टिप N2 - एक स्थिर आईपी पते को कॉन्फ़िगर करता है। ऐसा करने के लिए, रास्पबेरी पाई पर sudo nano /etc/dhcpcd.conf कमांड चलाएँ, और निम्नलिखित सेटिंग्स दर्ज करें:

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 

यदि आपको वाईफाई पते की आवश्यकता है, तो इंटरफ़ेस wlan0 होगा, यदि ईथरनेट तो eth0। आईपी ​​पते, निश्चित रूप से, आपको अपना खुद का विकल्प देना होगा। रिबूट के बाद, सुनिश्चित करें कि ifconfig कमांड जारी करके आईपी एड्रेस सही है।

अब सब कुछ तैयार है, हम पायथन शुरू कर सकते हैं। सभी उदाहरण पायथन 3.7 के लिए दिए गए हैं, क्योंकि 2.7 लंबे समय से पदावनत किया गया है, और इसे बनाए रखने के लिए कोई मतलब नहीं है। लेकिन छोटे कोड परिवर्तन के साथ, यदि आवश्यक हो, तो सब कुछ वहां काम करेगा। वैसे, पायथन भाषा क्रॉस-प्लेटफ़ॉर्म है - इसका मतलब है कि नीचे दिए गए सभी कोड विंडोज़ और ओएसएक्स दोनों पर और निश्चित रूप से रास्पबेरी पाई पर चलाए जा सकते हैं। परिषद N3 इस प्रकार है - आप एक नियमित पीसी पर कार्यक्रम को डीबग कर सकते हैं, और समाप्त संस्करण को रास्पबेरी पाई पर अपलोड कर सकते हैं। आपको केवल GPIO विधियों के लिए आवरण कार्य करना पड़ सकता है, बाकी सब काम करेगा।

इसलिए, हमारा कार्य नियमित ब्राउज़र के माध्यम से एप्लिकेशन तक पहुंच प्रदान करना है। इसके लिए स्टाइलिश, फैशनेबल, युवा और "इंटरनेट ऑफ थिंग्स" हमारी हर चीज है।

विधि 1: कमांड लाइन


सबसे आसान तरीका है, किसी भी प्रोग्रामिंग की आवश्यकता नहीं है।

रास्पबेरी पाई पर वांछित फ़ोल्डर का चयन करें, और कमांड दर्ज करें:

 python3 -m http.server 5000 

यही है, फ़ाइल सर्वर रास्पबेरी पाई पर चलता है! यह पृष्ठ http: //192.168.1.102 and000 पर जाने के लिए पर्याप्त है और हम ब्राउज़र में अपनी फाइलें देखेंगे:



यह पर्याप्त सुविधाजनक है यदि आपको न्यूनतम प्रयास के साथ किसी भी फाइल तक दूरस्थ पहुंच खोलने की आवश्यकता है। आप कमांड sudo python3 -m http.server 80 भी दर्ज कर सकते हैं और सर्वर को मानक 80 वें पोर्ट के साथ शुरू कर सकते हैं, यह ब्राउज़र के एड्रेस बार में पोर्ट को इंगित नहीं करेगा।

वैसे, अगर हम चाहते हैं कि सर्वर टर्मिनल को बंद करने के बाद भी काम करे, तो आप sudo nohup python3 -m http.server 80 & कमांड का उपयोग कर सकते हैं - यह पृष्ठभूमि में प्रक्रिया शुरू कर देगा। आप रीबूट करके या कमांड लाइन पर sudo Killall python3 कमांड दर्ज करके ऐसे प्रोग्राम को मार सकते हैं।

विधि 2: SimpleHTTPServer


हम अपने पायथन प्रोग्राम में एक ही सर्वर को काफी आसानी से एकीकृत कर सकते हैं, इसके लिए इसे प्रोग्राम प्रारंभ में एक अलग थ्रेड में शुरू करने के लिए पर्याप्त है। अब, हमें कमांड लाइन के साथ परेशान करने की आवश्यकता नहीं है, जबकि प्रोग्राम चल रहा है, सर्वर काम करेगा।

 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 कमांड वैकल्पिक है यदि हम सर्वर से वर्तमान फ़ोल्डर की तुलना में किसी अन्य फ़ोल्डर तक पहुंच प्रदान करना चाहते हैं।

विधि 3: 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 पेज देखते हैं:



यह सर्वर इमेजेज जैसे कि फाइल देना सिखाना आसान है।

HTML में img टैग जोड़ें:

 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 प्रारूप में डेटा भेजते हैं, जो हमें कुछ अन्य अनुरोधों के लिए इसका उपयोग करने की अनुमति देगा।

निष्कर्ष


एक टुकड़े में कल्पना की गई सभी फिट नहीं थे। दूसरा भाग यहाँ उपलब्ध है

महत्वपूर्ण: सुरक्षा उपाय

यदि रास्पबेरी पाई के लिए एक बाहरी आईपी पते का उपयोग किया जाएगा, तो आपको निश्चित रूप से सुरक्षा उपायों को ध्यान में रखना चाहिए। ऐसा लगता है कि किसी को भी आपके मिनी-सर्वर की आवश्यकता नहीं है, लेकिन अब आईपी पते की सभी श्रेणियों (उदाहरण के लिए, यूक्रेन , ऑस्ट्रिया ) को स्कैन करना आसान है और सभी उपलब्ध उपकरणों को ढूंढना है। इसलिए आपको रास्पबेरी पाई पर पासवर्ड को निश्चित रूप से बदलना चाहिए, और आपको डिवाइस (ड्रॉपबॉक्स फ़ोल्डर, नाम / पासवर्ड स्क्रिप्ट, फोटो, आदि में हार्डकोड) पर कोई गोपनीय जानकारी संग्रहीत नहीं करनी चाहिए।

पुनश्च: चित्र को समझने के लिए एक सर्वेक्षण जोड़ा गया

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


All Articles