Innholdsfortegnelse:
- Trinn 1: Jeg antar at du allerede har OpenWrt…
- Trinn 2: Programvare og verktøy
- Trinn 3: Opprette en minimal app
- Trinn 4: Legge til litt informasjon: Antall klienter, WAN IP -adresse, oppetid
- Trinn 5: WiFi -kontroll: PÅ/AV
- Trinn 6: Diagram for systemstatistikk
- Trinn 7: HDD -spinningsstatus
- Trinn 8: Nettverksaktivitetskart
- Trinn 9: Varsler
- Trinn 10: Autorun i bakgrunnen
- Trinn 11: Konklusjon og flere ideer
Video: Android/iOS -app for å få tilgang til OpenWrt -ruteren eksternt: 11 trinn
2024 Forfatter: John Day | [email protected]. Sist endret: 2024-01-30 11:23
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 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
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
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
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
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
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
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:
MCU Få tilgang til internettjeneste via IFTTT - Ameba Arduino: 3 trinn
MCU Få tilgang til internettjeneste via IFTTT - Ameba Arduino: Tilgang til internettjeneste er en enkel jobb for en smartenhet som en Android -telefon, et nettbrett eller en PC, men ikke så lett for mikrokontrollere siden det vanligvis krever bedre tilkobling og prosessorkraft. Imidlertid kan vi laste av den tunge delen av
Få tilgang til Raspberry Pi -filsystemet gjennom Windows: 9 trinn
Få tilgang til Raspberry Pi -filsystemet gjennom Windows: Har du noen gang fått en Raspberry Pi og gått " Jeg må sette det opp med en skjerm, mus og tastatur hver gang! &Quot; Frustasjonen det forårsaker å koble fra/koble til skjermen og tastaturet/musen, bare for å få tilgang til Raspberry Pi er uten sidestykke
Eksternt tilgang til Raspberry Pi: SSH, Dekstop og FTP: 4 trinn
Ekstern tilgang til Raspberry Pi: SSH, Dekstop & FTP: I dette innlegget skal vi se på tre forskjellige metoder for å få ekstern tilgang til Raspberry Pi for å gjøre det litt lettere å jobbe med det. Den første er SSH, som lar deg eksternt få tilgang til terminalen. Den andre er en remo
Få tilgang til eksternt rotfilsystem ved bruk av DB410 som en Ethernet -dongle: 6 trinn
Få tilgang til eksternt rotfilsystem ved bruk av DB410 som ethernet -dongle: Mål: Installer verktøykjede og kompiler kjernen for å sette inn USB Ethernet CDC Gadget -støtte; Gjenopprett boot.img fra Linaro for å starte USB Ethernet CDC; Lag NFS -server for å være vert for rotfilsystemet; IP -konfigurasjon i ENHET og HOST
Få tilgang til Kontroller en server eller de fleste Windows -datamaskiner eksternt: 6 trinn
Få tilgang til Kontroller en server eller nesten hvilken som helst Windows -datamaskin: Denne instruksjonsboken er en kombinasjon av noen få ideer som jeg har sett her på instrukser. Ha4xor4life la ut en instruks som heter Sjekk enkelt opp på din personlige filserver. Det er en god idé, men det krevde en skjerm med to innganger