Sadržaj:

Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču: 11 koraka
Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču: 11 koraka

Video: Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču: 11 koraka

Video: Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču: 11 koraka
Video: kako daljinski špijunirati telefon 2024, Jun
Anonim
Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču
Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču
Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču
Android/iOS aplikacija za daljinski pristup vašem OpenWrt usmjerivaču

Nedavno sam kupio novi usmjerivač (Xiaomi Mi Router 3G). I naravno, ovaj novi, sjajan komad hardvera me inspirirao da počnem raditi na ovom projektu;)

Korak 1: Pretpostavljam da ste već otvorili OpenWrt…

Pretpostavljam da ste već otvorili OpenWrt…
Pretpostavljam da ste već otvorili OpenWrt…

Morao sam prvo instalirati OpenWrt … Uglavnom, slijedio sam ovaj vodič (specifičan za ovaj model usmjerivača): https://dzone.com/articles/hacking-into-xiaomi-mi-… Dok sam radio na ovome, našao sam ovaj odličan video: Openwrt instalacija, WiFi benchmark, Girlfriend Flashing. Kako sam se jako nasmijao!:)

Pažnja! Instaliranje OpenWrt -a može oštetiti vaš usmjerivač. Ali kad se završi, otključava punu snagu i kontrolu. Nisam dovoljno hrabar dati ovdje upute jer se mogu razlikovati za svaki model usmjerivača.

No, ako već imate OpenWrt na usmjerivaču, moći ćete započeti s ovim vodičem uskoro

BTW, neke razvojne ploče dolaze s OpenWrt-om, kao što su Onion Omega, VoCore, LinkIt Smart 7688 i druge. Ovaj vodič također objašnjava neke osnovne ideje iza stvaranja takvih aplikacija, tako da ih možete jednostavno prilagoditi za rad s Raspberry Pi i sličnim.

Za ovaj projekt uglavnom ću koristiti unaprijed instalirani softver (dostupan na bilo kojem usmjerivaču s omogućenim OpenWrt-om). Ali za neke napredne funkcionalnosti morao sam instalirati dodatne pakete. To se radi u samo nekoliko klikova, pa ću ovdje uključiti upute.

Takođe, pretpostavljam da već znate:

  • Kako otvoriti/koristiti SSH terminal na vašem OpenWrt usmjerivaču
  • Kako prenijeti/urediti datoteke na usmjerivaču (koristite FileZilla ili scp/sftp)
  • Kako raditi s Linux konzolom

Korak 2: Softver i alati

Softver i alati
Softver i alati

Sa pametnog telefona koristim Blynk. Pruža iOS i Android aplikacije za kontrolu bilo kojeg hardvera. Možete jednostavno izgraditi prekrasna grafička sučelja za sve svoje projekte jednostavnim povlačenjem i ispuštanjem widgeta, direktno na vašem pametnom telefonu. Blynk se uglavnom koristi s Arduinom, Raspberry Pi itd. Ali zašto ga ne pokrenete na samom usmjerivaču?;)

Na strani uređaja koristit ću Lua za skriptiranje potrebne funkcionalnosti. Također bih mogao koristiti Python ili Node.js, ali nažalost ove opcije nisu uvijek dostupne zbog nedostatka resursa na nekim usmjerivačima. Ili C/C ++, ali nije tako zgodno za rad (ponovno sastavljanje za svaku promjenu itd.) S druge strane, Lua je unaprijed instalirana, jednostavna je za upotrebu i učenje. Koristi ga zadano web sučelje, LuCI.

Korak 3: Kreiranje minimalne aplikacije

Početak rada s Blynk -om i Lua -om je jednostavan kao:

  • Preuzmite aplikaciju Blynk (s App Store -a, Google Play)
  • Kreirajte novi projekt i nabavite token autorizacije
  • Slijedite upute za instalaciju programa Blynk Lua za OpenWrt.

Koristite SSH za pristup konzoli usmjerivača. Nakon pokretanja zadanog primjera:

lua./examples/client.lua

Trebali bismo vidjeti ovako nešto:

Povezivanje…

SSL rukovanje … Spremno.

Što znači da je uspostavljena sigurna, dvosmjerna veza s aplikacijom! YAY!

Sada možemo lako proširiti navedeni primjer, pa čini nešto zanimljivo. Napravio sam kopiju ovog primjera da ga uredim:

kp./primjeri/klijent.lua./bliknkmon.lua

Korak 4: Dodavanje nekih informacija: Broj klijenata, WAN IP adresa, vrijeme rada

Osnovna ideja je povremeno dobivanje informacija iz OS -a, izvršavanje nekih jednostavnih proračuna ako je potrebno, a zatim slanje rezultata Blynku za prikaz.

U Linuxu/OpenWrt -u imamo nekoliko načina za dobivanje sistemskih podataka:

  • Pokrenite naredbu i raščlanite tekst koji izlazi
  • Pokrenite naredbu i gledajte izlaznu šifru koju vraća
  • Pročitajte sistemsku datoteku koja se nalazi u/proc/i/sys/class/direktorijumima

Sada želim prikazati broj povezanih uređaja.

Kad pokrenem cat/proc/net/arp na konzoli, on prikazuje popis poznatih uređaja, zajedno s njihovim MAC i IP adresama:

IP adresa HW tip Zastavice HW adresa Maska Uređaj

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

Možemo ga raščlaniti izravno u Lua -i, ali je često lakše koristiti specijalizirane alate. Na Linuxu su to grep, head, tail, cut, wc, awk.

Da bih dobio broj klijenata iz arp izlaza, moram filtrirati tablicu (ukloniti nepovezane stavke) i prebrojati redove tablice, što rezultira sljedećom naredbom:

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

Hajde da probamo:

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

1

Odlično. Sada imamo ideju o tome kako možemo prikupiti sve potrebne podatke. Hajde da ga automatizujemo. Da bismo naš kod učinili čistim i proširivim, kreirajmo neke pomoćne funkcije:

funkcija exec_out (cmd)

lokalna datoteka = io.popen (cmd) ako nije datoteka onda vrati nulti kraj lokalni izlaz = datoteka: čitanje ('*sve') datoteka: close () print ("Pokreni:"..cmd.. " ->".. output) return output end funkcija read_file (path) local file = io.open (path, "rb") ako nije file then return nil end local content = file: read "*a" file: close () print ("Read: "..path.." -> "..content) vraćanje kraja sadržaja

Pomoću ovih pomoćnih programa sada možemo implementirati stvarne funkcije dohvaćanja podataka:

funkcija getArpClients ()

return tonumber (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) završna funkcija getUptime () return tonumber (exec_out ("cat/proc/uptime | awk '{print $ 1 } '")) end funkcija getWanIP () povratak exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") kraj

Možete pokrenuti dijelove ovih naredbi ljuske, da biste stekli dublje razumijevanje o tome kako radi i da ga prilagodite svojim potrebama.

Najjednostavniji dio je slanje podataka u aplikaciju Blynk. Zadani primjer već postavlja mjerač vremena, koji pokreće neki kôd svakih 5 sekundi, pa ga jednostavno ponovo koristimo:

lokalni tmr1 = Tajmer: novi {interval = 5000, func = funkcija ()

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

U aplikaciju dodajemo 3 widgeta za oznake i dodjeljujemo ih Virtualnim pinovima 10, 11, 12 u skladu s tim.

Iako ovo funkcionira, prilično je neučinkovito jer se WAN IP ili broj klijenata ne ažuriraju tako često. Ispravimo ovo

Za WAN IP, premještamo ga na povezani rukovatelj. Pokretat će se svaki put kada usmjerivač uspostavi vezu s Blynk Cloudom. Ovo bi trebalo biti dovoljno:

blynk: on ("povezano", funkcija ()

print ("Spremno.") blynk: virtualWrite (12, getWanIP ()) kraj)

Za vrijeme neprekidnog rada i broj klijenata, stvaramo zasebni tajmer sa 5 minuta. interval:

lokalni tmr2 = Tajmer: novi {interval = 5*60*1000, func = function ()

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

Korak 5: WiFi kontrola: UKLJ./ISKLJ

WiFi kontrola: ON/OFF
WiFi kontrola: ON/OFF

Do sada smo samo dobivali neke podatke s uređaja. Pokušajmo to kontrolirati!

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

ako je param [1] == "1" onda os.execute ("wifi up") inače os.execute ("wifi down") end end)

Sa strane aplikacije, upravo sam dodao widget Button (način rada: Switch) i dodijelio ga V20.

To je to. Amazing.

Korak 6: Tabela sistemske statistike

Tablica sistemske statistike
Tablica sistemske statistike
Tablica sistemske statistike
Tablica sistemske statistike

funkcija getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'")) end funkcija getRamUsage () return tonumber (exec_out ("free | grep Mem | awk ' {print ($ 3- $ 7)/$ 2 * 100.0} '")) kraj

Također moramo poslati podatke u Blynk (upotrijebimo ponovo tmr1):

lokalni tmr1 = Tajmer: novi {interval = 5000, func = funkcija ()

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

Na strani aplikacije dodajte widget SuperChart. Dodajte CPU, RAM podatke i dodijelite ih V5, V6.

Korak 7: Status okretanja HDD -a

Moj usmjerivač ima vanjski HDD pogon povezan kao uređaj za pohranu povezan s mrežom. Stvar je u tome da je ovaj pogon konfiguriran da se počne vrtjeti kad mu netko pristupi i da se obustavi nakon isteka vremena.

Očigledno bi bilo super znati koliko se puta uključuje tokom dana. Tako sam dodao još jedan tok podataka u sistemski grafikon.

Malo je teže dobiti status HDD pogona, ali pronašao sam način! Prije svega, instalirajte smartmontools sa SSH konzole:

opkg update

opkg instalirajte smartmontools

Zatim, u našem kodu, moramo pokrenuti posebnu naredbu i provjeriti izlazni kod:

funkcija exec_ret (cmd)

lokalni izlaz = os.execute (cmd) ispis ("Pokreni:"..cmd.. " -> izlaz:".. izlaz) povratak funkcija završetka izlaza getHddSpinning () ako exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 zatim vratite 1 else vratite 0 kraj kraja

Napomena: moj HDD je /dev /sda

Korak 8: Tabela aktivnosti na mreži

Tablica mrežnih aktivnosti
Tablica mrežnih aktivnosti

Kreiramo još jedan SuperChart widget (sličan prethodnom), dodajemo TX i RX tokove podataka i dodjeljujemo V1 i V2. Napomena: Želim prikazati statistiku WAN porta, a moj WAN port je eth0.2

Pomoćne funkcije:

funkcija getWanRxBytes ()

return tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) end funkcija getWanTxBytes () return tonumber (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) kraj

Zatim dodajte neki kôd u isti tmr1. Ovo je složenije jer samo trebamo izračunati i prikazati razliku u prenesenim/primljenim bajtovima:

lokalni prevTx, prevRx

lokalni tmr1 = Tajmer: novi {interval = 5000, func = function () lokalni tx = getWanTxBytes () lokalni rx = getWanRxBytes () ako prevTx i prevTx ~ = tx tada blynk: virtualWrite (1, tx - prevTx) kraj ako prevRx i prevRx ~ = rx zatim blynk: virtualWrite (2, rx - prevRx) kraj prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning (7, getHddSpinning)) kraj}

Korak 9: Obavještenja

Obavještenja
Obavještenja

Također sam želio biti obaviješten kada moj usmjerivač izgubi napajanje ili internetsku vezu. Za to nam je potreban widget za obavijesti.

U postavkama widgeta omogućite "vanmrežno obavještavanje". Nije potreban kôd. Ali također možemo slati prilagođena obavještenja iz našeg koda.

Korak 10: Automatsko pokretanje u pozadini

Za sada se skripta mora ručno izvršiti, ali želim da se automatski pokreće u pozadini pri uključivanju usmjerivača.

To se postiže stvaranjem usluge. Kreirajte datoteku /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; zatim odjeknite "blynkmon već radi" izlaz 0 fi cd /root /lua-blynk lua blynkmon.lua vaš-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; zatim odjekni "blynkmon ne radi" izlaz 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Napomena: ne zaboravite zamijeniti token-auth-token

Zatim omogućite uslugu blynkmon:

usluga blynkmon enable

Korak 11: Zaključak i dodatne ideje

Zaključak i daljnje ideje
Zaključak i daljnje ideje

Možete skenirati ovaj QR da biste dobili klon mog Blynk projekta. On zahtijeva neke energetske bodove (4600), jer koristi puno widgeta!

Kompletan kôd Lua pronađite ovdje:

Zasad je dobro, ali evo nekoliko ideja koje bih želio dodati u bliskoj budućnosti.

  • Dodajte naredbu Reboot. Spriječite slučajno klikanje na nju.
  • Dodajte widget Terminal za pokretanje bilo koje naredbe za Linux.
  • Dodajte grafikon temperature procesora.

    UPD: Nažalost OpenWrt -u trenutno nedostaju neki upravljački programi za moj model usmjerivača. Ali dostupan je za mnoge druge usmjerivače

  • Dodajte obavijest kada se određeni uređaj pridruži/napusti mrežu. Već imamo arp podatke, sada provjeravamo samo MAC adresu.

Na ovaj način možemo nadzirati i kontrolirati 3D pisače, robote, običan računar/prijenosno računalo, Arduino/ESP8266/ESP32/RaspberryPi stvari, uređaje pametne kuće i gotovo sve u blizini. Javite mi ako imate još neke zanimljive ideje. Šta mislite o svemu tome?

Preporučuje se: