Inhoudsopgave:
- Stap 1: Ik neem aan dat je OpenWrt al hebt…
- Stap 2: Software en hulpmiddelen
- Stap 3: Een minimale app maken
- Stap 4: wat informatie toevoegen: aantal clients, WAN IP-adres, uptime
- Stap 5: WiFi-bediening: AAN/UIT
- Stap 6: Systeemstatistieken
- Stap 7: HDD-spinstatus
- Stap 8: Netwerkactiviteitengrafiek
- Stap 9: Meldingen
- Stap 10: Autorun op de achtergrond
- Stap 11: Conclusie & verdere ideeën
Video: Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router: 11 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Ik heb onlangs een nieuwe router gekocht (Xiaomi Mi Router 3G). En natuurlijk inspireerde dit nieuwe, geweldige stuk hardware me om aan dit project te gaan werken;)
Stap 1: Ik neem aan dat je OpenWrt al hebt…
Ik moest eerst OpenWrt installeren … Meestal volgde ik deze handleiding (specifiek voor dit routermodel): https://dzone.com/articles/hacking-into-xiaomi-mi-… Terwijl ik hieraan werkte, vond ik deze geweldige video: Openwrt installatie, WiFi benchmark, Girlfriend Flashing. Wow ik heb zo hard gelachen!:)
Aandacht! Als u OpenWrt installeert, kan uw router worden geblokkeerd. Maar eenmaal voltooid, ontgrendelt het volledige kracht en controle. Ik ben niet dapper genoeg om hier instructies te geven, omdat ze voor elk routermodel anders kunnen zijn.
Maar als je OpenWrt al op je router hebt staan, kun je binnen no-time aan de slag met deze tutorial
Trouwens, sommige ontwikkelborden worden standaard geleverd met OpenWrt, zoals Onion Omega, VoCore, LinkIt Smart 7688 en andere. Deze tutorial legt ook enkele basisideeën uit achter het maken van dergelijke apps, zodat je het gemakkelijk kunt aanpassen om met Raspberry Pi en dergelijke te werken.
Voor dit project gebruik ik meestal vooraf geïnstalleerde software (beschikbaar op elke OpenWrt-compatibele router). Maar voor sommige geavanceerde functionaliteit moest ik extra pakketten installeren. Dit gebeurt in slechts een paar klikken, dus ik zal de instructies hier opnemen.
Verder neem ik aan dat je het al weet:
- SSH-terminal openen/gebruiken op uw OpenWrt-router
- Bestanden uploaden/bewerken op uw router (gebruik FileZilla of scp/sftp)
- Hoe te werken met de Linux-console
Stap 2: Software en hulpmiddelen
Aan de smartphonekant gebruik ik Blynk. Het biedt iOS- en Android-apps om alle hardware te bedienen. U kunt eenvoudig prachtige grafische interfaces bouwen voor al uw projecten door eenvoudig widgets te slepen en neer te zetten, rechtstreeks op uw smartphone. Blynk wordt meestal gebruikt met Arduino, Raspberry Pi, enz. Maar waarom zou u het niet op de router zelf uitvoeren?;)
Aan de apparaatkant zal ik Lua gebruiken om de benodigde functionaliteit te scripten. Ik zou ook Python of Node.js kunnen gebruiken, maar helaas zijn deze opties niet altijd beschikbaar vanwege een gebrek aan bronnen op sommige routers. Of C/C++, maar het is niet zo handig om mee te werken (hercompileren voor elke wijziging, enz.) Aan de andere kant is Lua vooraf geïnstalleerd, eenvoudig te gebruiken en te leren. Het wordt gebruikt door de standaard webinterface, LuCI.
Stap 3: Een minimale app maken
Aan de slag met Blynk en Lua is zo eenvoudig als:
- Download de Blynk-app (van App Store, Google Play)
- Maak een nieuw project en ontvang de Auth Token
- Volg de Blynk Lua installatie-instructies voor OpenWrt.
Gebruik SSH om toegang te krijgen tot uw routerconsole. Na het uitvoeren van het standaardvoorbeeld:
lua./examples/client.lua
We zouden zoiets als dit moeten zien:
Verbinden…
SSL-handdruk… Klaar.
Dat betekent dat de beveiligde, bidirectionele verbinding met de app tot stand wordt gebracht!YAY!
We kunnen het gegeven voorbeeld nu gemakkelijk uitbreiden, zodat het iets interessants doet. Ik heb een kopie van dit voorbeeld gemaakt om het te bewerken:
cp./examples/client.lua./blynkmon.lua
Stap 4: wat informatie toevoegen: aantal clients, WAN IP-adres, uptime
Het basisidee is om de informatie periodiek van het besturingssysteem te krijgen, indien nodig enkele eenvoudige berekeningen uit te voeren en het resultaat vervolgens naar Blynk te sturen voor weergave.
In Linux/OpenWrt hebben we verschillende manieren om de systeemgegevens op te halen:
- Voer een opdracht uit en ontleden de tekst die het uitvoert
- Voer een opdracht uit en kijk naar de afsluitcode die wordt geretourneerd
- Lees een systeembestand in /proc/ en /sys/class/ directory's
Nu wil ik het aantal aangesloten apparaten weergeven.
Wanneer ik cat /proc/net/arp op de console uitvoer, wordt de lijst met bekende apparaten weergegeven, samen met hun MAC- en IP-adressen:
IP-adres HW-type Vlaggen HW-adres Masker Apparaat
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
We kunnen het direct in Lua ontleden, maar het is vaak gemakkelijker om gespecialiseerde hulpprogramma's te gebruiken. Op Linux zijn dit grep, head, tail, cut, wc, awk.
Om het aantal clients uit de arp-uitvoer te halen, moet ik de tabel filteren (niet-gerelateerde items verwijderen) en de tabelrijen tellen, wat resulteert in de volgende opdracht:
cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l
Laten we het proberen:
root@router:~/lua-blynk# cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l
1
Super goed. We krijgen nu een idee hoe we alle benodigde informatie kunnen verzamelen. Laten we het automatiseren. Laten we, om onze code schoon en uitbreidbaar te maken, enkele hulpfuncties maken:
functie exec_out(cmd)
local file = io.popen(cmd) zo niet file dan retourneer nihil end local output = file:read('*all') file:close() print("Run: "..cmd.." -> ".. output) return output end function read_file(path) local file = io.open(path, "rb") zo niet file dan return nihil end local content = file:read "*a" file:close() print("Lees: "..path.." -> "..content) return content end
Met behulp van deze hulpprogramma's kunnen we nu de feitelijke functies voor het ophalen van gegevens implementeren:
functie 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 }'")) end function getWanIP() return exec_out("ifconfig eth0.2 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}'") end
U kunt delen van deze shell-commando's uitvoeren om meer inzicht te krijgen in hoe het werkt en om het aan uw behoeften aan te passen.
Het gemakkelijkste is om de gegevens naar de Blynk-app te sturen. Het standaardvoorbeeld stelt de timer al in, die elke 5 seconden wat code uitvoert, dus we hergebruiken het gewoon:
local tmr1 = Timer:new{interval = 5000, func = function()
blynk:virtualWrite(10, getArpClients()) blynk:virtualWrite(11, string.format("%.1f h", getUptime()/60/60)) blynk:virtualWrite(12, getWanIP()) end}
In de app voegen we 3 labelwidgets toe en wijzen ze dienovereenkomstig toe aan Virtual Pins 10, 11, 12.
Hoewel dit werkt, is het nogal inefficiënt, omdat WAN IP of het aantal clients niet zo vaak wordt bijgewerkt. Laten we dit oplossen
Voor WAN IP verplaatsen we het naar de verbonden handler. Het wordt uitgevoerd elke keer dat de router verbinding maakt met Blynk Cloud. Dit zou voldoende moeten zijn:
blynk:on("verbonden", functie()
print("Klaar.") blynk:virtualWrite(12, getWanIP()) einde)
Voor Uptime en Clients Number creëren we een aparte timer met 5 min. interval:
local tmr2 = Timer:new{interval = 5*60*1000, func = function()
blynk:virtualWrite(10, getArpClients()) blynk:virtualWrite(11, string.format("%.1f h", getUptime()/60/60)) end}
Stap 5: WiFi-bediening: AAN/UIT
Tot nu toe kregen we alleen wat informatie van het apparaat. Laten we proberen het te besturen!
blynk:aan("V20", functie(param)
if param[1] == "1" then os.execute("wifi up") else os.execute("wifi down") end end)
Aan de app-kant heb ik zojuist een Button-widget (modus: Switch) toegevoegd en toegewezen aan V20.
Dat is het. Verbazingwekkend.
Stap 6: Systeemstatistieken
functie getCpuLoad()
return tonumber(exec_out("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $2+$4}'")) end function getRamUsage() return tonumber(exec_out("free | grep Mem | awk ' {afdrukken ($3-$7)/$2 * 100,0}'")) einde
We moeten de gegevens ook naar Blynk sturen (laten we tmr1 opnieuw gebruiken):
local tmr1 = Timer:new{interval = 5000, func = function()
blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) end}
Voeg aan de app-kant de SuperChart-widget toe. Voeg CPU-, RAM-gegevensstromen toe en wijs deze toe aan V5, V6.
Stap 7: HDD-spinstatus
Mijn router heeft een externe HDD-schijf die is aangesloten als een Network Attached Storage-apparaat. Het punt is dat deze schijf is geconfigureerd om te beginnen met draaien wanneer iemand er toegang toe heeft, en na een time-out wordt onderbroken.
Het zou natuurlijk cool zijn om te weten hoe vaak het gedurende een dag wordt ingeschakeld. Dus ik heb nog een datastroom toegevoegd aan mijn systeemdiagram.
Het is een beetje lastiger om de status van de HDD-drive te krijgen, maar ik heb een manier gevonden! Installeer eerst smartmontools vanaf de SSH-console:
opkg-update
opkg installeer smartmontools
Vervolgens moeten we in onze code een speciale opdracht uitvoeren en de afsluitcode controleren:
functie exec_ret(cmd)
local exit = os.execute(cmd) print("Run: "..cmd.." -> exit:"..exit) return exit end function getHddSpinning() if exec_ret("smartctl --nocheck=standby --info /dev/sda > /dev/null") == 0 dan return 1 else return 0 end end
Opmerking: mijn HDD is /dev/sda
Stap 8: Netwerkactiviteitengrafiek
We maken nog een SuperChart-widget (vergelijkbaar met de vorige), TX- en RX-gegevensstromen toevoegen en toewijzen aan V1 en V2. Opmerking: ik wil WAN-poortstatc weergeven en mijn WAN-poort is eth0.2
Hulpfuncties:
functie 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")) einde
Voeg vervolgens wat code toe aan dezelfde tmr1. Dit is ingewikkelder, omdat we alleen het verschil in verzonden/ontvangen bytes hoeven te berekenen en weer te geven:
lokale prevTx, prevRx
local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() if prevTx en prevTx ~= tx then blynk:virtualWrite(1, tx - prevTx) end if prevRx en prevRx ~= rx dan blynk:virtualWrite(2, rx - prevRx) end prevTx = tx prevRx = rx blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage())Writepinning(virtual getRamUsage()) Writepining:virtualWrite(5, getCpuLoad()))) einde}
Stap 9: Meldingen
Ik wilde ook een melding ontvangen wanneer mijn router stroom of internetverbinding verliest. Hiervoor hebben we een meldingswidget nodig.
Schakel in widgetinstellingen "offline melding" in. Geen code nodig. Maar we kunnen ook aangepaste meldingen sturen vanuit onze code.
Stap 10: Autorun op de achtergrond
Voorlopig moet het script handmatig worden uitgevoerd, maar ik wil het automatisch op de achtergrond laten draaien wanneer de router wordt ingeschakeld.
Dit doe je door een dienst aan te maken. Maak een bestand /etc/init.d/blynkmon aan:
#!/bin/sh /etc/rc.common
START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $pidfile]; dan echo "blynkmon is al actief" exit 0 fi cd /root/lua-blynk lua blynkmon.lua uw-auth-token > /dev/null & echo $! > $pidfile } stop() { if [! -f $pidbestand]; dan echo "blynkmon niet actief" exit 0 fi kill -9 $(cat $pidfile) rm $pidfile}
Let op: vergeet niet uw auth-token te vervangen
Schakel vervolgens de blynkmon-service in:
service blynkmon inschakelen
Stap 11: Conclusie & verdere ideeën
Je kunt deze QR scannen om de kloon van mijn Blynk Project te krijgen. Het vereist enkele energiepunten (4600), omdat het veel widgets gebruikt!
Vind hier de volledige Lua-code:
Tot nu toe gaat het goed, maar hier zijn enkele ideeën die ik in de nabije toekomst zou willen toevoegen.
- Voeg de opdracht Opnieuw opstarten toe. Voorkom dat je er per ongeluk op klikt.
- Voeg Terminal-widget toe om elk Linux-commando uit te voeren.
-
Voeg CPU-temperatuurgrafiek toe.
UPD: Helaas mist OpenWrt momenteel enkele stuurprogramma's voor mijn routermodel. Maar het is beschikbaar voor veel andere routers
- Voeg een melding toe wanneer een bepaald apparaat zich bij het netwerk aansluit of het netwerk verlaat. We hebben al arp-info, controleer nu alleen het MAC-adres.
Op deze manier kunnen we 3D-printers, robots, een gewone pc/laptop, Arduino/ESP8266/ESP32/RaspberryPi-dingen, Smart Home-apparaten en vrijwel alles in de buurt controleren en besturen. Laat het me weten als je nog andere interessante ideeën hebt. Wat vind je van dit alles?
Aanbevolen:
Op afstand toegang krijgen tot de Raspberry Pi: SSH, Dekstop & FTP: 4 stappen
Op afstand toegang krijgen tot de Raspberry Pi: SSH, Dekstop & FTP: In dit bericht gaan we kijken naar 3 verschillende methoden waarmee je op afstand toegang kunt krijgen tot de Raspberry Pi om het een beetje gemakkelijker te maken om ermee te werken. De eerste is SSH, waarmee u op afstand toegang kunt krijgen tot de terminal. De tweede is een remo
Toegang krijgen tot een Dell Inspiron 15 3000 serie harde schijf: 10 stappen
Toegang krijgen tot een Dell Inspiron 15 3000-serie harde schijf: Hallo Instructables-lezers, vandaag laat ik u zien hoe u toegang krijgt tot een harde schijf in een Dell Inspiron 15 3000-serie laptop. Hoogstwaarschijnlijk, als u dit leest, hebt u ofwel problemen met het fotograferen van de computer en wilt u de harde schijf opnieuw plaatsen of u
Toegang krijgen tot een extern rootbestandssysteem met behulp van DB410 als een Ethernet-dongle: 6 stappen
Toegang krijgen tot het externe rootbestandssysteem met behulp van DB410 als een Ethernet-dongle: Doelstellingen: Installeer de toolchain en hercompileer de kernel om ondersteuning voor USB Ethernet CDC-gadgets in te voegen; Maak boot.img opnieuw van Linaro om USB Ethernet CDC op te starten; Maak een NFS-server om het rootbestandssysteem te hosten; IP-configuratie in DEVICE en HOST
Toegang krijgen tot uw muziek zonder iTunes !!: 6 stappen
Toegang krijgen tot je muziek zonder iTunes !!: Deze Instructable laat je zien hoe je toegang krijgt tot de muziek op je iPod touch, iPhone of iPad zonder iTunes Abonneer je op mijn kanaal Bedankt
Overal toegang krijgen tot uw muziek met uw Mac Mini: 5 stappen
Hoe u overal toegang tot uw muziek krijgt met uw Mac Mini: deze instructable verandert uw computer in een privéshare-server. Het zal je muziek hosten, zodat alleen jij erbij kunt. Maar, ervan uitgaande dat uw internetverbinding snel genoeg is, kunt u deze van over de hele wereld bereiken. Hoe gaaf is dat