Daftar Isi:
- Langkah 1: Saya Asumsikan, Anda Sudah Memiliki OpenWrt…
- Langkah 2: Perangkat Lunak dan Alat
- Langkah 3: Membuat Aplikasi Minimal
- Langkah 4: Menambahkan Beberapa Info: Jumlah Klien, Alamat IP WAN, Waktu Aktif
- Langkah 5: Kontrol WiFi: ON/OFF
- Langkah 6: Bagan Statistik Sistem
- Langkah 7: Status Pemintalan HDD
- Langkah 8: Bagan Aktivitas Jaringan
- Langkah 9: Pemberitahuan
- Langkah 10: Jalankan Otomatis di Latar Belakang
- Langkah 11: Kesimpulan & Ide Lebih Lanjut
Video: Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh: 11 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:56
Saya baru saja membeli router baru (Xiaomi Mi Router 3G). Dan tentu saja, perangkat keras baru yang mengagumkan ini mengilhami saya untuk mulai mengerjakan proyek ini;)
Langkah 1: Saya Asumsikan, Anda Sudah Memiliki OpenWrt…
Saya harus menginstal OpenWrt terlebih dahulu… Sebagian besar, saya mengikuti panduan ini (khusus untuk model router ini): https://dzone.com/articles/hacking-into-xiaomi-mi-…Saat mengerjakan ini, saya menemukan video yang luar biasa ini: Instalasi Openwrt, benchmark WiFi, Girlfriend Flashing. Wow aku tertawa terbahak-bahak!:)
Perhatian! Menginstal OpenWrt dapat merusak router Anda. Tetapi setelah selesai, itu membuka kekuatan dan kontrol penuh. Saya tidak cukup berani untuk memberikan instruksi apa pun di sini, karena mungkin berbeda untuk setiap model router.
Tetapi jika Anda sudah memiliki OpenWrt di router Anda, Anda dapat segera memulai tutorial ini
BTW, beberapa papan pengembangan datang dengan OpenWrt out-of-the-box, seperti Onion Omega, VoCore, LinkIt Smart 7688 dan lainnya. Tutorial ini juga menjelaskan beberapa ide dasar di balik pembuatan aplikasi semacam itu, sehingga Anda dapat dengan mudah menyesuaikannya untuk bekerja dengan Raspberry Pi dan sejenisnya.
Untuk proyek ini, saya sebagian besar akan menggunakan perangkat lunak pra-instal (tersedia di router yang mendukung OpenWrt). Tetapi untuk beberapa fungsi lanjutan, saya harus menginstal paket tambahan. Ini dilakukan hanya dalam beberapa klik, jadi saya akan menyertakan petunjuknya di sini.
Juga, saya berasumsi bahwa Anda sudah tahu:
- Cara membuka/menggunakan terminal SSH ke router OpenWrt Anda
- Cara mengunggah/mengedit file di router Anda (gunakan FileZilla atau scp/sftp)
- Cara bekerja dengan konsol Linux
Langkah 2: Perangkat Lunak dan Alat
Di sisi smartphone, saya menggunakan Blynk. Ini menyediakan aplikasi iOS dan Android untuk mengontrol perangkat keras apa pun. Anda dapat dengan mudah membangun antarmuka grafis yang indah untuk semua proyek Anda hanya dengan menarik dan melepas widget, langsung di ponsel cerdas Anda. Blynk sebagian besar digunakan dengan Arduino, Raspberry Pi, dll. Tapi mengapa tidak menjalankannya di router itu sendiri?;)
Di sisi perangkat saya akan menggunakan Lua untuk membuat skrip fungsionalitas yang diperlukan. Saya juga dapat menggunakan Python atau Node.js, tetapi sayangnya opsi ini tidak selalu tersedia, karena kurangnya sumber daya pada beberapa router. Atau C/C++, tetapi tidak begitu nyaman untuk digunakan (mengkompilasi ulang untuk setiap perubahan, dll.) Di sisi lain, Lua sudah diinstal sebelumnya, mudah digunakan dan dipelajari. Ini digunakan oleh antarmuka web default, LuCI.
Langkah 3: Membuat Aplikasi Minimal
Memulai dengan Blynk dan Lua semudah:
- Unduh Aplikasi Blynk (dari App Store, Google Play)
- Buat proyek baru dan dapatkan Token Otentikasi
- Ikuti petunjuk instalasi Blynk Lua untuk OpenWrt.
Gunakan SSH untuk mengakses konsol router Anda. Setelah menjalankan contoh default:
lua./contoh/klien.lua
Kita harus melihat sesuatu seperti ini:
Menghubungkan…
Jabat tangan SSL… Siap.
Yang berarti koneksi dua arah yang aman ke aplikasi telah dibuat!YAY!
Kami sekarang dapat dengan mudah memperluas contoh yang diberikan, sehingga melakukan sesuatu yang menarik. Saya telah membuat salinan contoh ini untuk mengeditnya:
cp./examples/client.lua./blynkmon.lua
Langkah 4: Menambahkan Beberapa Info: Jumlah Klien, Alamat IP WAN, Waktu Aktif
Ide dasarnya adalah untuk mendapatkan info dari OS secara berkala, melakukan beberapa perhitungan sederhana jika diperlukan, dan kemudian mengirimkan hasilnya ke Blynk untuk ditampilkan.
Di Linux/OpenWrt, kami memiliki beberapa cara untuk mendapatkan data sistem:
- Jalankan perintah, dan parsing teks yang dihasilkannya
- Jalankan perintah, dan perhatikan kode keluar yang dikembalikannya
- Baca file sistem, yang terletak di direktori /proc/ dan /sys/class/
Sekarang saya ingin menampilkan jumlah perangkat yang terhubung.
Ketika saya menjalankan cat /proc/net/arp di konsol, itu menampilkan daftar perangkat yang dikenal, bersama dengan alamat MAC dan IP mereka:
Alamat IP Jenis HW Bendera Alamat HW Perangkat Masker
192.168.10.206 0x1 0x2 78:02:f8:fb:d6:bf * br-lan 194.---------- 0x1 0x2 4c:5e:0c:14:e0:5c * eth0.2 192.168.10.162 0x1 0x0 04:b1:67:2f:e3:74 * br-lan
Kita dapat menguraikannya secara langsung di Lua, tetapi seringkali lebih mudah menggunakan utilitas khusus. Di Linux, ini adalah grep, head, tail, cut, wc, awk.
Untuk mendapatkan jumlah klien dari output arp, saya perlu memfilter tabel (menghapus item yang tidak terkait) dan menghitung baris tabel, yang menghasilkan perintah berikut:
cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l
Mari kita coba:
root@router:~/lua-blynk# cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l
1
Besar. Kami sekarang mendapatkan ide tentang bagaimana kami dapat mengumpulkan semua informasi yang diperlukan. Mari kita otomatisasi. Untuk membuat kode kita bersih dan dapat diperluas, mari buat beberapa fungsi pembantu:
fungsi exec_out(cmd)
file lokal = io.popen(cmd) jika bukan file maka kembalikan nil end local output = file:read('*all') file:close() print("Run: "..cmd.." -> ".. output) kembalikan output fungsi akhir read_file(path) local file = io.open(path, "rb") jika bukan file maka kembalikan nil end local content = file:read "*a" file:close() print("Read: "..path.." -> "..content) mengembalikan konten akhir
Dengan menggunakan utilitas ini, sekarang kita dapat mengimplementasikan fungsi pengambilan data yang sebenarnya:
fungsi getArpClients()
return tonumber(exec_out("cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l")) end function getUptime() return tonumber(exec_out("cat /proc/uptime | awk '{print $1 }'")) end function getWanIP() return exec_out("ifconfig eth0.2 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'") end
Anda dapat menjalankan bagian dari perintah shell ini, untuk mendapatkan pemahaman yang lebih dalam tentang cara kerjanya, dan menyesuaikannya dengan kebutuhan Anda.
Bagian termudah adalah mengirim data ke Aplikasi Blynk. Contoh default sudah menyiapkan timer, yang menjalankan beberapa kode setiap 5 detik, jadi kami hanya menggunakannya kembali:
tmr1 lokal = Timer:baru{interval = 5000, func = function()
blynk:virtualWrite(10, getArpClients()) blynk:virtualWrite(11, string.format("%.1f h", getUptime()/60/60)) blynk:virtualWrite(12, getWanIP()) end}
Di aplikasi, kami menambahkan 3 widget label, dan menetapkannya ke Pin Virtual 10, 11, 12 yang sesuai.
Meskipun ini berfungsi, ini agak tidak efisien, karena IP WAN atau jumlah klien tidak sering diperbarui. Mari kita perbaiki ini
Untuk WAN IP, kami memindahkannya ke pengendali yang terhubung. Ini akan dijalankan setiap kali router membuat koneksi ke Blynk Cloud. Ini harus cukup:
blynk:on("terhubung", fungsi()
print("Siap.") blynk:virtualWrite(12, getWanIP()) end)
Untuk Uptime dan Nomor Klien, kami membuat timer terpisah dengan 5 menit. selang:
tmr2 lokal = Timer:baru{interval = 5*60*1000, func = function()
blynk:virtualWrite(10, getArpClients()) blynk:virtualWrite(11, string.format("%.1f h", getUptime()/60/60)) end}
Langkah 5: Kontrol WiFi: ON/OFF
Selama ini, kami hanya mendapatkan beberapa info dari perangkat. Ayo coba kendalikan!
blynk:on("V20", fungsi(param)
if param[1] == "1" maka os.execute("wifi up") else os.execute("wifi down") end end)
Di sisi aplikasi, saya baru saja menambahkan widget Tombol (mode: Switch) dan menetapkannya ke V20.
Itu dia. Luar biasa.
Langkah 6: Bagan Statistik Sistem
fungsi getCpuLoad()
return tonumber(exec_out("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $2+$4}'")) end function getRamUsage() return tonumber(exec_out("free | grep Mem | awk ' {cetak ($3-$7)/$2 * 100.0}'")) selesai
Kita juga perlu mengirim data ke Blynk (mari kita gunakan tmr1 lagi):
tmr1 lokal = Timer:baru{interval = 5000, func = function()
blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) end}
Di Sisi Aplikasi, tambahkan widget SuperChart. Tambahkan CPU, aliran data RAM dan tetapkan ke V5, V6.
Langkah 7: Status Pemintalan HDD
Router saya memiliki drive HDD eksternal yang terhubung sebagai perangkat Penyimpanan Terpasang Jaringan. Masalahnya, drive ini dikonfigurasi untuk mulai berputar ketika seseorang mengaksesnya, dan untuk ditangguhkan setelah batas waktu.
Jelas, itu akan keren untuk mengetahui berapa kali itu menyala sepanjang hari. Jadi saya menambahkan aliran data lain ke bagan Sistem saya.
Sedikit lebih sulit untuk mendapatkan status drive HDD, tetapi saya menemukan caranya! Pertama-tama, instal smartmontools dari konsol SSH:
pembaruan opkg
opkg instal smartmontools
Kemudian, dalam kode kita, kita perlu menjalankan perintah khusus dan memeriksa kode keluar:
fungsi exec_ret(cmd)
local exit = os.execute(cmd) print("Run: "..cmd.." -> exit:"..exit) kembali keluar fungsi akhir getHddSpinning() if exec_ret("smartctl --nocheck=standby --info /dev/sda > /dev/null") == 0 lalu kembalikan 1 lagi kembalikan 0 akhir akhir
Catatan: HDD saya adalah /dev/sda
Langkah 8: Bagan Aktivitas Jaringan
Kami Membuat widget SuperChart lain (mirip dengan yang sebelumnya), Tambahkan aliran data TX dan RX, dan tetapkan ke V1 dan V2. Catatan: Saya ingin menampilkan WAN port statc, dan port WAN saya adalah eth0.2
Fungsi pembantu:
fungsi getWanRxBytes()
return tonumber(read_file("/sys/class/net/eth0.2/statistics/rx_bytes")) end function getWanTxBytes() return tonumber(read_file("/sys/class/net/eth0.2/statistics/tx_bytes")) akhir
Selanjutnya, tambahkan beberapa kode ke tmr1 yang sama. Ini lebih rumit, karena kita hanya perlu menghitung dan menampilkan perbedaan byte yang dikirim/diterima:
prevTx lokal, prevRx
local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() jika prevTx dan prevTx ~= tx lalu blynk:virtualWrite(1, tx - prevTx) akhiri jika prevRx dan prevRx ~= rx lalu blynk:virtualWrite(2, rx - prevRx) end prevTx = tx prevRx = rx blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) blynk:virtualWrite(7, getHddSpinning(7, getHddSpinning()) akhir}
Langkah 9: Pemberitahuan
Saya juga ingin diberi tahu ketika Router saya kehilangan daya atau koneksi internet. Untuk ini, kami memerlukan widget Notifikasi.
Dalam pengaturan widget, aktifkan "pemberitahuan offline". Tidak perlu kode. Tetapi kami juga dapat mengirim pemberitahuan khusus dari kode kami.
Langkah 10: Jalankan Otomatis di Latar Belakang
Untuk saat ini skrip harus dijalankan secara manual, tetapi saya ingin membuatnya berjalan di latar belakang secara otomatis saat router dinyalakan.
Ini dilakukan dengan membuat layanan. Buat file /etc/init.d/blynkmon:
#!/bin/sh /etc/rc.common
START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $pidfile]; lalu echo "blynkmon sudah berjalan" exit 0 fi cd /root/lua-blynk lua blynkmon.lua your-auth-token > /dev/null & echo $! > $pidfile } stop() { jika [! -f $pidfile]; lalu echo "blynkmon tidak berjalan" exit 0 fi kill -9 $(cat $pidfile) rm $pidfile }
Catatan: jangan lupa untuk mengganti token-auth Anda
Kemudian, aktifkan layanan blynkmon:
layanan blynkmon aktifkan
Langkah 11: Kesimpulan & Ide Lebih Lanjut
Anda dapat memindai QR ini untuk mendapatkan tiruan dari Proyek Blynk saya. Ini membutuhkan beberapa poin energi (4600), karena menggunakan banyak widget!
Temukan kode Lua Lengkap di sini:
Sejauh ini bagus, tapi di sini ada beberapa ide yang ingin saya tambahkan dalam waktu dekat.
- Tambahkan perintah Reboot. Cegah mengkliknya secara tidak sengaja.
- Tambahkan widget Terminal untuk menjalankan perintah linux apa pun.
-
Tambahkan grafik suhu CPU.
UPD: Sayangnya OpenWrt saat ini tidak memiliki beberapa driver untuk model router saya. Tetapi tersedia untuk banyak router lain
- Tambahkan pemberitahuan ketika perangkat tertentu bergabung/meninggalkan jaringan. Kami sudah memiliki info arp, sekarang hanya memeriksa alamat MAC.
Dengan cara ini, kita dapat memantau dan mengontrol Printer 3D, Robot, PC/Laptop biasa, Arduino/ESP8266/ESP32/RaspberryPi, perangkat Smart Home, dan hampir semua hal di sekitarnya. Beri tahu saya jika ada ide menarik lainnya. Apa pendapat Anda tentang semua ini?
Direkomendasikan:
Pengendali Jarak Jauh Berbasis LoRa - Kontrol Peralatan Dari Jarak Jauh: 8 Langkah
Pengendali Jarak Jauh Berbasis LoRa | Mengontrol Peralatan Dari Jarak Jauh: Hai, apa kabar, Guys! Akarsh di sini dari CETech. Dalam proyek ini, kita akan membuat remote control yang dapat digunakan untuk mengontrol berbagai instrumen seperti LED, motor atau jika kita berbicara tentang kehidupan kita sehari-hari, kita dapat mengontrol aplikasi rumah kita
Mengakses Raspberry Pi dari Jarak Jauh: SSH, Dekstop & FTP: 4 Langkah
Mengakses Raspberry Pi dari Jarak Jauh: SSH, Dekstop & FTP: Dalam posting ini, kita akan melihat 3 metode berbeda yang dengannya Anda dapat mengakses Raspberry Pi dari jarak jauh untuk membuatnya lebih mudah digunakan. Yang pertama adalah SSH, yang memungkinkan Anda mengakses terminal dari jarak jauh. Yang kedua adalah remo
Buat Robot Butler / Mobil / Tank ESP8266 Terkendali Jarak Jauh seharga $15 untuk Ios dan Android: 4 Langkah
Buat Robot Butler / Mobil / Tank ESP8266 Terkendali Jarak Jauh seharga $15 untuk iOS dan Android: Apakah Anda benci berjalan ke dapur untuk mengambil camilan? Atau untuk mendapatkan minuman baru? Ini semua dapat diperbaiki dengan butler sederhana yang dikendalikan dari jarak jauh seharga $ 15 ini. Sebelum kita melangkah lebih jauh, saya menjalankan proyek Kickstarter sekarang untuk strip led RGB yang dikendalikan suara
Mengakses Sistem File Root Jarak Jauh Menggunakan DB410 Sebagai Dongle Ethernet: 6 Langkah
Mengakses Sistem File Root Jarak Jauh Menggunakan DB410 Sebagai Dongle Ethernet: Tujuan: Menginstal toolchain dan mengkompilasi ulang kernel untuk memasukkan dukungan USB Ethernet CDC Gadget; Buat ulang boot.img dari Linaro untuk mem-boot USB Ethernet CDC; Buat server NFS untuk meng-host sistem file root; Konfigurasi IP di PERANGKAT dan HOST
Pelepasan Kabel Jarak Jauh Olympus Evolt E510 (Versi 2 Dengan Fokus Otomatis pada Jarak Jauh): 6 Langkah (dengan Gambar)
Olympus Evolt E510 Remote Cable Release (Versi 2 Dengan Fokus Otomatis pada Remote): Kemarin saya membuat remote satu tombol sederhana untuk Olympus E510 saya. Sebagian besar kamera memiliki tombol pelepas rana (tombol yang Anda tekan untuk mengambil gambar) yang memiliki dua mode. Jika tombol ditekan perlahan, kamera akan fokus otomatis dan mengukur cahaya