5 Cara Membuat Server Python di Raspberry Pi Bagian 1

Hai, Habr.

Saat ini, sejumlah besar proyek otomatisasi rumah (dan tidak hanya) menggunakan Raspberry Pi. Pada saat yang sama, cukup nyaman untuk tidak hanya memiliki akses langsung ke perangkat, tetapi juga menggunakan browser - ini memungkinkan Anda untuk melakukan tindakan yang diperlukan dari komputer dan ponsel, dan bahkan dari jarak jauh dari mana saja di dunia.



Misalkan kita sudah memiliki program super Python yang melakukan sesuatu yang sangat penting, dari mem-flash LED hingga mengendalikan "rumah pintar" atau setidaknya pengumpan kucing. Saya akan menunjukkan berbagai cara, dari yang sederhana hingga yang rumit, cara membuat akses web ke aplikasi semacam itu dengan menambahkan beberapa kode.

Artikel ini ditujukan untuk pemula, para profesional sepertinya tidak akan menemukan sesuatu yang baru secara radikal di sini, tapi saya harap ini akan bermanfaat bagi para pendatang baru di Linux. Bagi yang berminat, lanjutkan di bawah cut.

Catatan : artikel ini adalah semacam "percobaan", sekali dalam komentar mereka mengeluh bahwa tidak ada cukup artikel untuk Habré untuk pemula. Saya mencoba mengisi kekosongan, tetapi dengan perkiraan akan menjadi jelas apakah masuk akal untuk melanjutkan dalam format ini atau tidak.

Jadi mari kita mulai.

Konfigurasikan Raspberry Pi


Mari berharap pembaca memiliki Raspberry Pi yang terhubung ke jaringan rumah melalui WiFi atau Ethernet, dan pembaca tahu apa alamat IP dan bagaimana cara login jarak jauh ke Raspberry Pi melalui SSH menggunakan dempul. Kami akan mempertimbangkan apa yang disebut konfigurasi tanpa kepala - tanpa keyboard dan monitor. Tetapi sebelum Anda melakukan sesuatu dengan Raspberry Pi, beberapa peretas kecil.

Kiat N1 . Untuk melakukan sesuatu dari jarak jauh dengan Raspberry Pi, Anda perlu mengkonfigurasi SSH di atasnya, dan secara default dimatikan. Anda dapat menggunakan cara tradisional dan memulai konfigurator standar, tetapi bisa lebih sederhana - setelah merekam gambar disk, cukup buat file ssh kosong (tanpa ekstensi) di root kartu SD. Selanjutnya, setelah memuat Raspberry Pi, SSH akan segera aktif.

Untuk mengakses perangkat dari jarak jauh, Anda perlu mengetahui alamat IP Raspberry Pi. Untuk melakukan ini, cukup buka panel kontrol router Anda, temukan daftar klien DHCP di sana, salin alamat IP yang diinginkan dari sana (misalnya, akan menjadi 192.168.1.102), dan masukkan perintah putty.exe pi@192.168.1.102 (untuk Windows) atau ssh pi @ 192.168.1.102 untuk Linux atau OSX.

Namun, alamat IP dapat berubah, misalnya, setelah me-reboot router, ini tidak selalu nyaman. Dari sini, ikuti Tip N2 - konfigurasikan alamat IP statis. Untuk melakukan ini, jalankan perintah sudo nano /etc/dhcpcd.conf pada Raspberry Pi, dan masukkan pengaturan berikut:

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 

Jika Anda memerlukan alamat WiFi, maka antarmuka akan wlan0, jika Ethernet maka eth0. Alamat IP, tentu saja, Anda harus mengganti sendiri. Setelah reboot, pastikan alamat IP sudah benar dengan mengeluarkan perintah ifconfig .

Sekarang semuanya sudah siap, kita bisa mulai Python. Semua contoh diberikan untuk Python 3.7, karena 2.7 telah lama ditinggalkan, dan tidak masuk akal untuk mempertahankannya. Tetapi dengan perubahan kode kecil, semuanya akan bekerja di sana, jika perlu. Omong-omong, bahasa Python adalah lintas-platform - ini berarti bahwa semua kode di bawah ini dapat dijalankan di Windows dan OSX, dan tentu saja, di Raspberry Pi. Dewan N3 mengikuti dari ini - Anda dapat men-debug program pada PC biasa, dan mengunggah versi yang sudah selesai ke Raspberry Pi. Anda mungkin hanya perlu membuat fungsi wrapper untuk metode GPIO, semuanya akan berfungsi.

Jadi, tugas kita adalah menyediakan akses ke aplikasi melalui browser biasa. Karena penuh gaya, modis, awet muda, dan "Internet of things" adalah segalanya bagi kami.

Metode 1: baris perintah


Cara termudah, tidak memerlukan pemrograman sama sekali.

Pilih folder yang diinginkan pada Raspberry Pi, dan masukkan perintah:

 python3 -m http.server 5000 

Itu saja, server file berjalan pada Raspberry Pi! Cukup dengan membuka halaman http: //192.168.1.102►000 dan kita akan melihat file-file kita di browser:



Ini cukup nyaman jika Anda perlu membuka akses jarak jauh ke file apa pun dengan upaya minimal. Anda juga dapat memasukkan perintah sudo python3 -m http.server 80 dan memulai server dengan port ke-80 standar, ini tidak akan menunjukkan port di bilah alamat browser.

Omong-omong, jika kita ingin server bekerja bahkan setelah menutup terminal, kita dapat menggunakan sudo nohup python3 -m http.server 80 & perintah - ini akan memulai proses di latar belakang. Anda dapat membunuh program seperti itu dengan me-reboot, atau dengan memasukkan perintah sudo killall python3 pada baris perintah.

Metode 2: SimpleHTTPServer


Kita dapat dengan mudah mengintegrasikan server yang sama ke dalam program Python kita, untuk ini cukup untuk memulainya di utas terpisah pada awal program. Sekarang, kita tidak perlu repot dengan command line, ketika program sedang berjalan, server akan bekerja.

 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() 

Perintah os.chdir bersifat opsional jika kita ingin memberikan akses dari server ke beberapa folder selain yang sekarang.

Metode 3: Server HTTPS


Ini sudah merupakan server web lengkap, yang mampu memproses permintaan GET dan POST, mengembalikan data yang berbeda, dll. Tetapi tentu saja, Anda akan memerlukan lebih banyak kode.

Pertimbangkan versi server yang berfungsi minimal:

 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) 

Kami meluncurkan browser, dan melihat halaman HTML kami di dalamnya:



Server ini mudah diajarkan untuk memberikan file, seperti gambar.

Tambahkan tag img ke HTML:

 html = '<html><body><h3>Hello from the Raspberry Pi</h3><img src="raspberrypi.jpg"/></body></html>' 

File sumber "raspberrypi.jpg", tentu saja, harus ada di folder program. Tambahkan kemampuan untuk menerima file ke fungsi 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)) 

Kami memulai server, dan kami melihat gambar yang sesuai:



Tidak mungkin server seperti itu akan memenangkan kontes desain web, tetapi berfungsi dengan baik. Server dapat dengan mudah dipaksa untuk memberikan data yang lebih bermanfaat, misalnya, untuk mengembalikan informasi tentang pengoperasian program. Misalnya, tambahkan penangan untuk fungsi status baru:

 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')) 

Sekarang kita dapat membuka tautan http: //192.168.1.102►000/status di browser dan melihat parameter sistem saat ini:



Omong-omong, seperti yang Anda lihat, kami mengirim data dalam format JSON, yang memungkinkan kami menggunakannya untuk beberapa permintaan lainnya.

Kesimpulan


Semua dikandung dalam satu potong tidak cocok. Bagian kedua tersedia di sini .

Penting: langkah-langkah keamanan

Jika alamat IP eksternal akan digunakan untuk Raspberry Pi, Anda pasti harus mengingat langkah-langkah keamanan. Tampaknya tidak ada yang membutuhkan mini-server Anda, tetapi sekarang mudah untuk memindai semua rentang alamat IP (sebagai contoh, Ukraina , Austria ) dan menemukan semua perangkat yang tersedia. Jadi Anda harus mengubah kata sandi di Raspberry Pi, dan Anda tidak boleh menyimpan informasi rahasia apa pun di perangkat (folder Dropbox, nama / kata sandi yang di-hardcode dalam skrip, foto, dll.).

PS: Survei ditambahkan untuk memahami gambar

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


All Articles