Innehållsförteckning:
- Steg 1: Jag antar att du redan har OpenWrt…
- Steg 2: Programvara och verktyg
- Steg 3: Skapa en minimal app
- Steg 4: Lägga till lite information: Antal klienter, WAN IP -adress, Uptime
- Steg 5: WiFi -kontroll: PÅ/AV
- Steg 6: Diagram för systemstatistik
- Steg 7: Hårddiskens rotationsstatus
- Steg 8: Nätverksaktivitetsdiagram
- Steg 9: Meddelanden
- Steg 10: Autorun i bakgrunden
- Steg 11: Slutsats och ytterligare idéer
Video: Android/iOS -app för att komma åt din OpenWrt -router på distans: 11 steg
2024 Författare: John Day | [email protected]. Senast ändrad: 2024-01-30 12:44
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 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
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
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
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
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
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
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:
555 Timer för att avge signal för att avbryta Atmega328: 7 steg
555 Timer to Emit Signal to Interrupt Atmega328: Huvudmålet med denna krets är att spara energi. Så jag tänker inte prata om arduino eftersom styrelsen själv har onödig kraftöverlag för en slutprodukt. Det är bra för utveckling. Men, inte särskilt bra för slutprojekt som körs på batt
Skapa en säker zon för Android/IOS/WIN10 -enheter för att förbli olåst: 6 steg
Skapa en säker zon för Android/IOS/WIN10 -enheter för att förbli olåsta: I den här artikeln vill vi göra en cool gadget som kan göra en säker zon för dina enheter att låsas upp. I slutet av detta projekt lär du dig: hur du använder en fingeravtryckssensor. Kommer att lära dig att para ihop dina enheter med din safe zone -gadget. Kommer att
Övertyga dig själv om att bara använda en 12V-till-AC-omriktare för LED-ljussträngar istället för att koppla om dem för 12V: 3 steg
Övertyga dig själv om att bara använda en 12V-till-AC-linjeomvandlare för LED-ljussträngar istället för att koppla om dem för 12V: Min plan var enkel. Jag ville klippa upp en väggdriven LED-ljussträng i bitar och sedan dra om den för att gå av 12 volt. Alternativet var att använda en kraftomvandlare, men vi vet alla att de är fruktansvärt ineffektiva, eller hur? Höger? Eller är de det?
Att använda Parallax Basic Stamp II för att ringa en dörrklocka på distans: 4 steg (med bilder)
Att använda Parallax Basic Stamp II för att ringa en dörrklocka på distans: Problemet? En hund som blir alldeles för upphetsad när dörrklockan ringer. Lösningen? Ring på dörren vid slumpmässiga tillfällen när ingen är där, och ingen svarar på den, för att motkonditionera hunden - för att bryta föreningen som en ringande dörrklocka e
Programmera din dator att stängas av automatiskt genom att ange vilken tid du vill att den ska göra det: 4 steg
Programmera din dator för att stänga av automatiskt genom att ange vilken tid du vill att den ska göra det: hej, det är en annan instruktion som tagits från mitt dagliga liv … förra gången var jag tvungen att ladda ner massor av programvara till min dator och jag var tvungen att låta den ladda ner över natten ville jag inte ha datorn påslagen hela natten efter att jag hade laddat ner och vid