Inhaltsverzeichnis:

Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router - Gunook
Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router - Gunook

Video: Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router - Gunook

Video: Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router - Gunook
Video: FritzBox Smartphone VPN Tunnel - Anleitung zum Erfolg! Mit einfachen Erklärungen iPhone + Android 2024, November
Anonim
Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router
Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router
Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router
Android/iOS-App für den Fernzugriff auf Ihren OpenWrt-Router

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 gehe davon aus, dass Sie bereits OpenWrt haben…
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

Software und Tools
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

WiFi-Steuerung: EIN/AUS
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

Systemstatistik-Diagramm
Systemstatistik-Diagramm
Systemstatistik-Diagramm
Systemstatistik-Diagramm

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

Netzwerkaktivitätsdiagramm
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

Benachrichtigungen
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

Fazit & weitere Ideen
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: