Innholdsfortegnelse:

Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt: 11 trinn
Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt: 11 trinn

Video: Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt: 11 trinn

Video: Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt: 11 trinn
Video: Как создать свой собственный сервер принтеров Canon с помощью Raspberry Pi 2024, November
Anonim
Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt
Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt
Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt
Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt

Jeg har nylig kjøpt en ny ruter (Xiaomi Mi Router 3G). Og selvfølgelig inspirerte dette nye, fantastiske stykke maskinvare meg til å begynne å jobbe med dette prosjektet;)

Trinn 1: Jeg antar at du allerede har OpenWrt…

Jeg antar at du allerede har OpenWrt…
Jeg antar at du allerede har OpenWrt…

Jeg måtte installere OpenWrt først … For det meste fulgte jeg denne veiledningen (spesifikk for denne rutermodellen): https://dzone.com/articles/hacking-into-xiaomi-mi-… Mens jeg jobbet med dette, fant jeg denne fantastiske videoen: Openwrt -installasjon, WiFi -referanseindeks, kjæreste som blinker. Wow jeg lo så hardt!:)

Merk følgende! Installering av OpenWrt kan bygge ruteren din. Men når den er fullført, låser den opp full kraft og kontroll. Jeg er ikke modig nok til å gi noen instruksjoner her, da de kan være forskjellige for hver rutermodell.

Men hvis du allerede har OpenWrt på ruteren, kan du starte med denne opplæringen om ikke så lenge

BTW, noen utviklingstavler kommer med OpenWrt out-of-the-box, som Onion Omega, VoCore, LinkIt Smart 7688 og andre. Denne opplæringen forklarer også noen grunnleggende ideer bak å lage slike apper, slik at du enkelt kan tilpasse den til å fungere med Raspberry Pi og lignende.

For dette prosjektet bruker jeg stort sett forhåndsinstallert programvare (tilgjengelig på en hvilken som helst OpenWrt-aktivert ruter). Men for noen avanserte funksjoner måtte jeg installere flere pakker. Dette gjøres med bare noen få klikk, så jeg vil inkludere instruksjonene her.

Jeg antar også at du allerede vet:

  • Slik åpner/bruker du SSH -terminalen til OpenWrt -ruteren
  • Slik laster du opp/redigerer filer på ruteren din (bruk FileZilla eller scp/sftp)
  • Hvordan arbeide med Linux -konsoll

Trinn 2: Programvare og verktøy

Programvare og verktøy
Programvare og verktøy

På smarttelefonsiden bruker jeg Blynk. Den tilbyr iOS- og Android -apper for å kontrollere maskinvare. Du kan enkelt bygge vakre grafiske grensesnitt for alle prosjektene dine ved å dra og slippe widgets rett på smarttelefonen. Blynk brukes mest med Arduino, Raspberry Pi, etc. Men hvorfor ikke kjøre den på selve ruteren?;)

På enhetssiden bruker jeg Lua til å skriptet den nødvendige funksjonaliteten. Jeg kan også bruke Python eller Node.js, men dessverre er disse alternativene ikke alltid tilgjengelige på grunn av mangel på ressurser på noen rutere. Eller C/C ++, men det er ikke så praktisk å jobbe med (kompilering for hver endring osv.) På den annen side er Lua forhåndsinstallert, enkel å bruke og lære. Det brukes av standard webgrensesnitt, LuCI.

Trinn 3: Opprette en minimal app

Det er like enkelt å komme i gang med Blynk og Lua som:

  • Last ned Blynk -appen (fra App Store, Google Play)
  • Lag et nytt prosjekt og få Auth Token
  • Følg installasjonsinstruksjonene for Blynk Lua for OpenWrt.

Bruk SSH for å få tilgang til ruterkonsollen. Etter å ha kjørt standardeksemplet:

lua./examples/client.lua

Vi burde se noe slikt:

Kobler til…

SSL -håndtrykk … Klar.

Det betyr at den sikre, toveis tilkoblingen til appen er etablert! YAY!

Vi kan nå enkelt utvide eksemplet, så det gjør noe interessant. Jeg har laget en kopi av dette eksemplet for å redigere det:

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

Trinn 4: Legge til litt informasjon: Antall klienter, WAN IP -adresse, oppetid

Den grunnleggende ideen er å få informasjonen fra operativsystemet med jevne mellomrom, utføre noen enkle beregninger om nødvendig, og deretter sende resultatet til Blynk for visning.

I Linux/OpenWrt har vi flere måter å få systemdata på:

  • Kjør en kommando, og analyser teksten den sender ut
  • Kjør en kommando, og se avslutningskoden den returnerer
  • Les en systemfil i/proc/og/sys/class/kataloger

Nå vil jeg vise antall tilkoblede enheter.

Når jeg kjører cat/proc/net/arp på konsollen, sender den ut listen over kjente enheter, sammen med deres MAC- og IP -adresser:

IP -adresse HW -type Flagger HW -adresse Maskeenhet

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 å bruke spesialiserte verktøy. På Linux er disse grep, hode, hale, kutt, wc, awk.

For å få antall klienter fra arp -utgang, må jeg filtrere tabellen (fjerne ikke -relaterte elementer) og telle tabellradene, noe som resulterer i følgende kommando:

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

La oss prøve det:

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

1

Flott. Vi får nå ideen om hvordan vi kan samle all nødvendig informasjon. La oss automatisere den. For å gjøre koden ren og utvidbar, la oss lage noen hjelperfunksjoner:

funksjon exec_out (cmd)

lokal fil = io.popen (cmd) hvis ikke fil, returner null ende lokal utgang = fil: les ('*alle') fil: lukk () print ("Kjør:"..cmd.. " ->".. output) return output output end function 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: "..sti.." -> "..innhold) returnere innholdsslutt

Ved å bruke disse verktøyene kan vi nå implementere de faktiske datahentingsfunksjonene:

funksjon getArpClients ()

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

Du kan kjøre deler av disse skallkommandoene, for å få dypere forståelse av hvordan det fungerer, og for å tilpasse det til dine behov.

Den enkleste delen er å sende dataene til Blynk -appen. Standardeksemplet setter allerede opp timeren, som kjører noen koder hvert 5. sekund, så vi bare bruker den på nytt:

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

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

I appen legger vi til 3 etikettwidgets, og tilordner dem deretter til Virtual Pins 10, 11, 12.

Selv om dette fungerer, er det ganske ineffektivt, ettersom WAN IP eller antall klienter ikke oppdateres så ofte. La oss fikse dette

For WAN IP flytter vi den til tilkoblet behandler. Den kjøres hver gang ruteren oppretter forbindelse til Blynk Cloud. Dette bør være tilstrekkelig:

blynk: on ("tilkoblet", funksjon ()

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

For oppetid og klientnummer lager vi en egen timer med 5 min. intervall:

lokal tmr2 = Timer: ny {intervall = 5*60*1000, func = funksjon ()

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

Trinn 5: WiFi -kontroll: PÅ/AV

WiFi -kontroll: PÅ/AV
WiFi -kontroll: PÅ/AV

Frem til nå har vi bare fått litt informasjon fra enheten. La oss prøve å kontrollere den!

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

hvis param [1] == "1" deretter os.execute ("wifi opp") annet os.execute ("wifi ned") slutten)

På appsiden la jeg til en knapp -widget (modus: Switch) og tilordnet den til V20.

Det er det. Fantastisk.

Trinn 6: Diagram for systemstatistikk

Systemstatistikk
Systemstatistikk
Systemstatistikk
Systemstatistikk

funksjon getCpuLoad ()

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

Vi må også sende dataene til Blynk (la oss bruke tmr1 igjen):

lokal tmr1 = Timer: ny {intervall = 5000, func = funksjon ()

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

Legg til SuperChart -widgeten på App -siden. Legg til CPU, RAM datastrømmer og tilordne V5, V6.

Trinn 7: HDD -spinningsstatus

Ruteren min har en ekstern HDD -stasjon tilkoblet som en nettverkstilkoblet lagringsenhet. Tingen er at denne stasjonen er konfigurert til å begynne å spinne når noen får tilgang til den, og til å stoppe etter en timeout.

Åpenbart ville det være kult å vite hvor mange ganger den slår seg på i løpet av en dag. Så jeg la til en annen datastrøm i systemdiagrammet mitt.

Det er litt mer vanskelig å få status for HDD -stasjonen, men jeg fant en måte! Først av alt, installer smartmontools fra SSH -konsollen:

opkg oppdatering

opkg installer smartmontools

Deretter må vi i vår kode kjøre en spesiell kommando og kontrollere utgangskoden:

funksjon 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 deretter 1 annet, returner 0 ende ende

Merk: HDD -en min er /dev /sda

Trinn 8: Nettverksaktivitetskart

Nettverkets aktivitetsdiagram
Nettverkets aktivitetsdiagram

Vi lager en annen SuperChart -widget (lik den forrige), legg til TX- og RX -datastrømmer og tilordner V1 og V2. Merk: Jeg vil vise WAN -portstatistikk, og min WAN -port er eth0.2

Hjelperfunksjoner:

funksjon getWanRxBytes ()

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

Deretter legger du til noen kode i den samme tmr1. Dette er mer komplisert, ettersom vi bare trenger å beregne og vise forskjellen i overførte/mottatte byte:

lokal 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 deretter blynk: virtualWrite (2, rx - prevRx) ende prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning ()) slutt}

Trinn 9: Varsler

Varsler
Varsler

Jeg ønsket også å bli varslet når ruteren min mister strømmen eller internettforbindelsen. For dette trenger vi varslingswidget.

I widgetinnstillinger må du aktivere "offline varsling". Ingen kode er nødvendig. Men vi kan også sende tilpassede varsler fra koden vår.

Trinn 10: Autorun i bakgrunnen

For nå må skriptet kjøres manuelt, men jeg vil få det til å kjøre i bakgrunnen automatisk når ruteren slås på.

Dette gjøres ved å opprette en tjeneste. Lag en fil /etc/init.d/blynkmon:

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

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

Merk: ikke glem å bytte ut ditt-auth-token

Aktiver deretter blynkmon -tjenesten:

service blynkmon aktivere

Trinn 11: Konklusjon og flere ideer

Konklusjon og flere ideer
Konklusjon og flere ideer

Du kan skanne denne QR -en for å få klonen av Blynk -prosjektet mitt. Det krever noen energipunkter (4600), ettersom den bruker mange widgets!

Finn hele Lua -koden her:

Så langt så bra, men her er noen ideer jeg vil legge til i nær fremtid.

  • Legg til kommando for omstart. Forhindre at du klikker på det ved et uhell.
  • Legg til Terminal -widget for å kjøre en hvilken som helst Linux -kommando.
  • Legg til CPU -temperaturdiagram.

    UPD: Dessverre mangler OpenWrt for tiden noen drivere for rutermodellen min. Men den er tilgjengelig for mange andre rutere

  • Legg til varsel når en bestemt enhet kobler seg til/forlater nettverket. Vi har allerede arp -informasjon, sjekk nå bare MAC -adressen.

På denne måten kan vi overvåke og kontrollere 3D -skrivere, roboter, en vanlig PC/bærbar PC, Arduino/ESP8266/ESP32/RaspberryPi -ting, Smart Home -enheter og praktisk talt alt rundt. Gi meg beskjed hvis du har andre interessante ideer. Hva synes du om alt dette?

Anbefalt: