Daftar Isi:

Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh: 11 Langkah
Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh: 11 Langkah

Video: Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh: 11 Langkah

Video: Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh: 11 Langkah
Video: Setting ini agar iphone aman saat terhubung wifi umum 2024, November
Anonim
Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh
Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh
Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh
Aplikasi Android/iOS untuk Mengakses Router OpenWrt Anda dari Jarak Jauh

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 Asumsikan, Anda Sudah Memiliki OpenWrt…
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

Perangkat Lunak dan Alat
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

Kontrol WiFi: ON/OFF
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

Bagan Statistik Sistem
Bagan Statistik Sistem
Bagan Statistik Sistem
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

Bagan Aktivitas Jaringan
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

Pemberitahuan
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

Kesimpulan & Ide Lebih Lanjut
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: