Innehållsförteckning:

Android/iOS -app för att komma åt din OpenWrt -router på distans: 11 steg
Android/iOS -app för att komma åt din OpenWrt -router på distans: 11 steg

Video: Android/iOS -app för att komma åt din OpenWrt -router på distans: 11 steg

Video: Android/iOS -app för att komma åt din OpenWrt -router på distans: 11 steg
Video: Маленький лисенок вышел к людям за помощью 2024, Juni
Anonim
Android/iOS -app för att komma åt din OpenWrt -router på distans
Android/iOS -app för att komma åt din OpenWrt -router på distans
Android/iOS -app för att komma åt din OpenWrt -router på distans
Android/iOS -app för att komma åt din OpenWrt -router på distans

Jag köpte nyligen en ny router (Xiaomi Mi Router 3G). Och naturligtvis inspirerade denna nya, fantastiska hårdvara mig att börja arbeta med det här projektet;)

Steg 1: Jag antar att du redan har OpenWrt…

Jag antar att du redan har OpenWrt …
Jag antar att du redan har OpenWrt …

Jag var tvungen att installera OpenWrt först … För det mesta följde jag den här guiden (specifik för denna routermodell): https://dzone.com/articles/hacking-into-xiaomi-mi-… Medan jag arbetade med detta hittade jag den här fantastiska videon: Openwrt -installation, WiFi -riktmärke, Flickvän som blinkar. Hur skrattade jag så mycket!:)

Uppmärksamhet! Om du installerar OpenWrt kan din router brytas ner. Men när den väl är klar låser den upp full effekt och kontroll. Jag är inte modig nog att ge några instruktioner här, eftersom de kan vara olika för varje routermodell.

Men om du redan har OpenWrt på din router kan du börja med den här självstudien inom kort

BTW, vissa utvecklingsbrädor kommer med OpenWrt out-of-the-box, som Onion Omega, VoCore, LinkIt Smart 7688 och andra. Denna handledning förklarar också några grundläggande idéer bakom att skapa sådana appar, så att du enkelt kan anpassa den till att fungera med Raspberry Pi och liknande.

För det här projektet använder jag mestadels förinstallerad programvara (tillgänglig på alla OpenWrt-aktiverade routrar). Men för lite avancerad funktionalitet var jag tvungen att installera ytterligare paket. Detta görs på bara några klick, så jag kommer att inkludera instruktionerna här.

Jag antar också att du redan vet:

  • Hur man öppnar/använder SSH -terminal till din OpenWrt -router
  • Hur man laddar upp/redigerar filer på din router (använd FileZilla eller scp/sftp)
  • Hur man arbetar med Linux -konsolen

Steg 2: Programvara och verktyg

Programvara och verktyg
Programvara och verktyg

På smartphonesidan använder jag Blynk. Den tillhandahåller iOS- och Android -appar för att styra eventuell hårdvara. Du kan enkelt bygga vackra grafiska gränssnitt för alla dina projekt genom att helt enkelt dra och släppa widgets direkt på din smartphone. Blynk används mest med Arduino, Raspberry Pi, etc. Men varför inte köra den på själva routern?;)

På enhetssidan använder jag Lua för att skripta den funktionalitet som behövs. Jag kan också använda Python eller Node.js, men tyvärr är dessa alternativ inte alltid tillgängliga på grund av brist på resurser på vissa routrar. Eller C/C ++, men det är inte så bekvämt att arbeta med (omkompilering för varje förändring etc.) Å andra sidan är Lua förinstallerad, enkel att använda och lära sig. Det används av standardwebbgränssnittet, LuCI.

Steg 3: Skapa en minimal app

Att komma igång med Blynk och Lua är lika enkelt som:

  • Ladda ner Blynk -appen (från App Store, Google Play)
  • Skapa ett nytt projekt och få Auth Token
  • Följ installationsanvisningarna för Blynk Lua för OpenWrt.

Använd SSH för att komma åt routerns konsol. Efter att ha kört standardexemplet:

lua./examples/client.lua

Vi borde se något så här:

Ansluter…

SSL -handskakning … Klar.

Vilket innebär att den säkra, dubbelriktade anslutningen till appen upprättas! YAY!

Vi kan nu enkelt utöka det angivna exemplet, så det gör något intressant. Jag har skapat en kopia av detta exempel för att redigera det:

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

Steg 4: Lägga till lite information: Antal klienter, WAN IP -adress, Uptime

Grundidén är att få informationen från operativsystemet regelbundet, utföra några enkla beräkningar om det behövs och sedan skicka resultatet till Blynk för visning.

I Linux/OpenWrt har vi flera sätt att få systemdata:

  • Kör ett kommando och analysera texten som det matas ut
  • Kör ett kommando och titta på utgångskoden som den returnerar
  • Läs en systemfil i/proc/och/sys/class/kataloger

Nu vill jag visa antalet anslutna enheter.

När jag kör cat/proc/net/arp på konsolen skickar den listan över kända enheter, tillsammans med deras MAC- och IP -adresser:

IP -adress HW -typ Flaggar HW -adress 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 analysera det direkt i Lua, men det är ofta lättare att använda specialiserade verktyg. På Linux är dessa grep, head, tail, cut, wc, awk.

För att få antal klienter från arp -utdata måste jag filtrera tabellen (ta bort orelaterade objekt) och räkna tabellraderna, vilket resulterar i följande kommando:

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

Vi prövar:

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

1

Bra. Vi får nu idén om hur vi kan samla all nödvändig information. Låt oss automatisera den. För att göra vår kod ren och utökbar kan vi skapa några hjälpfunktioner:

funktion exec_out (cmd)

lokal fil = io.popen (cmd) om inte filen, returnera nil end lokal output = file: read ('*all') file: close () print ("Run:"..cmd.. " ->".. output) return output output function read_file (sökväg) lokal fil = io.open (sökväg, "rb") om inte fil så returnera noll slut lokalt innehåll = fil: läs "*a" fil: stäng () print ("Läs: "..väg.." -> "..innehåll) returnera innehållsslut

Med hjälp av dessa verktyg kan vi nu implementera de faktiska datahämtningsfunktionerna:

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

Du kan köra delar av dessa skalkommandon för att få en djupare förståelse för hur det fungerar och anpassa det till dina behov.

Det enklaste är att skicka data till Blynk -appen. Standardexemplet ställer redan in timern, som kör någon kod var 5: e sekund, så vi återanvänder den bara:

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

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

I appen lägger vi till tre etikettwidgets och tilldelar dem till Virtual Pins 10, 11, 12 i enlighet därmed.

Medan detta fungerar är det ganska ineffektivt, eftersom WAN IP eller antal klienter inte uppdateras så ofta. Låt oss fixa detta

För WAN IP flyttar vi den till ansluten hanterare. Det körs varje gång routern upprättar anslutning till Blynk Cloud. Detta bör vara tillräckligt:

blynk: on ("ansluten", funktion ()

print ("Ready") blynk: virtualWrite (12, getWanIP ()) slutet)

För Uptime och Clients Number skapar vi en separat timer med 5 min. intervall:

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

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

Steg 5: WiFi -kontroll: PÅ/AV

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

Fram till nu fick vi bara lite information från enheten. Låt oss försöka kontrollera den!

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

om param [1] == "1" sedan os.execute ("wifi up") annars os.execute ("wifi down") slutet slut)

På appsidan lade jag bara till en knapp -widget (läge: Switch) och tilldelade den till V20.

Det är allt. Fantastisk.

Steg 6: Diagram för 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 måste också skicka data till Blynk (låt oss använda tmr1 igen):

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

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

Lägg till SuperChart -widgeten på App -sidan. Lägg till CPU, RAM -dataströmmar och tilldela V5, V6.

Steg 7: Hårddiskens rotationsstatus

Min router har en extern hårddisk ansluten som en nätverksansluten lagringsenhet. Saken är att den här enheten är konfigurerad för att börja snurra när någon kommer åt den och att avbryta efter en timeout.

Självklart skulle det vara häftigt att veta hur många gånger det tänds under en dag. Så jag lade till ytterligare en dataström i mitt systemdiagram.

Det är lite mer knepigt att få status för hårddisken, men jag hittade ett sätt! Först och främst installerar du smartmontools från SSH -konsolen:

opkg uppdatering

opkg installera smartmontools

Sedan, i vår kod, måste vi köra ett speciellt kommando och kontrollera utgångskoden:

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 returnera sedan 1 annan returnera 0 slutet

Obs: min hårddisk är /dev /sda

Steg 8: Nätverksaktivitetsdiagram

Nätverksaktivitetsdiagram
Nätverksaktivitetsdiagram

Vi skapar en annan SuperChart -widget (liknande den föregående), lägger till TX- och RX -dataströmmar och tilldelar V1 och V2. Obs: Jag vill visa WAN -portstatistik och min WAN -port är eth0.2

Hjälpfunktioner:

funktion 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")) slutet

Lägg sedan till lite kod till samma tmr1. Detta är mer komplicerat, eftersom vi bara behöver beräkna och visa skillnaden i överförda/mottagna byte:

lokal prevTx, prevRx

lokal tmr1 = Timer: ny {intervall = 5000, func = funktion () lokal tx = getWanTxBytes () lokal rx = getWanRxBytes () om prevTx och prevTx ~ = tx sedan blynk: virtualWrite (1, tx - prevTx) slutar om prevRx och prevRx ~ = rx sedan blynk: virtualWrite (2, rx - prevRx) end prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning ()) slutet}

Steg 9: Meddelanden

Meddelanden
Meddelanden

Jag ville också bli aviserad när min router tappar ström eller internetanslutning. För detta behöver vi Notification widget.

I widgetinställningar, aktivera "offline -avisering". Ingen kod behövs. Men vi kan också skicka anpassade aviseringar från vår kod.

Steg 10: Autorun i bakgrunden

För tillfället måste manuset köras manuellt, men jag vill att det ska köras i bakgrunden automatiskt när routern startas.

Detta görs genom att skapa en tjänst. Skapa en fil /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; eko "blynkmon körs redan" avsluta 0 fi cd /root /lua-blynk lua blynkmon.lua din-auth-token> /dev /null & echo $! > $ pidfile} stop () {om [! -f $ pidfile]; eko sedan "blynkmon körs inte" avsluta 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Obs: glöm inte att ersätta din-auth-token

Aktivera sedan blynkmon -tjänsten:

service blynkmon aktivera

Steg 11: Slutsats och ytterligare idéer

Slutsats och ytterligare idéer
Slutsats och ytterligare idéer

Du kan skanna denna QR för att få klonen i mitt Blynk -projekt. Det kräver några energipunkter (4600), eftersom det använder många widgets!

Hitta hela Lua -koden här:

Så långt så bra, men här är några idéer som jag skulle vilja lägga till inom en snar framtid.

  • Lägg till kommando omstart. Förhindra att du klickar på det av misstag.
  • Lägg till Terminal -widget för att köra valfritt linux -kommando.
  • Lägg till CPU -temperaturdiagram.

    UPD: Tyvärr saknar OpenWrt för närvarande några drivrutiner för min routermodell. Men den är tillgänglig för många andra routrar

  • Lägg till avisering när en viss enhet ansluter/lämnar nätverket. Vi har redan arp -information, kontrollera nu bara MAC -adressen.

På så sätt kan vi övervaka och styra 3D -skrivare, robotar, en vanlig dator/bärbar dator, Arduino/ESP8266/ESP32/RaspberryPi -saker, Smart Home -enheter och nästan allt som finns. Låt mig veta om du har andra intressanta idéer. Vad tycker du om allt detta?

Rekommenderad: