Spisu treści:

Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt: 11 kroków
Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt: 11 kroków

Wideo: Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt: 11 kroków

Wideo: Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt: 11 kroków
Wideo: Masz ROUTER WiFi? Zmień te ustawienia! 2024, Listopad
Anonim
Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt
Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt
Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt
Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt

Niedawno kupiłem nowy router (Xiaomi Mi Router 3G). I oczywiście ten nowy, niesamowity sprzęt zainspirował mnie do rozpoczęcia pracy nad tym projektem;)

Krok 1: Zakładam, że masz już OpenWrt…

Zakładam, że masz już OpenWrt…
Zakładam, że masz już OpenWrt…

Musiałem najpierw zainstalować OpenWrt… Przeważnie postępowałem zgodnie z tym poradnikiem (specyficznym dla tego modelu routera): https://dzone.com/articles/hacking-into-xiaomi-mi-…Podczas pracy nad tym znalazłem ten niesamowity film: Instalacja Openwrt, benchmark WiFi, Girlfriend Flashing. Wow, tak się śmiałem!:)

Uwaga! Instalacja OpenWrt może zepsuć twój router. Ale po zakończeniu odblokowuje pełną moc i kontrolę. Nie jestem na tyle odważny, aby podać tutaj jakieś instrukcje, ponieważ mogą być różne dla każdego modelu routera.

Ale jeśli masz już OpenWrt na swoim routerze, będziesz mógł zacząć od tego samouczka w mgnieniu oka

BTW, niektóre płyty programistyczne są dostarczane z OpenWrt po wyjęciu z pudełka, takie jak Onion Omega, VoCore, LinkIt Smart 7688 i inne. Ten samouczek wyjaśnia również kilka podstawowych pomysłów związanych z tworzeniem takich aplikacji, dzięki czemu można go łatwo dostosować do pracy z Raspberry Pi i podobnymi.

W tym projekcie będę głównie używał preinstalowanego oprogramowania (dostępnego na każdym routerze obsługującym OpenWrt). Ale dla niektórych zaawansowanych funkcji musiałem zainstalować dodatkowe pakiety. Odbywa się to za pomocą zaledwie kilku kliknięć, więc dołączę tutaj instrukcje.

Zakładam też, że już wiesz:

  • Jak otworzyć / użyć terminala SSH do routera OpenWrt?
  • Jak przesyłać/edytować pliki na routerze (użyj FileZilla lub scp/sftp)
  • Jak pracować z konsolą Linux

Krok 2: Oprogramowanie i narzędzia

Oprogramowanie i narzędzia
Oprogramowanie i narzędzia

Od strony smartfona używam Blynk. Zapewnia aplikacje na iOS i Androida do sterowania dowolnym sprzętem. Możesz łatwo tworzyć piękne interfejsy graficzne dla wszystkich swoich projektów, po prostu przeciągając i upuszczając widżety bezpośrednio na smartfonie. Blynk jest najczęściej używany z Arduino, Raspberry Pi itp. Ale dlaczego nie uruchomić go na samym routerze?;)

Po stronie urządzeń będę używał Lua do skryptowania potrzebnej funkcjonalności. Mógłbym też użyć Pythona lub Node.js, ale niestety te opcje nie zawsze są dostępne, ze względu na brak zasobów na niektórych routerach. Lub C/C++, ale praca z nim nie jest tak wygodna (ponowna kompilacja dla każdej zmiany itp.) Z drugiej strony Lua jest preinstalowana, jest prosta w użyciu i nauce. Jest używany przez domyślny interfejs sieciowy LuCI.

Krok 3: Tworzenie minimalnej aplikacji

Rozpoczęcie pracy z Blynk i Lua jest tak proste, jak:

  • Pobierz aplikację Blynk (z App Store, Google Play)
  • Utwórz nowy projekt i zdobądź token uwierzytelniania
  • Postępuj zgodnie z instrukcjami instalacji Blynk Lua dla OpenWrt.

Użyj SSH, aby uzyskać dostęp do konsoli routera. Po uruchomieniu domyślnego przykładu:

lua./przykłady/klient.lua

Powinniśmy zobaczyć coś takiego:

Złączony…

Uzgadnianie SSL… Gotowe.

Oznacza to nawiązanie bezpiecznego, dwukierunkowego połączenia z aplikacją! YAY!

Możemy teraz łatwo rozszerzyć podany przykład, dzięki czemu robi coś interesującego. Stworzyłem kopię tego przykładu, aby go edytować:

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

Krok 4: Dodanie informacji: liczba klientów, adres IP WAN, czas pracy

Podstawową ideą jest okresowe pobieranie informacji z systemu operacyjnego, w razie potrzeby wykonanie prostych obliczeń, a następnie przesłanie wyniku do Blynk w celu wyświetlenia.

W systemie Linux/OpenWrt mamy kilka sposobów na uzyskanie danych systemowych:

  • Uruchom polecenie i przeanalizuj tekst, który wyprowadza
  • Uruchom polecenie i obserwuj kod wyjścia, który zwraca
  • Przeczytaj plik systemowy znajdujący się w katalogach /proc/ i /sys/class/

Teraz chcę wyświetlić liczbę podłączonych urządzeń.

Kiedy uruchamiam cat /proc/net/arp na konsoli, wyświetla listę znanych urządzeń wraz z ich adresami MAC i IP:

Adres IP Typ sprzętu Flagi Adres sprzętowy Maska Urządzenie

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

Możemy je przeanalizować bezpośrednio w Lua, ale często łatwiej jest użyć wyspecjalizowanych narzędzi. W Linuksie są to grep, head, tail, cut, wc, awk.

Aby uzyskać liczbę klientów z danych wyjściowych arp, muszę przefiltrować tabelę (usunąć niepowiązane elementy) i policzyć wiersze tabeli, co skutkuje następującym poleceniem:

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

Spróbujmy:

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

1

Świetny. Teraz rozumiemy, w jaki sposób możemy zebrać wszystkie wymagane informacje. Zautomatyzujmy to. Aby nasz kod był przejrzysty i rozszerzalny, stwórzmy kilka funkcji pomocniczych:

funkcja exec_out(cmd)

local file = io.popen(cmd) jeśli nie file to zwróć zero end local output = file:read('*all') file:close() print("Uruchom: "..cmd.." -> ".. output) return output end function read_file(path) local file = io.open(path, "rb") jeśli nie file, to zwraca nil end local content = file:read "*a" file:close() print("Read: "…ścieżka…" -> "..treść) zwraca treść koniec

Korzystając z tych narzędzi, możemy teraz zaimplementować rzeczywiste funkcje pobierania danych:

funkcja getArpClients()

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

Możesz uruchamiać części tych poleceń powłoki, aby lepiej zrozumieć, jak to działa i dostosować je do swoich potrzeb.

Najłatwiej jest przesłać dane do aplikacji Blynk. Domyślny przykład już ustawia timer, który uruchamia jakiś kod co 5 sekund, więc po prostu używamy go ponownie:

lokalny tmr1 = Timer:new{interwał = 5000, func = function()

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

W aplikacji dodajemy 3 widżety etykiet i odpowiednio przypisujemy je do wirtualnych pinów 10, 11, 12.

Chociaż to działa, jest raczej nieefektywne, ponieważ adres IP sieci WAN lub liczba klientów nie aktualizuje się tak często. Naprawmy to

W przypadku IP WAN przenosimy go do podłączonego handlera. Będzie uruchamiany za każdym razem, gdy router nawiąże połączenie z chmurą Blynk. To powinno wystarczyć:

blynk:on("połączony", funkcja()

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

Dla Uptime i Clients Number tworzymy osobny timer z 5 min. interwał:

lokalny 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: Sterowanie Wi-Fi: WŁ./WYŁ

Sterowanie Wi-Fi: WŁ./WYŁ
Sterowanie Wi-Fi: WŁ./WYŁ

Do tej pory otrzymywaliśmy tylko pewne informacje z urządzenia. Spróbujmy nim sterować!

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

if param[1] == "1" then os.execute("wifi włączone") else os.execute("wifi wyłączone") end end)

Po stronie aplikacji właśnie dodałem widżet przycisku (tryb: Switch) i przypisałem go do V20.

Otóż to. Niesamowity.

Krok 6: Wykres statystyk systemu

Wykres statystyk systemu
Wykres statystyk systemu
Wykres statystyk systemu
Wykres statystyk systemu

funkcja 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 ' {drukuj (3-$7)/$2 * 100.0}')) koniec

Musimy również wysłać dane do Blynk (użyjmy ponownie tmr1):

lokalny tmr1 = Timer:new{interwał = 5000, func = function()

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

Po stronie aplikacji dodaj widżet SuperChart. Dodaj strumienie danych procesora, pamięci RAM i przypisz do V5, V6.

Krok 7: Stan wirowania dysku twardego

Mój router ma zewnętrzny dysk HDD podłączony jako urządzenie Network Attached Storage. Chodzi o to, że ten dysk jest skonfigurowany tak, aby zaczynał się obracać, gdy ktoś uzyska do niego dostęp, i zawiesić się po upływie limitu czasu.

Oczywiście fajnie byłoby wiedzieć, ile razy włącza się w ciągu dnia. Więc dodałem kolejny strumień danych do mojego wykresu systemowego.

Trochę trudniej jest uzyskać status dysku HDD, ale znalazłem sposób! Przede wszystkim zainstaluj smartmontools z konsoli SSH:

aktualizacja opkg

opkg zainstaluj smartmontools

Następnie w naszym kodzie musimy uruchomić specjalną komendę i sprawdzić kod wyjścia:

funkcja exec_ret(cmd)

local exit = os.execute(cmd) print("Uruchom: "..cmd.." -> exit:"..exit) return exit end funkcja getHddSpinning() if exec_ret("smartctl --nocheck=standby --info /dev/sda > /dev/null") == 0 następnie zwróć 1 w przeciwnym razie zwróć 0 koniec koniec

Uwaga: mój dysk to /dev/sda

Krok 8: Wykres aktywności sieci

Wykres aktywności sieci
Wykres aktywności sieci

Tworzymy kolejny widget SuperChart (podobny do poprzedniego), dodajemy strumienie danych TX i RX i przypisujemy do V1 i V2. Uwaga: Chcę wyświetlić statystyki portu WAN, a mój port WAN to eth0.2

Funkcje pomocnicze:

funkcja 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")) kończyć się

Następnie dodaj trochę kodu do tego samego tmr1. Jest to bardziej skomplikowane, ponieważ musimy tylko obliczyć i wyświetlić różnicę w przesłanych/odebranych bajtach:

lokalny prevTx, prevRx

local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() jeśli prevTx i prevTx ~= tx to blynk:virtualWrite(1, tx - prevTx) end if prevRx i prevRx ~= rx then blynk:virtualWrite(2, rx - prevRx) end prevTx = tx prevRx = rx blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) blynk:pinningHd(get))) kończyć się}

Krok 9: Powiadomienia

Powiadomienia
Powiadomienia

Chciałem również otrzymywać powiadomienia, gdy mój router utraci zasilanie lub połączenie z Internetem. Do tego potrzebujemy widżetu powiadomień.

W ustawieniach widżetu włącz "powiadomienie offline". Nie jest potrzebny kod. Ale możemy również wysyłać niestandardowe powiadomienia z naszego kodu.

Krok 10: Automatyczne uruchamianie w tle

Na razie skrypt musi być wykonany ręcznie, ale chcę, aby działał w tle automatycznie po włączeniu routera.

Odbywa się to poprzez utworzenie usługi. Utwórz plik /etc/init.d/blynkmon:

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

START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $plik_pid]; wtedy echo "blynkmon już działa" exit 0 fi cd /root/lua-blynk lua blynkmon.lua twój-token-uwierzytelniania > /dev/null & echo $! > $pidfile } stop() { if [! -f $plik-pid]; then echo "blynkmon nie działa" exit 0 fi kill -9 $(cat $pidfile) rm $pidfile }

Uwaga: nie zapomnij wymienić swojego tokena uwierzytelniania

Następnie włącz usługę blynkmon:

usługa blynkmon włącz

Krok 11: Wnioski i dalsze pomysły

Wnioski i dalsze pomysły
Wnioski i dalsze pomysły

Możesz zeskanować ten kod QR, aby uzyskać klon mojego projektu Blynk. Wymaga kilku punktów energii (4600), ponieważ wykorzystuje wiele widżetów!

Znajdź pełny kod Lua tutaj:

Jak dotąd tak dobrze, ale oto kilka pomysłów, które chciałbym dodać w niedalekiej przyszłości.

  • Dodaj polecenie Uruchom ponownie. Zapobiegaj przypadkowemu kliknięciu.
  • Dodaj widżet Terminal, aby uruchomić dowolne polecenie linux.
  • Dodaj wykres temperatury procesora.

    UPD: Niestety w OpenWrt brakuje obecnie sterowników do mojego modelu routera. Ale jest dostępny dla wielu innych routerów

  • Dodaj powiadomienie, gdy dane urządzenie dołącza/wychodzi z sieci. Mamy już informacje o arp, teraz sprawdź tylko adres MAC.

W ten sposób możemy monitorować i sterować drukarkami 3D, robotami, zwykłym komputerem PC/laptopem, sprzętem Arduino/ESP8266/ESP32/RaspberryPi, urządzeniami Smart Home i praktycznie wszystkim dookoła. Daj mi znać, jeśli masz jakieś inne ciekawe pomysły. Co myślisz o tym wszystkim?

Zalecana: