Obsah:

Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt: 11 kroků
Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt: 11 kroků

Video: Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt: 11 kroků

Video: Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt: 11 kroků
Video: Wi-Fi Guru: Nastavení routeru pomocí aplikace TP-Link Tether 2024, Červen
Anonim
Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt
Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt
Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt
Aplikace pro Android/iOS pro vzdálený přístup k routeru OpenWrt

Nedávno jsem si koupil nový router (Xiaomi Mi Router 3G). A samozřejmě mě tento nový, úžasný kus hardwaru inspiroval, abych začal pracovat na tomto projektu;)

Krok 1: Předpokládám, že už máte OpenWrt…

Předpokládám, že už máte OpenWrt…
Předpokládám, že už máte OpenWrt…

Nejprve jsem musel nainstalovat OpenWrt … Většinou jsem se řídil touto příručkou (specifickou pro tento model routeru): https://dzone.com/articles/hacking-into-xiaomi-mi-… Při práci na tom jsem našel toto úžasné video: Instalace Openwrt, benchmark WiFi, Girlfriend Flashing. Páni, tak jsem se smál!:)

Pozornost! Instalace OpenWrt může zkomplikovat váš router. Ale jakmile je dokončen, odemkne plný výkon a ovládání. Nejsem dost odvážný, abych zde poskytoval nějaké pokyny, protože se mohou u každého modelu routeru lišit.

Pokud už ale OpenWrt na routeru máte, budete moci začít s tímto tutoriálem za chvíli

BTW, některé vývojové desky jsou dodávány s otevřeným boxem OpenWrt, jako Onion Omega, VoCore, LinkIt Smart 7688 a další. Tento tutoriál také vysvětluje některé základní myšlenky při vytváření takových aplikací, takže jej můžete snadno přizpůsobit práci s Raspberry Pi a podobnými.

Pro tento projekt budu převážně používat předinstalovaný software (k dispozici na libovolném routeru s podporou OpenWrt). Ale kvůli pokročilým funkcím jsem musel nainstalovat další balíčky. To se provádí několika kliknutími, takže zde uvedu pokyny.

Předpokládám také, že už víte:

  • Jak otevřít/použít terminál SSH na routeru OpenWrt
  • Jak nahrávat/upravovat soubory na vašem routeru (použijte FileZilla nebo scp/sftp)
  • Jak pracovat s konzolí Linux

Krok 2: Software a nástroje

Software a nástroje
Software a nástroje

Na straně smartphonu používám Blynk. Poskytuje aplikace pro iOS a Android pro ovládání jakéhokoli hardwaru. Můžete jednoduše vytvářet krásná grafická rozhraní pro všechny své projekty pouhým přetažením widgetů přímo ve smartphonu. Blynk se většinou používá s Arduino, Raspberry Pi atd. Ale proč jej nespouštět na samotném routeru?;)

Na straně zařízení budu pomocí Lua skriptovat potřebné funkce. Mohl bych také použít Python nebo Node.js, ale bohužel tyto možnosti nejsou vždy k dispozici, kvůli nedostatku zdrojů na některých směrovačích. Nebo C/C ++, ale práce s ním není tak pohodlná (překompilování pro každou změnu atd.) Na druhou stranu Lua je předinstalovaná, snadno se používá a učí se. Používá ho výchozí webové rozhraní LuCI.

Krok 3: Vytvoření minimální aplikace

Začít s Blynkem a Luou je stejně snadné jako:

  • Stáhněte si aplikaci Blynk (z App Store, Google Play)
  • Vytvořte nový projekt a získejte ověřovací token
  • Postupujte podle pokynů k instalaci Blynk Lua pro OpenWrt.

Pomocí SSH získáte přístup ke konzole routeru. Po spuštění výchozího příkladu:

lua./examples/client.lua

Měli bychom vidět něco takového:

Spojovací…

Podání ruky SSL … Připraveno.

To znamená, že je vytvořeno zabezpečené obousměrné připojení k aplikaci! YAY!

Nyní můžeme snadno rozšířit uvedený příklad, takže dělá něco zajímavého. Vytvořil jsem kopii tohoto příkladu, abych ji mohl upravit:

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

Krok 4: Přidání některých informací: počet klientů, IP adresa WAN, doba provozu

Základní myšlenkou je pravidelně získávat informace z operačního systému, v případě potřeby provést několik jednoduchých výpočtů a poté odeslat výsledek Blynkovi k zobrazení.

V Linuxu/OpenWrt máme několik způsobů, jak získat systémová data:

  • Spusťte příkaz a analyzujte text, který vydává
  • Spusťte příkaz a sledujte návratový kód, který vrací
  • Přečtěte si systémový soubor umístěný v adresářích/proc/a/sys/class/

Nyní chci zobrazit počet připojených zařízení.

Když spustím cat/proc/net/arp na konzole, zobrazí se seznam známých zařízení spolu s jejich MAC a IP adresami:

IP adresa Typ HW Příznaky HW adresa Maska Zařízení

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

Můžeme to analyzovat přímo v Lua, ale často je jednodušší použít specializované nástroje. V Linuxu jsou to grep, head, tail, cut, wc, awk.

Abych získal počet klientů z výstupu arp, potřebuji filtrovat tabulku (odstranit nesouvisející položky) a spočítat řádky tabulky, což má za následek následující příkaz:

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

Pojďme to zkusit:

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

1

Skvělý. Nyní máme představu, jak můžeme shromáždit všechny požadované informace. Pojďme to zautomatizovat. Aby byl náš kód čistý a rozšiřitelný, vytvořme některé pomocné funkce:

funkce exec_out (cmd)

lokální soubor = io.popen (cmd), pokud ne soubor, pak se vrátí bez konce místní výstup = soubor: čtení ('*all') soubor: zavřít () tisk ("Spustit:"..cmd.. " ->".. výstup) návrat funkce výstupu výstup read_file (cesta) lokální soubor = io.open (cesta, „rb“) pokud ne soubor, pak vraťte nula konec místní obsah = soubor: přečtěte si „*a“soubor: zavřete () tisk („Přečíst: "..path.." -> "..content) návrat obsahu konec

Pomocí těchto nástrojů můžeme nyní implementovat skutečné funkce načítání dat:

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

Můžete spustit části těchto příkazů prostředí, abyste získali hlubší znalosti o tom, jak to funguje, a upravili to podle svých potřeb.

Nejjednodušší je odeslat data do aplikace Blynk. Výchozí příklad již nastavuje časovač, který každých 5 sekund spouští nějaký kód, takže jej znovu použijeme:

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}

V aplikaci přidáme 3 widgety štítků a podle toho je přiřadíme k virtuálním pinům 10, 11, 12.

I když to funguje, je to docela neefektivní, protože IP WAN nebo počet klientů se tak často neaktualizují. Pojďme to opravit

U WAN IP přesouváme na připojený handler. Spustí se pokaždé, když router naváže připojení k Blynk Cloud. To by mělo stačit:

blynk: on ("připojeno", funkce ()

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

Pro Uptime a Clients Number vytvoříme samostatný časovač s 5 min. časový úsek:

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}

Krok 5: Ovládání WiFi: ON/OFF

Ovládání WiFi: ON/OFF
Ovládání WiFi: ON/OFF

Až dosud jsme ze zařízení dostávali jen nějaké informace. Zkusme to ovládat!

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

if param [1] == "1" then os.execute ("wifi up") else os.execute ("wifi down") end end)

Na straně aplikace jsem právě přidal widget Button (režim: Přepnout) a přiřadil jej k V20.

A je to. Úžasný.

Krok 6: Tabulka statistik systému

Tabulka statistik systému
Tabulka statistik systému
Tabulka statistik systému
Tabulka statistik systému

funkce getCpuLoad ()

vrátit tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'" ")) end function getRamUsage () return tonumber (exec_out (" free | grep Mem | awk ' {print ($ 3- $ 7)/$ 2 * 100.0} '")) end

Musíme také poslat data do Blynku (použijme znovu tmr1):

local tmr1 = Timer: new {interval = 5000, func = function ()

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

Na straně aplikace přidejte widget SuperChart. Přidejte datové toky CPU, RAM a přiřaďte k V5, V6.

Krok 7: Stav otáčení pevného disku

Můj router má externí jednotku pevného disku připojenou jako zařízení připojené k síti. Jde o to, že tato jednotka je nakonfigurována tak, aby se začala otáčet, když k ní někdo přistupuje, a aby se po uplynutí časového limitu pozastavila.

Očividně by bylo skvělé vědět, kolikrát se během dne zapne. Přidal jsem tedy do svého systémového grafu další datový tok.

Získat stav pevného disku je trochu složitější, ale cestu jsem našel! Nejprve nainstalujte smartmontools z konzoly SSH:

aktualizace opkg

opkg nainstalujte smartmontools

Potom v našem kódu musíme spustit speciální příkaz a zkontrolovat výstupní kód:

funkce 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 pak vrátí 1 jinak vrátí 0 konec konce

Poznámka: můj pevný disk je /dev /sda

Krok 8: Graf aktivity sítě

Tabulka síťových aktivit
Tabulka síťových aktivit

Vytvoříme další widget SuperChart (podobný předchozímu), přidáme datové toky TX a RX a přiřadíme k V1 a V2. Poznámka: Chci zobrazit statc portu WAN a můj port WAN je eth0.2

Pomocné funkce:

funkce 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")) konec

Dále přidejte nějaký kód do stejného tmr1. To je složitější, protože potřebujeme pouze vypočítat a zobrazit rozdíl v odeslaných/přijatých bajtech:

místní 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 then blynk: virtualWrite (2, rx - prevRx) end prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning ()) konec}

Krok 9: Oznámení

Oznámení
Oznámení

Také jsem chtěl být upozorněn, když můj router ztratí napájení nebo připojení k internetu. K tomu potřebujeme widget Oznámení.

V nastavení widgetu povolte „offline upozornění“. Není potřeba žádný kód. Můžeme ale také zasílat vlastní oznámení z našeho kódu.

Krok 10: Automatické spuštění na pozadí

Prozatím musí být skript spuštěn ručně, ale chci, aby běžel automaticky na pozadí při zapnutí routeru.

To se provádí vytvořením služby. Vytvořte soubor /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; pak echo "blynkmon již běží" exit 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; pak ozvěna „blynkmon neběží“exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Poznámka: nezapomeňte vyměnit svůj-auth-token

Poté povolte službu blynkmon:

povolit službu blynkmon

Krok 11: Závěr a další nápady

Závěr a další nápady
Závěr a další nápady

Můžete naskenovat tento QR a získat klon mého projektu Blynk. Vyžaduje několik energetických bodů (4600), protože využívá spoustu widgetů!

Úplný kód Lua najdete zde:

Zatím je to dobré, ale tady je pár nápadů, které bych rád přidal v blízké budoucnosti.

  • Přidat příkaz restartovat. Zabraňte nechtěnému kliknutí.
  • Chcete -li spustit libovolný příkaz linux, přidejte widget Terminal.
  • Přidejte graf teploty CPU.

    UPD: Bohužel OpenWrt aktuálně postrádá některé ovladače pro můj model routeru. Je však k dispozici pro mnoho dalších směrovačů

  • Přidejte oznámení, když se konkrétní zařízení připojí/opustí síť. Informace o ARP již máme, nyní zkontrolujte pouze MAC adresu.

Tímto způsobem můžeme monitorovat a ovládat 3D tiskárny, roboty, běžný počítač/notebook, věci Arduino/ESP8266/ESP32/RaspberryPi, zařízení Smart Home a prakticky cokoli kolem. Dejte mi vědět, pokud máte nějaké další zajímavé nápady. Co si o tom všem myslíte?

Doporučuje: