Tartalomjegyzék:

Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez: 11 lépés
Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez: 11 lépés

Videó: Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez: 11 lépés

Videó: Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez: 11 lépés
Videó: Kernel Router Secrets: Unveiling Windows 11/Server 2022's Route Table! 2024, November
Anonim
Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez
Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez
Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez
Android/iOS alkalmazás az OpenWrt Router távoli eléréséhez

Nemrég vettem egy új routert (Xiaomi Mi Router 3G). És persze ez az új, fantasztikus hardver inspirált arra, hogy elkezdjek dolgozni ezen a projekten;)

1. lépés: Feltételezem, hogy már rendelkezik OpenWrt programmal…

Feltételezem, hogy már rendelkezik OpenWrt -szel…
Feltételezem, hogy már rendelkezik OpenWrt -szel…

Először az OpenWrt-et kellett telepítenem… Többnyire ezt az útmutatót követtem (kifejezetten erre a routermodellre): https://dzone.com/articles/hacking-into-xiaomi-mi-… Ezen dolgozva találtam ezt a fantasztikus videót: Openwrt telepítés, WiFi benchmark, Girlfriend Flashing. Wow, annyira nevettem!:)

Figyelem! Az OpenWrt telepítése tönkreteheti az útválasztót. De miután elkészült, teljes hatalmat és irányítást szabadít fel. Nem vagyok elég bátor, hogy itt bármilyen utasítást adjak, mivel ezek minden útválasztó modellnél eltérőek lehetnek.

De ha már rendelkezik OpenWrt -vel az útválasztón, akkor ezzel az oktatóanyaggal kezdheti a munkát

BTW, egyes fejlesztőlapok az OpenWrt-hez tartoznak, például Onion Omega, VoCore, LinkIt Smart 7688 és mások. Ez az oktatóanyag néhány alapvető ötletet is elmagyaráz az ilyen alkalmazások létrehozása mögött, így könnyen adaptálhatja azt a Raspberry Pi és a lájkok működéséhez.

Ehhez a projekthez többnyire előre telepített szoftvert fogok használni (elérhető minden OpenWrt-kompatibilis útválasztón). De néhány speciális funkcióhoz további csomagokat kellett telepítenem. Ez mindössze néhány kattintással megtörténik, ezért az utasításokat itt közlöm.

Ezenkívül feltételezem, hogy már tudja:

  • Az SSH terminál megnyitása/használata az OpenWrt útválasztón
  • Fájlok feltöltése/szerkesztése az útválasztón (FileZilla vagy scp/sftp használatával)
  • Hogyan működik a Linux konzol

2. lépés: Szoftver és eszközök

Szoftverek és eszközök
Szoftverek és eszközök

Okostelefonról a Blynk -et használom. IOS és Android alkalmazásokat biztosít a hardverek vezérléséhez. Könnyedén létrehozhat gyönyörű grafikus felületeket minden projektjéhez, egyszerűen húzza és dobja el a widgeteket közvetlenül az okostelefonján. A Blynk többnyire az Arduino, a Raspberry Pi stb.;)

Az eszközoldalon a Lua -t fogom használni a szükséges funkciók szkripteléséhez. Használhatnám a Python -ot vagy a Node.js -t is, de sajnos ezek a lehetőségek nem mindig állnak rendelkezésre, mivel néhány útválasztón nincs erőforrás. Vagy C/C ++, de nem olyan kényelmes vele dolgozni (minden változás után újra összeállítani stb.) Másrészt a Lua előre telepített, egyszerűen használható és tanulható. Az alapértelmezett webes felület, a LuCI használja.

3. lépés: Minimális alkalmazás létrehozása

A Blynk és a Lua használatának megkezdése olyan egyszerű, mint:

  • Töltse le a Blynk alkalmazást (az App Store -ból, a Google Play -ből)
  • Hozzon létre egy új projektet, és szerezze be a hitelesítési tokent
  • Kövesse a Blynk Lua telepítési utasításait az OpenWrt számára.

Az útválasztó konzol eléréséhez használja az SSH -t. Az alapértelmezett példa futtatása után:

lua./examples/client.lua

Valami ilyesmit kellene látnunk:

Csatlakozás…

SSL kézfogás… Kész.

Ami azt jelenti, hogy létrejött a biztonságos, kétirányú kapcsolat az alkalmazással!

Most könnyen kiterjeszthetjük a megadott példát, így valami érdekeset csinál. Létrehoztam egy példányt a példából a szerkesztéshez:

cp./példák/kliens.lua./blynkmon.lua

4. lépés: Néhány információ hozzáadása: Ügyfelek száma, WAN IP -cím, Üzemidő

Az alapötlet az, hogy rendszeresen lekérjük az információkat az operációs rendszertől, szükség esetén elvégezünk néhány egyszerű számítást, majd elküldjük az eredményt a Blynknek megjelenítésre.

A Linux/OpenWrt rendszerben többféle módon szerezhetjük be a rendszeradatokat:

  • Futtasson egy parancsot, és elemezze a kimeneti szöveget
  • Futtasson egy parancsot, és nézze meg a visszatérési kódot
  • Olvassa el a/proc/és/sys/class/könyvtárakban található rendszerfájlt

Most szeretném megjeleníteni a csatlakoztatott eszközök számát.

Amikor a cat/proc/net/arp parancsot futtatom a konzolon, az ismert eszközök listáját adja ki, valamint a MAC- és IP -címüket:

IP cím HW típus Jelzi HW cím Maszk Eszköz

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

Közvetlenül a Lua -ban elemezhetjük, de gyakran könnyebb speciális segédprogramokat használni. Linuxon ezek a grep, head, tail, cut, wc, awk.

Ahhoz, hogy az arp kimenetből lekérjem az ügyfelek számát, szűrnem kell a táblát (el kell távolítanom a nem kapcsolódó elemeket), és meg kell számolnom a táblázat sorait, ami a következő parancsot eredményezi:

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

Próbáljuk ki:

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

1

Nagy. Most megkaptuk az ötletet, hogyan gyűjthetjük össze az összes szükséges információt. Automatizáljuk. Annak érdekében, hogy kódunk tiszta és bővíthető legyen, hozzunk létre néhány segítő funkciót:

függvény exec_out (cmd)

helyi fájl = io.popen (cmd), ha nem fájl, akkor térjen vissza nulla végű helyi kimenet = fájl: olvassa el ('*minden') fájl: zárja () print ("Futtatás:"..cmd.. " ->".. output) return kimenet vége függvény read_file (elérési út) helyi fájl = io.open (elérési út, "rb"), ha nem fájl, akkor vissza nil end local content = file: read "*a" file: close () print ("Olvasás: "..útvonal.." -> "..tartalom) visszatér tartalom vége

Ezen segédprogramok segítségével most megvalósíthatjuk a tényleges adatletöltési funkciókat:

függvény getArpClients ()

return tonumber (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) end függvény getUptime () return tonumber (exec_out ("cat/proc/uptime | awk '{print $ 1 } '")) end függvény getWanIP () return exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") end

Futtathatja ezen parancsok egyes részeit, hogy jobban megértse a működését, és az igényeihez igazítsa.

A legegyszerűbb az adatok elküldése a Blynk alkalmazásba. Az alapértelmezett példa már beállítja az időzítőt, amely 5 másodpercenként futtat valamilyen kódot, ezért csak újra használjuk:

local tmr1 = Időzítő: új {intervallum = 5000, func = function ()

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

Az alkalmazásban hozzáadunk 3 címke widgetet, és ennek megfelelően hozzárendeljük őket a Virtual Pins 10, 11, 12 -hez.

Bár ez működik, meglehetősen nem hatékony, mivel a WAN IP vagy az ügyfelek száma nem frissül olyan gyakran. Javítsuk ki ezt

WAN IP esetén áthelyezzük a csatlakoztatott kezelőbe. Minden alkalommal le fog futni, amikor az útválasztó kapcsolatot létesít a Blynk Cloud szolgáltatással. Ennek elegendőnek kell lennie:

blynk: be ("csatlakoztatva", function ()

print ("Ready.") blynk: virtualWrite (12, getWanIP ()) end)

Az Üzemidő és az Ügyfélszám számára külön időzítőt hozunk létre, 5 perccel. intervallum:

local tmr2 = Időzítő: új {intervallum = 5*60*1000, func = function ()

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

5. lépés: WiFi vezérlés: BE/KI

WiFi vezérlés: BE/KI
WiFi vezérlés: BE/KI

Eddig csak néhány információt kaptunk az eszköztől. Próbáljuk meg irányítani!

blynk: be ("V20", funkció (param)

ha param [1] == "1", akkor os.execute ("wifi up") else os.execute ("wifi down") end end)

Az alkalmazás oldalon most hozzáadtam egy gomb widgetet (mód: kapcsoló), és hozzárendeltem a V20 -hoz.

Ez az. Elképesztő.

6. lépés: Rendszerstatisztikai táblázat

Rendszerstatisztikai diagram
Rendszerstatisztikai diagram
Rendszerstatisztikai diagram
Rendszerstatisztikai diagram

függvény getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'")) end függvény getRamUsage () return tonumber (exec_out ("free | grep Mem | awk ' {print ($ 3- $ 7)/$ 2 * 100.0} '")) end

Az adatokat el kell küldenünk a Blynk -nek is (használjuk újra a tmr1 -et):

local tmr1 = Időzítő: új {intervallum = 5000, func = function ()

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

Az alkalmazásoldalon adjon hozzá SuperChart widgetet. Adjon hozzá CPU-, RAM -adatfolyamokat, és rendelje hozzá a V5, V6 -hoz.

7. lépés: A HDD centrifugálási állapota

Az útválasztómnak van egy külső merevlemez -meghajtója, amely hálózathoz csatlakoztatott tárolóeszközként van csatlakoztatva. A helyzet az, hogy ez a meghajtó úgy van konfigurálva, hogy elkezdje forogni, amikor valaki hozzáfér hozzá, és felfüggeszti az időt.

Nyilván jó lenne tudni, hogy hányszor kapcsol be egy nap alatt. Így hozzáadtam egy másik adatfolyamot a rendszer diagramomhoz.

Kicsit bonyolultabb a merevlemez -meghajtó állapotának megszerzése, de megtaláltam a módját! Először telepítse a smartmontools eszközöket az SSH konzolról:

opkg frissítés

opkg smartmontools telepítése

Ezután a kódunkban egy speciális parancsot kell futtatnunk, és ellenőriznünk kell a kilépési kódot:

függvény exec_ret (cmd)

local exit = os.execute (cmd) print ("Run:"..cmd.. " -> exit:".. exit) return kilépés vége függvény getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0, majd 1 érték visszatérése 0 visszatér 0 vég

Megjegyzés: a merevlemezem a /dev /sda

8. lépés: Hálózati tevékenység diagram

Hálózati tevékenység diagram
Hálózati tevékenység diagram

Létrehozunk egy másik SuperChart widgetet (hasonlóan az előzőhöz), hozzáadunk TX és RX adatfolyamokat, és hozzárendeljük a V1 és V2 -hez. Megjegyzés: Meg akarom jeleníteni a WAN port statc -ot, és a WAN portom eth0.2

Segítő funkciók:

függvény getWanRxBytes ()

return tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) end függvény getWanTxBytes () return tonumber (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) vége

Ezután adjon hozzá néhány kódot ugyanahhoz a tmr1 -hez. Ez bonyolultabb, mivel csak ki kell számolnunk és megjelenítenünk az átvitt/fogadott bájtok közötti különbséget:

helyi 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 majd blynk: virtualWrite (2, rx - prevRx) vége prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning)) vége}

9. lépés: Értesítések

Értesítések
Értesítések

Azt is szerettem volna értesíteni, amikor az útválasztóm megszakítja az áramellátást vagy az internetkapcsolatot. Ehhez szükségünk van az Értesítés modulra.

A widget beállításaiban engedélyezze az "offline értesítést". Nincs szükség kódra. De egyedi értesítéseket is küldhetünk a kódunkból.

10. lépés: Automatikus futtatás a háttérben

Egyelőre a szkriptet manuálisan kell végrehajtani, de azt szeretném, hogy automatikusan fusson a háttérben, amikor a router be van kapcsolva.

Ez egy szolgáltatás létrehozásával történik. Hozzon létre egy fájlt /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; akkor echo "blynkmon már fut" exit 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; majd echo "blynkmon not running" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Megjegyzés: ne felejtse el kicserélni az auth-tokenjét

Ezután engedélyezze a blynkmon szolgáltatást:

szolgáltatás blynkmon engedélyezése

11. lépés: Következtetés és további ötletek

Következtetés és további ötletek
Következtetés és további ötletek

Ezt a QR -t beolvasva megkaphatja a Blynk Project klónját. Ehhez néhány energiapont (4600) szükséges, mivel sok kütyüt használ!

A teljes Lua kódot itt találja:

Eddig jó, de íme néhány ötlet, amelyeket a közeljövőben szeretnék hozzáfűzni.

  • Adja hozzá az Újraindítás parancsot. Kerülje el a véletlen kattintást.
  • A Terminal widget hozzáadásával bármilyen linux parancs futtatható.
  • Adja hozzá a CPU hőmérsékleti diagramját.

    UPD: Sajnos az OpenWrt -ből jelenleg hiányoznak az illesztőprogramok az útválasztómodellhez. De sok más útválasztóhoz is elérhető

  • Értesítés hozzáadása, amikor egy adott eszköz csatlakozik/elhagyja a hálózatot. Már rendelkezünk arp információkkal, most csak a MAC -címet ellenőrizze.

Így felügyelhetjük és irányíthatjuk a 3D nyomtatókat, robotokat, normál PC/laptop, Arduino/ESP8266/ESP32/RaspberryPi cuccokat, intelligens otthoni eszközöket és gyakorlatilag bármit. Mondja el, ha van más érdekes ötlete. Mit gondol minderről?

Ajánlott: