Sadržaj:

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

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

Video: Aplikacija Android/iOS za daljinski pristup vašem OpenWrt usmjerivaču: 11 koraka
Video: Пульт дистанционного Управления от вашего телевизора прямо на смартфоне 2024, Studeni
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, strašan hardver inspirirao me 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 sjajan video: Openwrt instalacija, WiFi benchmark, Girlfriend Flashing. Wow kako sam se nasmijao!:)

Pažnja! Instaliranje OpenWrt -a može oštetiti vaš usmjerivač. No, nakon dovršetka 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 otvorenim OpenWrt-om, poput Onion Omega, VoCore, LinkIt Smart 7688 i drugih. Ovaj vodič također objašnjava neke osnovne ideje iza stvaranja takvih aplikacija, tako da ga 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). No za neke napredne funkcionalnosti morao sam instalirati dodatne pakete. To se radi u samo nekoliko klikova, pa ću ovdje uključiti upute.

Također, 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

Na strani pametnih telefona koristim Blynk. Nudi 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, izravno na vašem pametnom telefonu. Blynk se uglavnom koristi s Arduinom, Raspberry Pi itd. Ali zašto ga ne pokrenuti na samom usmjerivaču?;)

Sa strane 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 prikladno za rad (ponovno sastavljanje za svaku promjenu itd.) S druge strane, Lua je unaprijed instalirana, jednostavna je za korištenje i učenje. Koristi ga zadano web sučelje, LuCI.

Korak 3: Stvaranje minimalne aplikacije

Početak rada s Blynkom i Luaom je jednostavan kao:

  • Preuzmite aplikaciju Blynk (s App Storea, Google Playa)
  • Izradite novi projekt i nabavite token autorizacije
  • Slijedite upute za instalaciju programa Blynk Lua za OpenWrt.

Za pristup konzoli usmjerivača koristite SSH. Nakon pokretanja zadanog primjera:

lua./primjeri/klijent.lua

Trebali bismo vidjeti ovako nešto:

Povezivanje…

SSL rukovanje … Spremno.

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

Sada možemo lako proširiti dani primjer pa čini nešto zanimljivo. Napravio sam kopiju ovog primjera kako bih ga uredio:

k.č./primjeri/klijent.lua./blenkmon.lua

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

Osnovna ideja je povremeno dobivanje informacija iz OS -a, ako je potrebno izvršiti neka jednostavna izračunavanja, a zatim poslati rezultat Blynku za prikaz.

U sustavu Linux/OpenWrt imamo nekoliko načina za dobivanje podataka o sustavu:

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

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 Tip HW 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 često je 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 retke tablice, što rezultira sljedećom naredbom:

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

Pokušajmo:

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

1

Sjajno. Sada imamo ideju o tome kako možemo prikupiti sve potrebne podatke. Automatizirajmo ga. Kako bi naš kôd bio čist i proširiv, napravimo neke pomoćne funkcije:

funkcija exec_out (cmd)

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

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")) end function getUptime () return tonumber (exec_out ("cat/proc/uptime | awk '{print $ 1 } '")) end funkcija getWanIP () return exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") end

Možete pokrenuti dijelove ovih naredbi ljuske, kako biste stekli dublje razumijevanje kako to funkcionira i prilagodili je 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 ponovno koristimo:

lokalni tmr1 = Mjerač vremena: 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 s oznakama i prema tome ih dodjeljujemo Virtualnim pinovima 10, 11, 12.

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

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

blynk: on ("spojeno", funkcija ()

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

Za vrijeme neprekidnog rada i broj klijenata stvaramo zasebni mjerač vremena s 5 minuta. interval:

lokalni tmr2 = Mjerač vremena: 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: UKLJ./ISKLJ
WiFi kontrola: UKLJ./ISKLJ

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

blynk: uključeno ("V20", funkcija (param)

ako je param [1] == "1" tada 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. Zadivljujuće.

Korak 6: Tablica statistike sustava

Tablica statistike sustava
Tablica statistike sustava
Tablica statistike sustava
Tablica statistike sustava

funkcija 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 ' {print ($ 3- $ 7)/$ 2 * 100.0} '")) kraj

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

lokalni tmr1 = Mjerač vremena: novi {interval = 5000, func = funkcija ()

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

Na strani aplikacije dodajte widget SuperChart. Dodajte CPU, RAM podatkovne tokove i dodijelite V5, V6.

Korak 7: Status okretanja tvrdog diska

Moj usmjerivač ima vanjski HDD pogon spojen kao mrežni uređaj za pohranu. 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či tijekom dana. Stoga sam na grafikon sustava dodao još jedan tok podataka.

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

opkg ažuriranje

opkg instalirajte smartmontools

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

funkcija exec_ret (cmd)

local exit = os.execute (cmd) print ("Run:"..cmd.. " -> exit:".. exit) return funkcija završetka getHddSpinning () if 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: Tablica aktivnosti na mreži

Tablica mrežnih aktivnosti
Tablica mrežnih aktivnosti

Izrađujemo još jedan widget SuperChart (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

local tmr1 = Timer: new {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () ako prevTx i prevTx ~ = tx tada blynk: virtualWrite (1, tx - prevTx) kraj ako prevRx i prevRx ~ = rx onda 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: Obavijesti

Obavijesti
Obavijesti

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

U postavkama widgeta omogućite "offline obavijest". Nije potreban kôd. Ali također možemo poslati prilagođene obavijesti iz našeg koda.

Korak 10: Automatsko pokretanje u pozadini

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

To se postiže stvaranjem usluge. Izradite 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 your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; zatim odjekni "blynkmon ne radi" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Napomena: ne zaboravite zamijeniti svoj-auth-token

Zatim omogućite uslugu blynkmon:

usluga blynkmon enable

Korak 11: Zaključak i daljnje 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 točke (4600), jer koristi puno widgeta!

Ovdje pronađite potpuni kôd Lua:

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

  • Dodajte naredbu Ponovno pokretanje. Spriječite slučajno klikanje.
  • Dodajte widget Terminal za pokretanje bilo koje naredbe za Linux.
  • Dodajte grafikon temperature CPU -a.

    UPD: Nažalost OpenWrt -u trenutno nedostaju neki upravljački programi za moj model usmjerivača. No, 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čna računala/prijenosna računala, Arduino/ESP8266/ESP32/RaspberryPi stvari, uređaje Smart Home i gotovo sve u blizini. Javite mi ako imate još kakvih zanimljivih ideja. Što mislite o svemu tome?

Preporučeni: