Spisu treści:
- Krok 1: Zakładam, że masz już OpenWrt…
- Krok 2: Oprogramowanie i narzędzia
- Krok 3: Tworzenie minimalnej aplikacji
- Krok 4: Dodanie informacji: liczba klientów, adres IP WAN, czas pracy
- Krok 5: Sterowanie Wi-Fi: WŁ./WYŁ
- Krok 6: Wykres statystyk systemu
- Krok 7: Stan wirowania dysku twardego
- Krok 8: Wykres aktywności sieci
- Krok 9: Powiadomienia
- Krok 10: Automatyczne uruchamianie w tle
- Krok 11: Wnioski i dalsze pomysły
Wideo: Aplikacja na Androida/iOS umożliwiająca zdalny dostęp do routera OpenWrt: 11 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:30
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…
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
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Ł
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
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
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
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
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:
Zegar cyfrowy LED Dot Matrix - ESP Matrix Aplikacja na Androida: 14 kroków
Cyfrowy zegar LED Dot Matrix - aplikacja ESP Matrix na Androida: Ten artykuł jest dumnie sponsorowany przez PCBWAY.PCBWAY tworzy wysokiej jakości prototypowe płytki PCB dla ludzi na całym świecie. Wypróbuj to dla siebie i zdobądź 10 płytek PCB za jedyne 5 USD w PCBWAY o bardzo dobrej jakości, dzięki PCBWAY. Płyta ESP Matrix Board, którą opracowałem
Mini Drawing Bot - aplikacja na Androida na żywo - Trignomentry: 18 kroków (ze zdjęciami)
Mini Drawing Bot - Live Android App - Trignomentry: Dzięki Bogu i wam wszystkim za to, że mój projekt Baby-MIT-Cheetah-Robot zdobył pierwszą nagrodę w konkursie Make it Move. Jestem bardzo zadowolona, ponieważ wielu znajomych zadaje dużo pytań w rozmowie i w wiadomościach. Jednym z ważnych pytań było to, w jaki sposób
Zdalny dostęp do Raspberry Pi: SSH, Dekstop i FTP: 4 kroki
Zdalny dostęp do Raspberry Pi: SSH, Dekstop i FTP: W tym poście przyjrzymy się 3 różnym metodom zdalnego dostępu do Raspberry Pi, aby nieco ułatwić pracę z nim. Pierwszą z nich jest SSH, która pozwoli ci na zdalny dostęp do terminala. Drugi to remo
Arduino 4 Wheel Drive Bluetooth RC Car za pomocą UNO R3, HC-05 i L293D Motorshield z kodowaniem i aplikacją na Androida: 8 kroków
Arduino 4 Wheel Drive Bluetooth RC Car wykorzystujący UNO R3, HC-05 i L293D Motorshield z kodowaniem i aplikacją na Androida: Dzisiaj opowiem wam o tym, jak zrobić arduino z napędem na 4 koła bluetooth RC z osłoną silnika HC 05, L293, Silnik 4 DC, z kodowaniem i aplikacją na Androida do sterowania samochodem.Użyty komponent:-1-Arduino UNO R32-Bluetooth HC-053-Motorshield L293
Zdalny dostęp SSH do Raspberry Pi 2: 5 kroków
Zdalny dostęp SSH do Raspberry Pi 2: Kiedykolwiek chciałeś wdrożyć Raspberry Pi „w terenie” i nadal mieć do niego dostęp? Oto prosty sposób na umożliwienie zdalnego dostępu SSH do Raspberry Pi 2 (i innych modeli). Chociaż istnieją rozwiązania obejmujące VPN lub konfigurujące por