Kazalo:

Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt: 11 korakov
Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt: 11 korakov

Video: Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt: 11 korakov

Video: Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt: 11 korakov
Video: How to Connect iPhone to Android With Anydesk 2024, November
Anonim
Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt
Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt
Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt
Aplikacija Android/iOS za oddaljeni dostop do usmerjevalnika OpenWrt

Pred kratkim sem kupil nov usmerjevalnik (Xiaomi Mi Router 3G). In seveda, ta nov, super kos strojne opreme me je navdihnil, da sem začel delati na tem projektu;)

1. korak: Predvidevam, da že imate OpenWrt…

Predvidevam, da že imate OpenWrt…
Predvidevam, da že imate OpenWrt…

Najprej sem moral namestiti OpenWrt … Večinoma sem sledil temu priročniku (posebej za ta model usmerjevalnika): https://dzone.com/articles/hacking-into-xiaomi-mi-… Med delom na tem sem našel ta super video: Odprta namestitev, merilo WiFi, utripanje dekleta. Kako sem se smejal!:)

Pozor! Namestitev programa OpenWrt lahko usmeri vaš usmerjevalnik. Ko pa konča, odklene polno moč in nadzor. Nisem dovolj pogumen, da bi tukaj dal navodila, saj so lahko za vsak model usmerjevalnika drugačna.

Če pa na usmerjevalniku že imate OpenWrt, boste s to vadnico lahko začeli pravočasno

BTW, nekatere razvojne plošče so opremljene z OpenWrt, kot so Onion Omega, VoCore, LinkIt Smart 7688 in druge. Ta vadnica pojasnjuje tudi nekaj osnovnih idej za ustvarjanje takšnih aplikacij, tako da jih lahko preprosto prilagodite za delo z Raspberry Pi in podobnimi.

Za ta projekt bom večinoma uporabljal vnaprej nameščeno programsko opremo (na voljo na katerem koli usmerjevalniku, ki podpira OpenWrt). Toda za nekatere napredne funkcije sem moral namestiti dodatne pakete. To se naredi v nekaj klikih, zato bom tukaj vključil navodila.

Predvidevam tudi, da že veste:

  • Kako odpreti/uporabiti terminal SSH na usmerjevalniku OpenWrt
  • Kako naložiti/urediti datoteke na usmerjevalniku (uporabite FileZilla ali scp/sftp)
  • Kako delati s konzolo Linux

Korak: Programska oprema in orodja

Programska oprema in orodja
Programska oprema in orodja

Na strani pametnega telefona uporabljam Blynk. Ponuja aplikacije za iOS in Android za nadzor katere koli strojne opreme. Lepe grafične vmesnike za vse svoje projekte lahko preprosto sestavite tako, da preprosto povlečete in spustite pripomočke neposredno na pametnem telefonu. Blynk se večinoma uporablja z Arduinom, Raspberry Pi itd. Toda zakaj ga ne bi zagnali na samem usmerjevalniku?;)

Na strani naprave bom uporabil Lua za skriptiranje potrebne funkcionalnosti. Lahko bi uporabil tudi Python ali Node.js, vendar na žalost te možnosti zaradi pomanjkanja virov na nekaterih usmerjevalnikih niso vedno na voljo. Ali pa C/C ++, vendar ni tako priročno za delo (ponovno sestavljanje za vsako spremembo itd.) Po drugi strani pa je Lua vnaprej nameščen, enostaven za uporabo in učenje. Uporablja ga privzeti spletni vmesnik LuCI.

3. korak: Ustvarite minimalno aplikacijo

Začetek uporabe Blynk in Lua je preprost:

  • Prenesite aplikacijo Blynk (iz App Store, Google Play)
  • Ustvarite nov projekt in pridobite žeton za preverjanje pristnosti
  • Sledite navodilom za namestitev programa Blynk Lua za OpenWrt.

Za dostop do konzole usmerjevalnika uporabite SSH. Po zagonu privzetega primera:

lua./examples/client.lua

Videti bi morali nekaj takega:

Povezovanje…

SSL rokovanje … Pripravljeno.

Kar pomeni, da je vzpostavljena varna, dvosmerna povezava z aplikacijo!

Predloženi primer lahko preprosto razširimo, tako da naredi nekaj zanimivega. Ustvaril sem kopijo tega primera, da ga uredim:

cp./examples/client.lua./blynkmon.lua

4. korak: Dodajte nekaj informacij: Število strank, naslov IP WAN, čas delovanja

Osnovna ideja je, da podatke iz operacijskega sistema občasno dobimo, po potrebi izvedemo nekaj preprostih izračunov in nato rezultat pošljemo Blynku za prikaz.

V sistemu Linux/OpenWrt imamo sistemske podatke za pridobivanje več podatkov:

  • Zaženite ukaz in razčlenite besedilo, ki ga prikaže
  • Zaženite ukaz in si oglejte izhodno kodo, ki jo vrne
  • Preberite sistemsko datoteko, ki se nahaja v imenikih/proc/in/sys/class/

Zdaj želim prikazati število povezanih naprav.

Ko na konzoli zaženem cat/proc/net/arp, izpiše seznam znanih naprav skupaj z njihovimi naslovi MAC in IP:

Naslov IP Vrsta HW Zastavice Naslov HW Maska Naprava

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

Lahko ga razčlenimo neposredno v Lua, vendar je pogosto lažje uporabljati specializirane pripomočke. V Linuxu so to grep, head, tail, cut, wc, awk.

Če želim pridobiti število strank iz izhoda arp, moram filtrirati tabelo (odstraniti nepovezane elemente) in prešteti vrstice tabele, kar ima za posledico naslednji ukaz:

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

Poskusimo:

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

1

Super. Zdaj imamo idejo, kako lahko zberemo vse zahtevane podatke. Naj bo naša koda čista in razširljiva, ustvarimo nekaj pomožnih funkcij:

funkcija exec_out (cmd)

lokalna datoteka = io.popen (cmd) če ni datoteka, potem vrni ničelni lokalni izhod = datoteka: branje ('*vse') datoteka: close () print ("Zaženi:"..cmd.. " ->".. output) vrne izhodno končno funkcijo read_file (pot) lokalno datoteko = io.open (pot, "rb") če ni datoteka, potem vrni ničelno lokalno vsebino = datoteka: preberi "*a" datoteka: close () print ("Preberi: "..path.." -> "..content) vrne vsebino konec

S temi pripomočki lahko zdaj implementiramo dejanske funkcije pridobivanja podatkov:

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 () vrnitev exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") end

Lahko zaženete dele teh ukazov lupine, da bolje razumete, kako deluje, in ga prilagodite svojim potrebam.

Najlažji del je pošiljanje podatkov v aplikacijo Blynk. Privzeti primer že nastavlja časovnik, ki vsakih 5 sekund zažene nekaj kode, zato ga preprosto ponovno uporabimo:

local tmr1 = Timer: new {interval = 5000, func = function ()

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

V aplikaciji dodamo 3 pripomočke za oznake in jih ustrezno dodelimo navideznim zatičem 10, 11, 12.

Čeprav to deluje, je precej neučinkovito, saj se IP ali število odjemalcev WAN ne posodabljata tako pogosto. Odpravimo to

Za WAN IP ga premaknemo v povezani upravljavec. Izvajal se bo vsakič, ko usmerjevalnik vzpostavi povezavo z Blynk Cloud. To bi moralo zadostovati:

blynk: on ("povezan", funkcija ()

print ("Pripravljeno.") blynk: virtualWrite (12, getWanIP ()) konec)

Za čas delovanja in število strank ustvarimo ločen časomer s 5 minutami. interval:

local tmr2 = Timer: new {interval = 5*60*1000, func = function ()

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

5. korak: Nadzor WiFi: VKLOP/IZKLOP

Upravljanje WiFi: VKLOP/IZKLOP
Upravljanje WiFi: VKLOP/IZKLOP

Doslej smo od naprave dobivali le nekaj podatkov. Poskusimo to nadzorovati!

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

če je param [1] == "1", potem os.execute ("wifi up") drugače os.execute ("wifi down") end end)

Na strani aplikacije sem dodal pripomoček za gumbe (način: stikalo) in ga dodelil V20.

To je to. Neverjetno.

6. korak: Tabela sistemske statistike

Tabela sistemske statistike
Tabela sistemske statistike
Tabela sistemske statistike
Tabela sistemske statistike

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} '")) konec

Podatke moramo poslati tudi Blynku (uporabimo spet tmr1):

local tmr1 = Timer: new {interval = 5000, func = function ()

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

Na strani aplikacije dodajte gradnik SuperChart. Dodajte podatkovne tokove CPU -ja, RAM -a in jih dodelite V5, V6.

7. korak: stanje vrtenja trdega diska

Moj usmerjevalnik ima zunanji pogon trdega diska, ki je povezan kot naprava za shranjevanje v omrežju. Dejstvo je, da je ta pogon konfiguriran tako, da se začne vrteti, ko nekdo dostopa do njega, in da se prekine po izteku časovne omejitve.

Očitno bi bilo kul vedeti, kolikokrat se vklopi čez dan. Zato sem v svoj sistemski grafikon dodal še en tok podatkov.

Malo težje je pridobiti status pogona HDD, vendar sem našel način! Najprej namestite smartmontools s konzole SSH:

posodobitev opkg

opkg namestite smartmontools

Nato moramo v naši kodi zagnati poseben ukaz in preveriti izhodno kodo:

funkcija exec_ret (cmd)

local exit = os.execute (cmd) print ("Zaženi:"..cmd.. " -> exit:".. exit) vrni funkcijo konca izhoda getHddSpinning () če exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 nato vrnite 1 else vrnite 0 end end

Opomba: moj trdi disk je /dev /sda

8. korak: Tabela omrežne dejavnosti

Tabela aktivnosti omrežja
Tabela aktivnosti omrežja

Ustvarimo še en gradnik SuperChart (podoben prejšnjemu), dodamo podatkovne tokove TX in RX ter dodelimo V1 in V2. Opomba: Želim prikazati statc vrat WAN in moja vrata WAN so eth0.2

Pomožne funkcije:

funkcija 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")) konec

Nato v isti tmr1 dodajte nekaj kode. To je bolj zapleteno, saj moramo le izračunati in prikazati razliko v prenesenih/prejetih bajtih:

lokalni prevTx, prevRx

local tmr1 = Timer: new {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () če prevTx in prevTx ~ = tx potem blynk: virtualWrite (1, tx - prevTx) konec če prevRx in prevRx ~ = rx nato blynk: virtualWrite (2, rx - prevRx) konec prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning (7, getHddSpinning)) konec}

9. korak: Obvestila

Obvestila
Obvestila

Prav tako sem želel biti obveščen, ko moj usmerjevalnik izgubi moč ali internetno povezavo. Za to potrebujemo pripomoček za obvestila.

V nastavitvah pripomočka omogočite »obvestilo brez povezave«. Koda ni potrebna. Lahko pa pošljemo tudi obvestila po meri iz naše kode.

10. korak: samodejni zagon v ozadju

Za zdaj je treba skript izvesti ročno, vendar želim, da se samodejno izvaja v ozadju, ko se usmerjevalnik vklopi.

To se naredi z ustvarjanjem storitve. Ustvarite datoteko /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; nato odmevi "blynkmon že teče" exit 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {če [! -f $ pidfile]; nato odmev "blynkmon ne teče" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Opomba: ne pozabite zamenjati žetona-auth-token

Nato omogočite storitev blynkmon:

storitev blynkmon omogoči

11. korak: Zaključek in nadaljnje ideje

Zaključek in nadaljnje ideje
Zaključek in nadaljnje ideje

Skenirate lahko ta QR, da dobite klon mojega projekta Blynk. Potrebuje nekaj energijskih točk (4600), saj uporablja veliko pripomočkov!

Popolno kodo Lua najdete tukaj:

Zaenkrat je vse v redu, vendar je nekaj idej, ki bi jih rad dodal v bližnji prihodnosti.

  • Dodajte ukaz Reboot. Preprečite nenamerno klikanje.
  • Dodajte pripomoček Terminal za zagon katerega koli ukaza Linux.
  • Dodajte grafikon temperature CPE -ja.

    UPD: Na žalost OpenWrt trenutno nima nekaj gonilnikov za moj model usmerjevalnika. Na voljo pa je za številne druge usmerjevalnike

  • Obvestilo dodajte, ko se določena naprava pridruži/zapusti omrežje. Podatke o arp že imamo, zdaj preverite samo naslov MAC.

Na ta način lahko spremljamo in nadzorujemo 3D -tiskalnike, robote, navadni računalnik/prenosni računalnik, Arduino/ESP8266/ESP32/RaspberryPi, naprave Smart Home in skoraj vse okoli. Sporočite mi, če imate še kakšno zanimivo idejo. Kaj menite o vsem tem?

Priporočena: