Indholdsfortegnelse:

Android/iOS -app til fjernadgang til din OpenWrt -router: 11 trin
Android/iOS -app til fjernadgang til din OpenWrt -router: 11 trin

Video: Android/iOS -app til fjernadgang til din OpenWrt -router: 11 trin

Video: Android/iOS -app til fjernadgang til din OpenWrt -router: 11 trin
Video: OpenWRT: поделитесь 4G на каждом устройстве в вашей сети 2024, Juni
Anonim
Android/iOS -app til fjernadgang til din OpenWrt -router
Android/iOS -app til fjernadgang til din OpenWrt -router
Android/iOS -app til fjernadgang til din OpenWrt -router
Android/iOS -app til fjernadgang til din OpenWrt -router

Jeg har for nylig købt en ny router (Xiaomi Mi Router 3G). Og selvfølgelig inspirerede dette nye, fantastiske stykke hardware mig til at begynde at arbejde på dette projekt;)

Trin 1: Jeg antager, at du allerede har OpenWrt…

Jeg formoder, at du allerede har OpenWrt…
Jeg formoder, at du allerede har OpenWrt…

Jeg var nødt til at installere OpenWrt først … For det meste fulgte jeg denne vejledning (specifik for denne routermodel): https://dzone.com/articles/hacking-into-xiaomi-mi-… Mens jeg arbejdede på dette, fandt jeg denne fantastiske video: Openwrt -installation, WiFi -benchmark, Kæreste blinker. Hvor grinede jeg så meget!:)

Opmærksomhed! Installation af OpenWrt kan tegne din router. Men når den er færdig, låser den fuld kraft og kontrol op. Jeg er ikke modig nok til at give nogen instruktioner her, da de kan være forskellige for hver routermodel.

Men hvis du allerede har OpenWrt på din router, kan du starte med denne vejledning om ikke så længe

BTW, nogle udviklingsbrætter leveres med OpenWrt out-of-the-box, som Onion Omega, VoCore, LinkIt Smart 7688 og andre. Denne vejledning forklarer også nogle grundlæggende ideer bag oprettelse af sådanne apps, så du nemt kan tilpasse den til at arbejde med Raspberry Pi og lignende.

Til dette projekt vil jeg mest bruge forudinstalleret software (tilgængelig på enhver OpenWrt-aktiveret router). Men for nogle avancerede funktioner skulle jeg installere yderligere pakker. Dette gøres med bare et par klik, så jeg vil inkludere instruktionerne her.

Jeg antager også, at du allerede ved:

  • Sådan åbnes/bruges SSH -terminal til din OpenWrt -router
  • Sådan uploades/redigeres filer på din router (brug FileZilla eller scp/sftp)
  • Sådan arbejder du med Linux -konsol

Trin 2: Software og værktøjer

Software og værktøjer
Software og værktøjer

På smartphonesiden bruger jeg Blynk. Det giver iOS- og Android -apps til at styre enhver hardware. Du kan nemt bygge smukke grafiske grænseflader til alle dine projekter ved blot at trække og slippe widgets direkte på din smartphone. Blynk bruges mest med Arduino, Raspberry Pi osv. Men hvorfor ikke køre det på selve routeren?;)

På enhedsiden vil jeg bruge Lua til at scripte den nødvendige funktionalitet. Jeg kunne også bruge Python eller Node.js, men desværre er disse muligheder ikke altid tilgængelige på grund af mangel på ressourcer på nogle routere. Eller C/C ++, men det er ikke så praktisk at arbejde med (omkompilering for hver ændring osv.) På den anden side er Lua forudinstalleret, let at bruge og lære. Det bruges af standardwebgrænsefladen, LuCI.

Trin 3: Oprettelse af en minimal app

Det er lige så let at komme i gang med Blynk og Lua som:

  • Download Blynk -appen (fra App Store, Google Play)
  • Opret et nyt projekt, og få Auth Token
  • Følg Blynk Lua installationsvejledningen til OpenWrt.

Brug SSH til at få adgang til din router -konsol. Efter at have kørt standardeksemplet:

lua./examples/client.lua

Vi skulle se noget i stil med dette:

Tilslutning…

SSL håndtryk … Klar.

Hvilket betyder, at den sikre, tovejsforbindelse til appen er etableret! YAY!

Vi kan nu let udvide det angivne eksempel, så det gør noget interessant. Jeg har oprettet en kopi af dette eksempel for at redigere det:

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

Trin 4: Tilføjelse af nogle oplysninger: Antal klienter, WAN IP -adresse, oppetid

Den grundlæggende idé er at få informationen fra operativsystemet med jævne mellemrum, udføre nogle enkle beregninger, hvis det er nødvendigt, og derefter sende resultatet til Blynk til visning.

I Linux/OpenWrt har vi flere måder at hente systemdata på:

  • Kør en kommando, og analyser den tekst, den udsender
  • Kør en kommando, og se den exit -kode, den returnerer
  • Læs en systemfil, der findes i/proc/og/sys/class/directories

Nu vil jeg vise antallet af tilsluttede enheder.

Når jeg kører cat/proc/net/arp på konsollen, udsender den listen over kendte enheder sammen med deres MAC- og IP -adresser:

IP -adresse HW -type Flag HW -adresse Mask Device

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

Vi kan analysere det direkte i Lua, men det er ofte lettere at bruge specialiserede værktøjer. På Linux er disse grep, hoved, hale, snit, wc, awk.

For at få antallet af klienter fra arp -output skal jeg filtrere tabellen (fjerne ikke -relaterede elementer) og tælle tabelrækkerne, hvilket resulterer i følgende kommando:

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

Lad os prøve det:

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

1

Store. Vi får nu ideen om, hvordan vi kan indsamle alle de nødvendige oplysninger. Lad os automatisere det. For at gøre vores kode ren og udvidelig, lad os oprette nogle hjælperfunktioner:

funktion exec_out (cmd)

lokal fil = io.popen (cmd) hvis ikke fil, returner nul end lokal output = fil: læs ('*alle') fil: luk () print ("Kør:"..cmd.. " ->".. output) return output output end function read_file (sti) lokal fil = io.open (sti, "rb") hvis ikke fil så returner nul end lokalt indhold = fil: læs "*a" fil: close () print ("Læs: "..sti.." -> "..indhold) returnerer indholdsafslutning

Ved hjælp af disse værktøjer kan vi nu implementere de faktiske datahentningsfunktioner:

funktion getArpClients ()

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

Du kan køre dele af disse shell -kommandoer for at få en dybere forståelse af, hvordan det fungerer, og for at tilpasse det til dine behov.

Den letteste del er at sende dataene til Blynk -appen. Standardeksemplet konfigurerer allerede timeren, der kører en kode hvert 5. sekund, så vi genbruger den bare:

lokal tmr1 = Timer: ny {interval = 5000, func = funktion ()

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

I appen tilføjer vi 3 label -widgets og tildeler dem til Virtual Pins 10, 11, 12 i overensstemmelse hermed.

Selvom dette virker, er det ret ineffektivt, da WAN IP eller antallet af klienter ikke opdateres så ofte. Lad os rette dette

For WAN IP flytter vi det til tilsluttet handler. Det køres hver gang routeren opretter forbindelse til Blynk Cloud. Dette bør være tilstrækkeligt:

blynk: on ("tilsluttet", funktion ()

print ("Klar.") blynk: virtualWrite (12, getWanIP ()) ende)

For oppetid og klientnummer opretter vi en separat timer med 5 min. interval:

lokal tmr2 = Timer: ny {interval = 5*60*1000, func = funktion ()

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

Trin 5: WiFi -kontrol: TIL/FRA

WiFi -kontrol: TIL/FRA
WiFi -kontrol: TIL/FRA

Indtil nu fik vi kun nogle oplysninger fra enheden. Lad os prøve at kontrollere det!

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

hvis param [1] == "1" derefter os.execute ("wifi up") ellers os.execute ("wifi down") ende ende)

På appsiden tilføjede jeg lige en Button -widget (tilstand: Switch) og tildelte den til V20.

Det er det. Fantastiske.

Trin 6: Diagram over systemstatistik

Systemstatistik
Systemstatistik
Systemstatistik
Systemstatistik

funktion getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'")) slutfunktion getRamUsage () return tonumber (exec_out ("free | grep Mem | awk ' {print ($ 3- $ 7)/$ 2 * 100,0} '")) slut

Vi skal også sende dataene til Blynk (lad os bruge tmr1 igen):

lokal tmr1 = Timer: ny {interval = 5000, func = funktion ()

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

På App -siden skal du tilføje SuperChart -widget. Tilføj CPU, RAM datastreams og tildel til V5, V6.

Trin 7: HDD -spinningsstatus

Min router har et eksternt HDD -drev tilsluttet som en netværkstilsluttet lagerenhed. Sagen er, at dette drev er konfigureret til at begynde at dreje, når nogen får adgang til det, og til at suspendere efter en timeout.

Det ville naturligvis være fedt at vide, hvor mange gange det tænder i løbet af en dag. Så jeg tilføjede endnu en datastream til mit systemdiagram.

Det er lidt mere vanskeligt at få status for HDD -drevet, men jeg fandt en måde! Først og fremmest skal du installere smartmontools fra SSH -konsollen:

opkg opdatering

opkg installer smartmontools

Derefter skal vi i vores kode køre en særlig kommando og kontrollere exitkoden:

funktion exec_ret (cmd)

lokal exit = os.execute (cmd) print ("Run:"..cmd.. " -> exit:".. exit) return exit exit function getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 returner derefter 1 else returner 0 ende ende

Bemærk: min harddisk er /dev /sda

Trin 8: Netværksaktivitetskort

Netværksaktivitetskort
Netværksaktivitetskort

Vi opretter en anden SuperChart -widget (ligner den forrige), tilføjer TX- og RX -datastreams, og tildeler V1 og V2. Bemærk: Jeg vil vise WAN -port statc, og min WAN -port er eth0.2

Hjælperfunktioner:

funktion getWanRxBytes ()

returner tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) slutfunktion getWanTxBytes () return tonumber (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) slut

Tilføj derefter en kode til den samme tmr1. Dette er mere kompliceret, da vi kun skal beregne og vise forskellen i transmitterede/modtagne bytes:

lokal prevTx, prevRx

lokal tmr1 = Timer: ny {interval = 5000, func = funktion () lokal tx = getWanTxBytes () lokal rx = getWanRxBytes () hvis prevTx og prevTx ~ = tx derefter blynk: virtualWrite (1, tx - prevTx) slutter hvis prevRx og prevRx ~ = rx derefter blynk: virtualWrite (2, rx - prevRx) ende prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning ()) slut}

Trin 9: Meddelelser

Meddelelser
Meddelelser

Jeg ville også have besked, når min router mister strøm eller internetforbindelse. Til dette har vi brug for meddelelseswidget.

Aktiver "offline -meddelelse" i widgetindstillinger. Ingen kode nødvendig. Men vi kan også sende tilpassede meddelelser fra vores kode.

Trin 10: Autorun i baggrunden

For nu skal scriptet udføres manuelt, men jeg vil få det til at køre i baggrunden automatisk, når routeren tændes.

Dette gøres ved at oprette en service. Opret en fil /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; ekko derefter "blynkmon kører allerede" exit 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {hvis [! -f $ pidfile]; ekko derefter "blynkmon ikke kører" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Bemærk: glem ikke at udskifte dit-auth-token

Aktiver derefter blynkmon -service:

service blynkmon aktivere

Trin 11: Konklusion og yderligere ideer

Konklusion og yderligere ideer
Konklusion og yderligere ideer

Du kan scanne denne QR for at få klonen af mit Blynk -projekt. Det kræver nogle energipunkter (4600), da det bruger mange widgets!

Find den fulde Lua -kode her:

Så langt så godt, men her er nogle ideer, jeg gerne vil tilføje i nær fremtid.

  • Tilføj kommando om genstart. Undgå at klikke på det ved et uheld.
  • Tilføj Terminal -widget for at køre enhver linux -kommando.
  • Tilføj CPU -temperaturdiagram.

    UPD: Desværre mangler OpenWrt i øjeblikket nogle drivere til min routermodel. Men den er tilgængelig for mange andre routere

  • Tilføj meddelelse, når en bestemt enhed slutter sig til/forlader netværket. Vi har allerede arp -oplysninger, tjek nu kun MAC -adressen.

På denne måde kan vi overvåge og styre 3D -printere, robotter, en almindelig pc/bærbar computer, Arduino/ESP8266/ESP32/RaspberryPi -ting, Smart Home -enheder og stort set alt omkring. Lad mig vide, hvis du har andre interessante ideer. Hvad synes du om alt dette?

Anbefalede: