Obsah:

Aplikácia Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt: 11 krokov
Aplikácia Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt: 11 krokov

Video: Aplikácia Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt: 11 krokov

Video: Aplikácia Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt: 11 krokov
Video: How to Use AnyDesk on iPhone 2024, November
Anonim
Aplikácia pre Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt
Aplikácia pre Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt
Aplikácia pre Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt
Aplikácia pre Android/iOS na vzdialený prístup k vášmu smerovaču OpenWrt

Nedávno som si kúpil nový router (Xiaomi Mi Router 3G). A samozrejme, tento nový, úžasný kus hardvéru ma inšpiroval k tomu, aby som začal pracovať na tomto projekte;)

Krok 1: Predpokladám, že už máte OpenWrt …

Predpokladám, že OpenWrt už máte…
Predpokladám, že OpenWrt už máte…

Najprv som musel nainštalovať OpenWrt … Väčšinou som sa riadil týmto sprievodcom (špecifickým pre tento model smerovača): https://dzone.com/articles/hacking-into-xiaomi-mi-… Pri práci na tomto som našiel toto úžasné video: Inštalácia Openwrt, benchmark WiFi, priateľka bliká. Wow, tak som sa smial!:)

Pozor! Inštalácia OpenWrt môže váš router pokaziť. Po dokončení však odomkne plný výkon a kontrolu. Nie som dosť odvážny poskytnúť sem akékoľvek pokyny, pretože sa môžu líšiť pre každý model smerovača.

Ale ak už máte OpenWrt na svojom smerovači, budete môcť začať s týmto návodom čoskoro

BTW, niektoré vývojové dosky sú dodávané s otvoreným boxom OpenWrt, ako napríklad Onion Omega, VoCore, LinkIt Smart 7688 a ďalšie. Tento tutoriál tiež vysvetľuje niekoľko základných myšlienok vytvárania takýchto aplikácií, aby ste ich mohli ľahko prispôsobiť práci s Raspberry Pi a podobnými.

Na tento projekt budem väčšinou používať predinštalovaný softvér (k dispozícii na akomkoľvek smerovači s podporou OpenWrt). Ale kvôli niektorým pokročilým funkciám som musel nainštalovať ďalšie balíky. To sa deje niekoľkými kliknutiami, takže sem vložím pokyny.

Tiež predpokladám, že už viete:

  • Ako otvoriť/použiť terminál SSH na smerovači OpenWrt
  • Ako nahrávať/upravovať súbory na smerovači (použite FileZilla alebo scp/sftp)
  • Ako pracovať s konzolou Linux

Krok 2: Softvér a nástroje

Softvér a nástroje
Softvér a nástroje

Na strane smartfónu používam Blynk. Poskytuje aplikácie pre iOS a Android na ovládanie akéhokoľvek hardvéru. Krásne grafické rozhrania pre všetky svoje projekty môžete jednoducho vytvárať jednoduchým pretiahnutím miniaplikácií priamo vo svojom smartfóne. Blynk sa väčšinou používa s Arduino, Raspberry Pi atď. Ale prečo ho nespustíte na samotnom routeri?;)

Na strane zariadenia budem pomocou Lua skriptovať potrebné funkcie. Mohol by som použiť aj Python alebo Node.js, ale bohužiaľ tieto možnosti nie sú vždy k dispozícii, kvôli nedostatku zdrojov na niektorých smerovačoch. Alebo C/C ++, ale pracovať s nimi nie je také pohodlné (prekompilovať pri každej zmene atď.) Na druhej strane, Lua je predinštalovaný, používanie a učenie sa je jednoduché. Používa ho predvolené webové rozhranie LuCI.

Krok 3: Vytvorenie minimálnej aplikácie

Začíname s Blynkom a Luou je také jednoduché, ako:

  • Stiahnite si aplikáciu Blynk (z App Store, Google Play)
  • Vytvorte nový projekt a získajte overovací token
  • Postupujte podľa pokynov na inštaláciu Blynk Lua pre OpenWrt.

Na prístup k konzole routera použite SSH. Po spustení predvoleného príkladu:

lua./examples/client.lua

Mali by sme vidieť niečo také:

Pripája sa…

Podanie ruky SSL … Pripravené.

To znamená, že je zabezpečené obojsmerné pripojenie k aplikácii! YAY!

Teraz môžeme uvedený príklad jednoducho rozšíriť, takže robí niečo zaujímavé. Vytvoril som kópiu tohto príkladu, aby som ho mohol upraviť:

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

Krok 4: Pridanie informácií: počet klientov, adresa IP WAN, doba prevádzky

Základnou myšlienkou je pravidelne získavať informácie z operačného systému, v prípade potreby vykonať niekoľko jednoduchých výpočtov a potom výsledok poslať Blynkovi na zobrazenie.

V systéme Linux/OpenWrt máme niekoľko spôsobov, ako získať systémové údaje:

  • Spustite príkaz a analyzujte výstupný text
  • Spustite príkaz a sledujte, ako sa vráti kód ukončenia
  • Prečítajte si systémový súbor umiestnený v adresároch/proc/a/sys/class/

Teraz chcem zobraziť počet pripojených zariadení.

Keď spustím cat/proc/net/arp na konzole, zobrazí sa zoznam známych zariadení spolu s ich adresami MAC a IP:

IP adresa Typ HW Príznaky HW adresa Maska Zariadenie

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

Môžeme to analyzovať priamo v Lua, ale často je jednoduchšie použiť špecializované nástroje. V Linuxe sú to grep, head, tail, cut, wc, awk.

Na získanie počtu klientov z výstupu arp potrebujem filtrovať tabuľku (odstrániť nesúvisiace položky) a spočítať riadky tabuľky, výsledkom čoho je nasledujúci príkaz:

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

Skúsme to:

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

1

Skvelé. Teraz máme predstavu o tom, ako môžeme zhromaždiť všetky požadované informácie. Zautomatizujme to. Aby bol náš kód čistý a rozšíriteľný, vytvorme niekoľko pomocných funkcií:

funkcia exec_out (cmd)

lokálny súbor = io.popen (cmd) ak nie je súbor, potom sa vráti bez konca lokálny výstup = súbor: čítať ('*všetky') súbor: zavrieť () vytlačiť ("Spustiť:"..cmd.. " ->".. výstup) návratová funkcia výstupu výstup read_file (cesta) lokálny súbor = io.open (cesta, „rb“) ak nie súbor, potom vráťte nulový koniec lokálny obsah = súbor: prečítajte si „*a“súbor: zatvorte () tlač („Prečítajte si: „..path..“-> „..content) návrat obsahu koniec

Pomocou týchto nástrojov teraz môžeme implementovať skutočné funkcie načítania údajov:

funkcia getArpClients ()

vrátiť tonumber (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) koncová funkcia getUptime () vrátiť 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

Môžete spustiť časti týchto príkazov shellu, aby ste lepšie pochopili, ako funguje, a upravili ich podľa svojich potrieb.

Najľahšie je odoslať údaje do aplikácie Blynk. Predvolený príklad už nastavuje časovač, ktorý každých 5 sekúnd spustí nejaký kód, takže ho znova použijeme:

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 ()) end}

V aplikácii pridáme 3 miniaplikácie štítkov a podľa toho ich priradíme k virtuálnym pinom 10, 11, 12.

Aj keď to funguje, je to dosť neefektívne, pretože adresa IP WAN alebo počet klientov sa neaktualizuje tak často. Opravme to

V prípade siete WAN IP ju presúvame do pripojeného obslužného programu. Spustí sa zakaždým, keď router vytvorí spojenie s Blynk Cloud. To by malo stačiť:

blynk: on ("pripojený", funkcia ()

print ("Ready.") blynk: virtualWrite (12, getWanIP ()) end)

Pre Uptime a Clients Number vytvoríme samostatný časovač s 5 min. 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}

Krok 5: Ovládanie WiFi: ZAPNUTÉ/VYPNUTÉ

Ovládanie WiFi: ZAP/VYP
Ovládanie WiFi: ZAP/VYP

Doteraz sme zo zariadenia získavali iba nejaké informácie. Skúsme to ovládať!

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

if param [1] == "1" then os.execute ("wifi up") else os.execute ("wifi down") end end)

Na strane aplikácie som práve pridal widget Button (režim: Switch) a priradil som ho k V20.

To je všetko. Úžasný.

Krok 6: Graf štatistiky systému

Štatistika systému
Štatistika systému
Štatistika systému
Štatistika systému

funkcia getCpuLoad ()

vrátiť 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} '")) end

Údaje musíme tiež odoslať Blynkovi (znova použijeme tmr1):

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

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

Na strane aplikácie pridajte miniaplikáciu SuperChart. Pridajte dátové toky CPU, RAM a priraďte k V5, V6.

Krok 7: Stav otáčania pevného disku

Môj smerovač má externý pevný disk pripojený ako zariadenie pripojené k sieti. Ide o to, že táto jednotka je nakonfigurovaná tak, aby sa začala otáčať, keď k nej niekto pristupuje, a aby sa pozastavila po uplynutí časového limitu.

Očividne by bolo skvelé vedieť, koľkokrát sa zapne počas dňa. Preto som do svojho systémového grafu pridal ďalší dátový tok.

Získať stav jednotky HDD je trochu zložitejšie, ale našiel som cestu! Najprv nainštalujte smartmontools z konzoly SSH:

aktualizácia opkg

opkg nainštalovať smartmontools

Potom v našom kóde musíme spustiť špeciálny príkaz a skontrolovať výstupný kód:

funkcia exec_ret (cmd)

local exit = os.execute (cmd) print ("Run:"..cmd.. " -> exit:".. exit) return exit end function getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 potom vráti 1 inak vráti 0 koniec konca

Poznámka: môj pevný disk je /dev /sda

Krok 8: Graf aktivity siete

Graf sieťovej aktivity
Graf sieťovej aktivity

Vytvoríme ďalšiu miniaplikáciu SuperChart (podobnú tej predchádzajúcej), pridáme dátové toky TX a RX a priradíme k V1 a V2. Poznámka: Chcem zobrazovať statc portu WAN a môj port WAN je eth0.2

Pomocné funkcie:

funkcia 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")) koniec

Ďalej pridajte rovnaký kód do rovnakého súboru tmr1. Je to komplikovanejšie, pretože potrebujeme iba vypočítať a zobraziť rozdiel v odoslaných/prijatých bajtoch:

lokálne prevTx, prevRx

local tmr1 = Timer: new {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () if prevTx and prevTx ~ = tx then blynk: virtualWrite (1, tx - prevTx) end if prevRx and prevRx ~ = rx potom blynk: virtualWrite (2, rx - prevRx) koniec prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning ()) koniec}

Krok 9: Oznámenia

Oznámenia
Oznámenia

Tiež som chcel byť upozornený, keď môj smerovač stratí napájanie alebo internetové pripojenie. Na to potrebujeme widget Upozornenie.

V nastaveniach widgetu povoľte „offline upozornenie“. Nie je potrebný žiadny kód. Z nášho kódu však môžeme odosielať aj vlastné upozornenia.

Krok 10: Automatické spustenie na pozadí

Skript je zatiaľ potrebné vykonať ručne, ale chcem, aby sa spustil automaticky na pozadí pri zapnutí smerovača.

To sa deje vytvorením služby. Vytvorte súbor /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; potom echo „blynkmon už beží“exit 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; potom zopakujte „blynkmon nebeží“exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Poznámka: Nezabudnite nahradiť svoj token-auth

Potom povoľte službu blynkmon:

služba blynkmon povoliť

Krok 11: Záver a ďalšie nápady

Záver a ďalšie nápady
Záver a ďalšie nápady

Môžete naskenovať tento QR a získať klon môjho projektu Blynk. Vyžaduje niekoľko energetických bodov (4600), pretože používa veľa miniaplikácií!

Úplný kód Lua nájdete tu:

Zatiaľ je to dobré, ale tu je niekoľko nápadov, ktoré by som rád pridal v blízkej budúcnosti.

  • Pridajte príkaz Reštartovať. Zabráňte náhodnému kliknutiu.
  • Pridajte miniaplikáciu Terminal na spustenie ľubovoľného príkazu linux.
  • Pridajte graf teploty procesora.

    UPD: Bohužiaľ, v programe OpenWrt v súčasnosti chýbajú niektoré ovládače pre môj model smerovača. Je však k dispozícii pre mnoho ďalších smerovačov

  • Pridajte upozornenie, keď sa konkrétne zariadenie pripojí/opustí sieť. Informácie o arp už máme, teraz skontrolujte iba MAC adresu.

Týmto spôsobom môžeme monitorovať a ovládať 3D tlačiarne, roboty, bežný počítač/notebook, veci Arduino/ESP8266/ESP32/RaspberryPi, zariadenia Smart Home a prakticky čokoľvek v okolí. Dajte mi vedieť, ak máte ďalšie zaujímavé nápady. Čo si o tom všetkom myslíte?

Odporúča: