Inhaltsverzeichnis:
- Schritt 1: Ich gehe davon aus, dass Sie bereits OpenWrt haben…
- Schritt 2: Software und Tools
- Schritt 3: Erstellen einer minimalen App
- Schritt 4: Hinzufügen einiger Informationen: Anzahl der Clients, WAN-IP-Adresse, Betriebszeit
- Schritt 5: WiFi-Steuerung: EIN/AUS
- Schritt 6: Systemstatistikdiagramm
- Schritt 7: HDD-Spin-Status
- Schritt 8: Netzwerkaktivitätsdiagramm
- Schritt 9: Benachrichtigungen
- Schritt 10: Autorun im Hintergrund
- Schritt 11: Fazit & weitere Ideen
Video: Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router - Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-30 07:19
Ich habe mir vor kurzem einen neuen Router (Xiaomi Mi Router 3G) gekauft. Und natürlich hat mich diese neue, tolle Hardware dazu inspiriert, an diesem Projekt zu arbeiten;)
Schritt 1: Ich gehe davon aus, dass Sie bereits OpenWrt haben…
Ich musste zuerst OpenWrt installieren… Meistens folgte ich dieser Anleitung (spezifisch für dieses Router-Modell): https://dzone.com/articles/hacking-into-xiaomi-mi-…Während der Arbeit daran fand ich dieses tolle Video: Openwrt-Installation, WiFi-Benchmark, Girlfriend Flashing. Wow ich habe so gelacht!:)
Beachtung! Die Installation von OpenWrt kann Ihren Router blockieren. Aber sobald es fertig ist, entsperrt es die volle Leistung und Kontrolle. Ich bin nicht mutig genug, hier Anweisungen zu geben, da diese für jedes Router-Modell unterschiedlich sein können.
Wenn Sie jedoch bereits OpenWrt auf Ihrem Router haben, können Sie im Handumdrehen mit diesem Tutorial beginnen
Übrigens, einige Entwicklungsboards werden standardmäßig mit OpenWrt geliefert, wie Onion Omega, VoCore, LinkIt Smart 7688 und andere. In diesem Tutorial werden auch einige grundlegende Ideen zum Erstellen solcher Apps erklärt, sodass Sie es leicht an die Arbeit mit Raspberry Pi und dergleichen anpassen können.
Für dieses Projekt verwende ich hauptsächlich vorinstallierte Software (verfügbar auf jedem OpenWrt-fähigen Router). Aber für einige erweiterte Funktionen musste ich zusätzliche Pakete installieren. Dies ist mit nur wenigen Klicks erledigt, daher werde ich die Anweisungen hier einfügen.
Außerdem gehe ich davon aus, dass Sie bereits wissen:
- So öffnen/verwenden Sie ein SSH-Terminal für Ihren OpenWrt-Router
- So laden/bearbeiten Sie Dateien auf Ihrem Router (verwenden Sie FileZilla oder scp/sftp)
- So arbeiten Sie mit der Linux-Konsole
Schritt 2: Software und Tools
Auf der Smartphone-Seite verwende ich Blynk. Es bietet iOS- und Android-Apps zur Steuerung jeder Hardware. Sie können ganz einfach schöne grafische Oberflächen für alle Ihre Projekte erstellen, indem Sie Widgets einfach per Drag & Drop direkt auf Ihr Smartphone ziehen. Blynk wird hauptsächlich mit Arduino, Raspberry Pi usw. verwendet. Aber warum nicht auf dem Router selbst ausführen?;)
Auf der Geräteseite werde ich Lua verwenden, um die erforderliche Funktionalität zu skripten. Ich könnte auch Python oder Node.js verwenden, aber leider sind diese Optionen aufgrund fehlender Ressourcen auf einigen Routern nicht immer verfügbar. Oder C/C++, aber es ist nicht so bequem zu arbeiten (bei jeder Änderung neu kompilieren usw.) Andererseits ist Lua vorinstalliert, einfach zu bedienen und zu erlernen. Es wird von der Standard-Webschnittstelle LuCI verwendet.
Schritt 3: Erstellen einer minimalen App
Der Einstieg in Blynk und Lua ist so einfach wie:
- Laden Sie die Blynk-App herunter (aus dem App Store, Google Play)
- Erstellen Sie ein neues Projekt und erhalten Sie das Auth Token
- Befolgen Sie die Installationsanweisungen von Blynk Lua für OpenWrt.
Verwenden Sie SSH, um auf Ihre Router-Konsole zuzugreifen. Nachdem Sie das Standardbeispiel ausgeführt haben:
lua./examples/client.lua
Wir sollten so etwas sehen:
Anschließen…
SSL-Handshake… Fertig.
Damit ist die sichere bidirektionale Verbindung zur App hergestellt!YAY!
Wir können das bereitgestellte Beispiel jetzt leicht erweitern, sodass es etwas Interessantes tut. Ich habe eine Kopie dieses Beispiels erstellt, um es zu bearbeiten:
cp./examples/client.lua./blynkmon.lua
Schritt 4: Hinzufügen einiger Informationen: Anzahl der Clients, WAN-IP-Adresse, Betriebszeit
Die Grundidee besteht darin, die Informationen regelmäßig vom Betriebssystem abzurufen, bei Bedarf einige einfache Berechnungen durchzuführen und das Ergebnis dann zur Anzeige an Blynk zu senden.
In Linux/OpenWrt haben wir mehrere Möglichkeiten, die Systemdaten abzurufen:
- Führen Sie einen Befehl aus und analysieren Sie den ausgegebenen Text
- Führen Sie einen Befehl aus und sehen Sie sich den Rückgabecode an, der zurückgegeben wird
- Lesen Sie eine Systemdatei, die sich in den Verzeichnissen /proc/ und /sys/class/ befindet
Nun möchte ich mir die Anzahl der angeschlossenen Geräte anzeigen lassen.
Wenn ich cat /proc/net/arp auf der Konsole ausführe, wird die Liste der bekannten Geräte zusammen mit ihren MAC- und IP-Adressen ausgegeben:
IP-Adresse HW-Typ Flags HW-Adresse Maske Gerät
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
Wir können es direkt in Lua analysieren, aber es ist oft einfacher, spezielle Dienstprogramme zu verwenden. Unter Linux sind dies grep, head, tail, cut, wc, awk.
Um die Anzahl der Clients aus der arp-Ausgabe zu erhalten, muss ich die Tabelle filtern (nicht verwandte Elemente entfernen) und die Tabellenzeilen zählen, was zu folgendem Befehl führt:
Katze /proc/net/arp | grep br-lan | grep 0x2 | wc -l
Lass es uns versuchen:
root@router:~/lua-blynk# cat /proc/net/arp | grep br-lan | grep 0x2 | wc -l
1
Groß. Wir haben jetzt die Idee, wie wir alle erforderlichen Informationen sammeln können. Lassen Sie es uns automatisieren. Um unseren Code sauber und erweiterbar zu machen, erstellen wir einige Hilfsfunktionen:
Funktion exec_out(cmd)
local file = io.popen(cmd) wenn nicht Datei, dann Rückgabe nil end local output = file:read('*all') file:close() print("Run: "..cmd.." -> ".. Ausgabe) Ausgabe zurückgeben Endfunktion read_file(path) local file = io.open(path, "rb") wenn nicht file, dann nil zurückgeben end local content = file:read "*a" file:close() print("Read: ".. Pfad.." -> ".. Inhalt) Inhalt zurückgeben Ende
Mit diesen Dienstprogrammen können wir nun die eigentlichen Datenabruffunktionen implementieren:
Funktion 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
Sie können Teile dieser Shell-Befehle ausführen, um ein tieferes Verständnis ihrer Funktionsweise zu erlangen und sie an Ihre Bedürfnisse anzupassen.
Der einfachste Teil ist das Senden der Daten an die Blynk App. Das Standardbeispiel richtet bereits den Timer ein, der alle 5 Sekunden einen Code ausführt, also verwenden wir ihn einfach wieder:
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 der App fügen wir 3 Label-Widgets hinzu und weisen sie den Virtual Pins 10, 11, 12 entsprechend zu.
Dies funktioniert zwar, ist aber eher ineffizient, da die WAN-IP oder die Anzahl der Clients nicht so häufig aktualisiert werden. Lassen Sie uns dies beheben
Für WAN-IP verschieben wir es in den verbundenen Handler. Es wird jedes Mal ausgeführt, wenn der Router eine Verbindung zur Blynk Cloud herstellt. Dies sollte ausreichen:
blynk:on("verbunden", function()
print("Bereit.") blynk:virtualWrite(12, getWanIP()) end)
Für Uptime und Clients Number erstellen wir einen separaten Timer mit 5 min. Intervall:
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}
Schritt 5: WiFi-Steuerung: EIN/AUS
Bisher haben wir nur einige Informationen vom Gerät erhalten. Versuchen wir es zu kontrollieren!
blynk:on("V20", Funktion(Parameter)
if param[1] == "1" then os.execute("wifi up") else os.execute("wifi down") end end)
Auf der App-Seite habe ich gerade ein Button-Widget (Modus: Switch) hinzugefügt und es V20 zugewiesen.
Das ist es. Tolle.
Schritt 6: Systemstatistikdiagramm
Funktion 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 ' {Drucken ($3-$7)/$2 * 100,0}'")) Ende
Wir müssen die Daten auch an Blynk senden (verwenden wir wieder tmr1):
local tmr1 = Timer:new{interval = 5000, func = function()
blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) end}
Fügen Sie auf der App-Seite das SuperChart-Widget hinzu. Fügen Sie CPU-, RAM-Datenströme hinzu und weisen Sie V5, V6 zu.
Schritt 7: HDD-Spin-Status
Mein Router hat ein externes HDD-Laufwerk, das als Network Attached Storage-Gerät angeschlossen ist. Die Sache ist, dass dieses Laufwerk so konfiguriert ist, dass es sich dreht, wenn jemand darauf zugreift, und nach einem Timeout anhält.
Natürlich wäre es cool zu wissen, wie oft es sich am Tag einschaltet. Also habe ich meinem Systemdiagramm einen weiteren Datenstrom hinzugefügt.
Es ist etwas kniffliger, den Status des Festplattenlaufwerks abzurufen, aber ich habe einen Weg gefunden! Installieren Sie zunächst smartmontools über die SSH-Konsole:
opkg-Update
opkg installieren smartmontools
Dann müssen wir in unserem Code einen speziellen Befehl ausführen und den Exit-Code überprüfen:
Funktion 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 then return 1 else return 0 end end
Hinweis: meine Festplatte ist /dev/sda
Schritt 8: Netzwerkaktivitätsdiagramm
Wir erstellen ein weiteres SuperChart-Widget (ähnlich dem vorherigen), fügen TX- und RX-Datenströme hinzu und weisen V1 und V2 zu. Hinweis: Ich möchte die WAN-Port-Statistik anzeigen und mein WAN-Port ist eth0.2
Hilfsfunktionen:
Funktion 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")) Ende
Als nächstes fügen Sie etwas Code zu derselben tmr1. Dies ist komplizierter, da wir nur die Differenz in gesendeten/empfangenen Bytes berechnen und anzeigen müssen:
lokal prevTx, prevRx
local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() if prevTx und 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(Spinning:virtualWrite())) Ende}
Schritt 9: Benachrichtigungen
Ich wollte auch benachrichtigt werden, wenn mein Router den Strom oder die Internetverbindung verliert. Dazu benötigen wir das Benachrichtigungs-Widget.
Aktivieren Sie in den Widget-Einstellungen "Offline-Benachrichtigung". Kein Code erforderlich. Wir können aber auch benutzerdefinierte Benachrichtigungen über unseren Code senden.
Schritt 10: Autorun im Hintergrund
Im Moment muss das Skript manuell ausgeführt werden, aber ich möchte es automatisch im Hintergrund ausführen lassen, wenn der Router eingeschaltet wird.
Dies geschieht durch Erstellen eines Dienstes. Erstellen Sie eine Datei /etc/init.d/blynkmon:
#!/bin/sh /etc/rc.common
START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $pidfile]; dann echo "blynkmon läuft bereits" exit 0 fi cd /root/lua-blynk lua blynkmon.lua dein-auth-token > /dev/null & echo $! > $pidfile } stop() { if [! -f $piddatei]; dann echo "blynkmon läuft nicht" exit 0 fi kill -9 $(cat $pidfile) rm $pidfile }
Hinweis: Vergessen Sie nicht, Ihren Auth-Token zu ersetzen
Aktivieren Sie dann den blynkmon-Dienst:
service blynkmon aktivieren
Schritt 11: Fazit & weitere Ideen
Sie können diesen QR scannen, um den Klon meines Blynk-Projekts zu erhalten. Es erfordert einige Energiepunkte (4600), da es viele Widgets verwendet!
Den vollständigen Lua-Code finden Sie hier:
Soweit so gut, aber hier sind einige Ideen, die ich in naher Zukunft hinzufügen möchte.
- Befehl Neustart hinzufügen. Verhindern Sie, dass Sie versehentlich darauf klicken.
- Fügen Sie das Terminal-Widget hinzu, um einen beliebigen Linux-Befehl auszuführen.
-
CPU-Temperaturdiagramm hinzufügen.
UPD: Leider fehlen OpenWrt derzeit einige Treiber für mein Router-Modell. Aber es ist für viele andere Router verfügbar
- Fügen Sie eine Benachrichtigung hinzu, wenn ein bestimmtes Gerät dem Netzwerk beitritt oder es verlässt. Wir haben bereits Arp-Informationen, überprüfen Sie jetzt nur die MAC-Adresse.
Auf diese Weise können wir 3D-Drucker, Roboter, einen normalen PC/Laptop, Arduino/ESP8266/ESP32/RaspberryPi-Sachen, Smart Home-Geräte und praktisch alles andere überwachen und steuern. Lassen Sie es mich wissen, wenn Sie weitere interessante Ideen haben. Was halten Sie von all dem?
Empfohlen:
So nehmen Sie Ihren benutzerdefinierten Klingelton auf und laden ihn herunter – wikiHow
So nehmen Sie Ihren benutzerdefinierten Klingelton auf und laden ihn herunter: Also? Sie möchten Ihren eigenen benutzerdefinierten Klingelton erhalten, oder? Nun, Sie sind auf die richtige Instructables-Seite gekommen. Bevor wir beginnen, muss ich Sie daran erinnern, dass dies für IOS-Geräte (Apple-Geräte wie ein Ipad, Ipod, Iphone usw.) und Mac-Computer (funktioniert auf jedem Mac, sogar
Kostenlose Videos für iTunes (und Ihren iPod): 5 Schritte
Kostenlose Videos für ITunes (und Ihren iPod): Eine einfache Möglichkeit, kostenlose Videos zu erhalten und sie Ihrer iTines-Bibliothek hinzuzufügen. Danach können Sie sie zu Ihrem iPod hinzufügen (wenn er Video unterstützt) * My 1st Instructable
So extrahieren Sie Wii-Spiele mit einem USB-Stick auf Ihren Computer: 3 Schritte
So extrahieren Sie Wii-Spiele mit einem USB-Stick auf Ihren Computer benötigen mehrere Dinge, um dies zu ermöglichen: Hardware-Anforderungen: Wii mit Firmware 3.4 und
Eine Apfelgirlande für den Herbst oder den Schulanfang herstellen – wikiHow
Wie man eine Apfelgirlande für den Herbst oder den Schulanfang herstellt: Anjeanette von RootsAndWingsCo hat diese entzückende Apfelgirlande aus Filz und Material hergestellt. Es war ein einfaches Projekt, das selbst diejenigen, die sagen, dass sie nicht nähen können, tun können! (Solange Sie Ihre Nadel einfädeln können.)
Mehr Leistung für Ihren PC. (Zweites Netzteil Netzteil): 3 Schritte
Mehr Leistung für Ihren PC. (Zweites Netzteil Netzteil): Diese Anleitung zeigt Ihnen, wie Sie Ihnen ein wenig Spielraum geben können, wenn Ihre Grafikkarte (oder wenn Sie nur eine 12-V-Schiene haben, die sowohl der CPU als auch der Grafikkarte mehr Strom geben kann). Kurz bevor wir beginnen, ist dies nicht die Einrichtung von Master und Slave