Isi kandungan:

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

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

Video: Aplikasi Android / iOS untuk Mengakses Router OpenWrt Anda Dari Jauh: 11 Langkah
Video: BAHAS IPHONE MURAH KOK MALAH FOKUS KE OPENWRT!? 2024, Jun
Anonim
Aplikasi Android / iOS untuk Mengakses Router OpenWrt Anda dari jauh
Aplikasi Android / iOS untuk Mengakses Router OpenWrt Anda dari jauh
Aplikasi Android / iOS untuk Mengakses Router OpenWrt Anda dari jauh
Aplikasi Android / iOS untuk Mengakses Router OpenWrt Anda dari jauh

Saya baru-baru ini membeli penghala baru (Xiaomi Mi Router 3G). Dan tentu saja, perkakasan baru yang hebat ini memberi inspirasi kepada saya untuk mula mengerjakan projek ini;)

Langkah 1: Saya Andaikan, Sudah Anda Buka OpenWrt…

Saya Andaikan, Sudah Anda Buka OpenWrt…
Saya Andaikan, Sudah Anda Buka OpenWrt…

Saya terpaksa memasang OpenWrt terlebih dahulu… Selalunya, saya mengikuti panduan ini (khusus untuk model penghala ini): https://dzone.com/articles/hacking-into-xiaomi-mi-… Semasa mengerjakan ini, saya dapati video hebat ini: Pemasangan Openwrt, penanda aras WiFi, Pacar Berkelip. Wow saya ketawa begitu keras!:)

Perhatian! Memasang OpenWrt dapat membuat penghala penghala anda. Tetapi setelah selesai, ia membuka kuasa dan kawalan sepenuhnya. Saya tidak cukup berani untuk memberikan arahan di sini, kerana ia mungkin berbeza untuk setiap model penghala.

Tetapi jika anda sudah mempunyai OpenWrt pada penghala anda, anda akan dapat memulakan dengan tutorial ini dalam waktu

BTW, beberapa papan pengembangan dilengkapi dengan OpenWrt di luar kotak, seperti Onion Omega, VoCore, LinkIt Smart 7688 dan lain-lain. Tutorial ini juga menerangkan beberapa idea asas di sebalik membuat aplikasi sedemikian, sehingga anda dapat menyesuaikannya dengan mudah untuk berfungsi dengan Raspberry Pi dan yang serupa.

Untuk projek ini, saya kebanyakan akan menggunakan perisian pra-pemasangan (tersedia di mana-mana penghala yang dibolehkan OpenWrt). Tetapi untuk beberapa fungsi canggih, saya terpaksa memasang pakej tambahan. Ini dilakukan hanya dalam beberapa klik, jadi saya akan memasukkan arahannya di sini.

Saya juga menganggap bahawa anda sudah tahu:

  • Cara membuka / menggunakan terminal SSH ke penghala OpenWrt anda
  • Cara memuat naik / mengedit fail pada penghala anda (gunakan FileZilla atau scp / sftp)
  • Cara bekerja dengan konsol Linux

Langkah 2: Perisian dan Alat

Perisian dan Alat
Perisian dan Alat

Di bahagian telefon pintar, saya menggunakan Blynk. Ia menyediakan aplikasi iOS dan Android untuk mengawal sebarang perkakasan. Anda boleh membina antara muka grafik yang indah untuk semua projek anda dengan hanya menyeret dan melepaskan widget, tepat di telefon pintar anda. Blynk kebanyakan digunakan dengan Arduino, Raspberry Pi, dll. Tetapi mengapa tidak menjalankannya pada penghala itu sendiri?;)

Di sisi peranti saya akan menggunakan Lua untuk menulis skrip fungsi yang diperlukan. Saya juga boleh menggunakan Python atau Node.js, tetapi sayangnya pilihan ini tidak selalu tersedia, kerana kekurangan sumber pada beberapa router. Atau C / C ++, tetapi Ia tidak begitu senang untuk dikerjakan (dikompilasi ulang untuk setiap perubahan, dll.) Sebaliknya, Lua sudah dipasang sebelumnya, mudah digunakan dan dipelajari. Ia digunakan oleh antara muka web lalai, LuCI.

Langkah 3: Membuat Aplikasi Minimal

Bermula dengan Blynk dan Lua semudah:

  • Muat turun Aplikasi Blynk (dari App Store, Google Play)
  • Buat projek baru dan dapatkan Auth Token
  • Ikuti arahan pemasangan Blynk Lua untuk OpenWrt.

Gunakan SSH untuk mengakses konsol penghala anda. Setelah menjalankan contoh lalai:

lua./contoh/client.lua

Kita harus melihat sesuatu seperti ini:

Menyambung…

Jabat tangan SSL … Sedia.

Maksudnya, hubungan dua arah yang selamat ke aplikasi dijalin! YAY!

Kita sekarang dapat memperluas contoh yang diberikan dengan mudah, jadi ia melakukan sesuatu yang menarik. Saya telah membuat salinan contoh ini untuk mengeditnya:

cp./contoh/client.lua./blynkmon.lua

Langkah 4: Menambah Beberapa Maklumat: Bilangan Pelanggan, Alamat IP WAN, Waktu Masa

Idea asasnya adalah untuk mendapatkan maklumat dari OS secara berkala, melakukan beberapa pengiraan mudah jika diperlukan, dan kemudian menghantar hasilnya ke Blynk untuk dipamerkan.

Di Linux / OpenWrt, kami mempunyai beberapa cara untuk mendapatkan data sistem:

  • Jalankan perintah, dan menguraikan teks yang dikeluarkannya
  • Jalankan arahan, dan perhatikan kod keluar yang dikembalikannya
  • Baca fail sistem, yang terdapat di / proc / dan / sys / class / direktori

Sekarang saya mahu memaparkan jumlah peranti yang disambungkan.

Apabila saya menjalankan cat / proc / net / arp di konsol, ia mengeluarkan senarai peranti yang diketahui, bersama dengan alamat MAC dan IP mereka:

Alamat IP jenis HW Bendera Alamat HW Topeng Peranti

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 boleh menguraikannya secara langsung di Lua, tetapi selalunya lebih mudah menggunakan utiliti khusus. Di Linux, ini adalah grep, head, tail, cut, wc, awk.

Untuk mendapatkan jumlah pelanggan dari output arp, saya perlu menyaring jadual (membuang item yang tidak berkaitan) dan mengira baris jadual, yang menghasilkan perintah berikut:

kucing / proc / net / arp | grep br-lan | grep 0x2 | wc -l

Mari mencubanya:

root @ router: ~ / lua-blynk # cat / proc / net / arp | grep br-lan | grep 0x2 | wc -l

1

Hebat. Kami sekarang mendapat idea bagaimana kita dapat mengumpulkan semua maklumat yang diperlukan. Mari automatikkannya. Untuk menjadikan kod kami bersih dan dapat diperluas, mari buat beberapa fungsi pembantu:

fungsi exec_out (cmd)

fail tempatan = io.popen (cmd) jika tidak berkas maka kembalikan nil akhir keluaran tempatan = fail: baca ('* semua') fail: tutup () cetak ("Jalankan:"..cmd.. "->".. output) kembali fungsi akhir fungsi read_file (path) fail tempatan = io.open (jalan, "rb") jika tidak memfailkan maka kembalikan nil akhir kandungan tempatan = fail: baca "* a" fail: tutup () cetak ("Baca: "..path.." -> "..content) mengembalikan kandungan akhir

Dengan menggunakan utiliti ini, kita sekarang dapat melaksanakan fungsi pengambilan data yang sebenarnya:

fungsi getArpClients ()

return tonumber (exec_out ("cat / proc / net / arp | grep br-lan | grep 0x2 | wc -l")) fungsi akhir getUptime () pulangan ton (exec_out ("cat / proc / uptime | awk '{cetak $ 1 } '")) fungsi akhir getWanIP () return exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") akhir

Anda boleh menjalankan bahagian perintah shell ini, untuk mendapatkan pemahaman yang lebih mendalam tentang cara kerjanya, dan menyesuaikannya dengan keperluan anda.

Bahagian paling mudah adalah menghantar data ke Aplikasi Blynk. Contoh lalai sudah menetapkan pemasa, yang menjalankan beberapa kod setiap 5 saat, jadi kami menggunakannya semula:

tempatan tmr1 = Pemasa: baru {selang = 5000, func = fungsi ()

blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f h", getUptime () / 60/60)) blynk: virtualWrite (12, getWanIP ()) akhir}

Dalam aplikasi, kami menambahkan 3 widget label, dan menetapkannya ke Virtual Pin 10, 11, 12 dengan sewajarnya.

Walaupun ini berfungsi, agak tidak cekap, kerana WAN IP atau bilangan pelanggan tidak kerap mengemas kini. Mari perbaiki ini

Untuk IP WAN, kami mengalihkannya ke pengendali yang disambungkan. Ia akan dijalankan setiap kali penghala membuat sambungan ke Blynk Cloud. Ini mesti mencukupi:

blynk: aktif ("disambungkan", fungsi ()

cetak ("Sedia.") blynk: virtualWrite (12, getWanIP ()) akhir)

Untuk Uptime dan Clients Number, kami membuat pemasa yang berasingan dengan 5 min. selang:

tempatan tmr2 = Pemasa: baru {selang = 5 * 60 * 1000, func = fungsi ()

blynk: virtualWrite (10, getArpClients ()) blynk: virtualWrite (11, string.format ("%. 1f h", getUptime () / 60/60)) akhir}

Langkah 5: Kawalan WiFi: ON / OFF

Kawalan WiFi: ON / OFF
Kawalan WiFi: ON / OFF

Sehingga sekarang, kami hanya mendapat beberapa maklumat dari peranti. Mari cuba kendalikan!

blynk: on ("V20", fungsi (param)

jika param [1] == "1" maka os.execute ("wifi up") lain os.execute ("wifi down") akhir akhir)

Di sisi aplikasi, saya baru saja menambahkan widget Butang (mod: Switch) dan memberikannya ke V20.

Itu sahaja. Hebat.

Langkah 6: Carta Statistik Sistem

Carta Statistik Sistem
Carta Statistik Sistem
Carta Statistik Sistem
Carta Statistik Sistem

fungsi getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2 + $ 4}'")) fungsi akhir getRamUsage () pulangan ton (exec_out ("percuma | grep Mem | awk ' akhir {print ($ 3- $ 7) / $ 2 * 100.0} '"))

Kami juga perlu menghantar data ke Blynk (mari kita gunakan tmr1 lagi):

tempatan tmr1 = Pemasa: baru {selang = 5000, func = fungsi ()

blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) akhir}

Di Bahagian Aplikasi, tambahkan widget SuperChart. Tambahkan CPU, streaming data RAM dan tetapkan ke V5, V6.

Langkah 7: Status Putaran HDD

Penghala saya mempunyai pemacu HDD luaran yang disambungkan sebagai peranti Penyimpanan Terlampir Rangkaian. Masalahnya, pemacu ini dikonfigurasi untuk mula berputar ketika seseorang mengaksesnya, dan untuk menangguhkan setelah tamat waktu.

Jelas sekali, akan menyenangkan apabila mengetahui berapa kali ia dihidupkan sepanjang hari. Oleh itu, saya menambahkan lagi aliran data ke carta Sistem saya.

Agak sukar untuk mendapatkan status pemacu HDD, tetapi saya menemui jalan! Pertama sekali, pasang smartmontool dari konsol SSH:

kemas kini opkg

opkg pasang smartmontools

Kemudian, dalam kod kami, kami perlu menjalankan perintah khas dan memeriksa kod keluar:

fungsi exec_ret (cmd)

lokal 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 kemudian pulangkan 1 yang lain kembali 0 hujung akhir

Nota: HDD saya adalah / dev / sda

Langkah 8: Carta Aktiviti Rangkaian

Carta Aktiviti Rangkaian
Carta Aktiviti Rangkaian

Kami Buat widget SuperChart yang lain (serupa dengan yang sebelumnya), Tambahkan aliran data TX dan RX, dan berikan kepada V1 dan V2. Catatan: Saya ingin memaparkan statc port WAN, dan port WAN saya adalah eth0.2

Fungsi pembantu:

fungsi getWanRxBytes ()

pulangan tanam (read_file ("/ sys / class / net / eth0.2 / statistik / rx_bytes")) fungsi akhir getWanTxBytes () pulangan ton (read_file ("/ sys / class / net / eth0.2 / statistik / tx_bytes")) akhir

Seterusnya, tambahkan beberapa kod ke tmr1 yang sama. Ini lebih rumit, kerana kita hanya perlu menghitung dan memaparkan perbezaan bait yang dihantar / diterima:

prevTx tempatan, prevRx

local tmr1 = Timer: new {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () if prevTx dan prevTx ~ = tx maka blynk: virtualWrite (1, tx - prevTx) berakhir jika prevRx dan prevRx ~ = rx kemudian blynk: virtualWrite (2, rx - prevRx) akhir prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning))

Langkah 9: Pemberitahuan

Pemberitahuan
Pemberitahuan

Saya juga ingin diberitahu apabila Penghala saya kehilangan kuasa atau sambungan internet. Untuk ini, kami memerlukan widget Pemberitahuan.

Dalam tetapan widget, aktifkan "pemberitahuan luar talian". Tidak perlu kod. Tetapi kami juga dapat menghantar pemberitahuan tersuai dari kod kami.

Langkah 10: Autorun di Latar Belakang

Buat masa ini skrip harus dijalankan secara manual, tetapi saya ingin membuatnya berjalan di latar belakang secara automatik ketika penghala dihidupkan.

Ini dilakukan dengan membuat perkhidmatan. Buat fail /etc/init.d/blynkmon:

#! / bin / sh /etc/rc.common

MULAI = 99 STOP = pidfile = "/ var / run / blynkmon.pid" start () {if [-f $ pidfile]; kemudian gema "blynkmon sudah berjalan" keluar 0 fi cd / root / lua-blynk lua blynkmon.lua your-auth-token> / dev / null & echo $! > $ pidfile} berhenti () {jika [! -f $ pidfile]; kemudian gema "blynkmon not running" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Catatan: jangan lupa ganti token-auth anda

Kemudian, aktifkan perkhidmatan blynkmon:

perkhidmatan blynkmon aktifkan

Langkah 11: Kesimpulan & Idea Lanjut

Kesimpulan & Idea Lanjut
Kesimpulan & Idea Lanjut

Anda boleh mengimbas QR ini untuk mendapatkan klon Projek Blynk saya. Ia memerlukan beberapa titik tenaga (4600), kerana ia menggunakan banyak widget!

Cari kod Lua Penuh di sini:

Sejauh ini bagus, tetapi berikut adalah beberapa idea yang ingin saya tambahkan dalam masa terdekat.

  • Tambah arahan Reboot. Elakkan mengkliknya secara tidak sengaja.
  • Tambahkan widget Terminal untuk menjalankan sebarang arahan linux.
  • Tambahkan carta suhu CPU.

    UPD: Sayangnya OpenWrt pada masa ini kekurangan beberapa pemacu untuk model penghala saya. Tetapi ia tersedia untuk banyak penghala lain

  • Tambahkan pemberitahuan apabila peranti tertentu bergabung / keluar dari rangkaian. Kami sudah mempunyai maklumat ARP, sekarang hanya periksa alamat MAC.

Dengan cara ini, kita dapat memantau dan mengawal Pencetak 3D, Robot, PC / Komputer riba biasa, barang Arduino / ESP8266 / ESP32 / RaspberryPi, peranti Smart Home, dan hampir apa sahaja. Beritahu saya jika ada idea menarik lain. Apa pendapat anda mengenai semua ini?

Disyorkan: