Inhoudsopgave:

Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router: 11 stappen
Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router: 11 stappen

Video: Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router: 11 stappen

Video: Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router: 11 stappen
Video: Een privénetwerk op internet maken 2024, Juni-
Anonim
Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router
Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router
Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router
Android/iOS-app om op afstand toegang te krijgen tot uw OpenWrt-router

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 neem aan dat je al OpenWrt hebt…
Ik neem aan dat je al OpenWrt 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

Software en hulpmiddelen
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

WiFi-bediening: AAN/UIT
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

Systeemstatistieken
Systeemstatistieken
Systeemstatistieken
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

Netwerkactiviteitsdiagram
Netwerkactiviteitsdiagram

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

Meldingen
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

Conclusie & verdere ideeën
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: