Sommario:

App Android/iOS per accedere al tuo router OpenWrt da remoto: 11 passaggi
App Android/iOS per accedere al tuo router OpenWrt da remoto: 11 passaggi

Video: App Android/iOS per accedere al tuo router OpenWrt da remoto: 11 passaggi

Video: App Android/iOS per accedere al tuo router OpenWrt da remoto: 11 passaggi
Video: Installare ADBlock su GL-MT300N (openwrt) 2024, Dicembre
Anonim
App Android/iOS per accedere da remoto al tuo router OpenWrt
App Android/iOS per accedere da remoto al tuo router OpenWrt
App Android/iOS per accedere da remoto al tuo router OpenWrt
App Android/iOS per accedere da remoto al tuo router OpenWrt

Di recente ho acquistato un nuovo router (Xiaomi Mi Router 3G). E, naturalmente, questo nuovo, fantastico pezzo di hardware mi ha ispirato a iniziare a lavorare su questo progetto;)

Passaggio 1: presumo che tu abbia già OpenWrt …

Presumo che tu abbia già OpenWrt …
Presumo che tu abbia già OpenWrt …

Ho dovuto installare prima OpenWrt… Principalmente, ho seguito questa guida (specifica per questo modello di router): https://dzone.com/articles/hacking-into-xiaomi-mi-… Mentre lavoravo su questo, ho trovato questo fantastico video: installazione Openwrt, benchmark WiFi, Girlfriend Flashing. Wow, ho riso così tanto!:)

Attenzione! L'installazione di OpenWrt può danneggiare il tuo router. Ma una volta completato, sblocca piena potenza e controllo. Non sono abbastanza coraggioso da fornire istruzioni qui, in quanto potrebbero essere diverse per ogni modello di router.

Ma se hai già OpenWrt sul tuo router, potrai iniziare con questo tutorial in pochissimo tempo

A proposito, alcune schede di sviluppo sono dotate di OpenWrt out-of-the-box, come Onion Omega, VoCore, LinkIt Smart 7688 e altre. Questo tutorial spiega anche alcune idee di base alla base della creazione di tali app, in modo che tu possa facilmente adattarlo per funzionare con Raspberry Pi e simili.

Per questo progetto, utilizzerò principalmente software preinstallato (disponibile su qualsiasi router abilitato per OpenWrt). Ma per alcune funzionalità avanzate, ho dovuto installare pacchetti aggiuntivi. Questo viene fatto in pochi clic, quindi includerò le istruzioni qui.

Inoltre, presumo che tu sappia già:

  • Come aprire/utilizzare il terminale SSH sul router OpenWrt
  • Come caricare/modificare file sul router (usa FileZilla o scp/sftp)
  • Come lavorare con la console Linux

Passaggio 2: software e strumenti

Software e strumenti
Software e strumenti

Sul lato smartphone, sto usando Blynk. Fornisce app iOS e Android per controllare qualsiasi hardware. Puoi facilmente creare bellissime interfacce grafiche per tutti i tuoi progetti semplicemente trascinando e rilasciando i widget, direttamente sul tuo smartphone. Blynk viene utilizzato principalmente con Arduino, Raspberry Pi, ecc. Ma perché non eseguirlo sul router stesso?;)

Sul lato del dispositivo utilizzerò Lua per eseguire lo script della funzionalità necessaria. Potrei anche usare Python o Node.js, ma sfortunatamente queste opzioni non sono sempre disponibili, a causa della mancanza di risorse su alcuni router. Oppure C/C++, ma non è così comodo lavorarci (ricompilare per ogni modifica, ecc.) D'altra parte, Lua è preinstallato, è semplice da usare e da imparare. Viene utilizzato dall'interfaccia web predefinita, LuCI.

Passaggio 3: creazione di un'app minima

Iniziare con Blynk e Lua è facile come:

  • Scarica l'app Blynk (da App Store, Google Play)
  • Crea un nuovo progetto e ottieni il token di autenticazione
  • Segui le istruzioni di installazione di Blynk Lua per OpenWrt.

Usa SSH per accedere alla console del tuo router. Dopo aver eseguito l'esempio predefinito:

lua./examples/client.lua

Dovremmo vedere qualcosa del genere:

Connessione in corso…

Stretta di mano SSL… Pronto.

Ciò significa che la connessione sicura e bidirezionale all'app è stata stabilita! YAY!

Ora possiamo estendere facilmente l'esempio fornito, in modo che faccia qualcosa di interessante. Ho creato una copia di questo esempio per modificarlo:

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

Passaggio 4: aggiunta di alcune informazioni: numero di client, indirizzo IP WAN, tempo di attività

L'idea di base è ottenere periodicamente le informazioni dal sistema operativo, eseguire alcuni semplici calcoli se necessario e quindi inviare il risultato a Blynk per la visualizzazione.

In Linux/OpenWrt, abbiamo diversi modi per ottenere i dati di sistema:

  • Esegui un comando e analizza il testo che emette
  • Esegui un comando e guarda il codice di uscita che restituisce
  • Leggere un file di sistema, situato nelle directory /proc/ e /sys/class/

Ora voglio visualizzare il numero di dispositivi collegati.

Quando eseguo cat /proc/net/arp sulla console, viene visualizzato l'elenco dei dispositivi noti, insieme ai loro indirizzi MAC e IP:

Indirizzo IP Tipo HW Flag Indirizzo HW Maschera Dispositivo

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

Possiamo analizzarlo direttamente in Lua, ma spesso è più facile usare utility specializzate. Su Linux, queste sono grep, head, tail, cut, wc, awk.

Per ottenere il numero di client dall'output arp, devo filtrare la tabella (rimuovere gli elementi non correlati) e contare le righe della tabella, il che risulta nel seguente comando:

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

Proviamolo:

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

1

Grande. Ora abbiamo un'idea di come possiamo raccogliere tutte le informazioni richieste. Automatizziamolo. Per rendere il nostro codice pulito ed estensibile, creiamo alcune funzioni di supporto:

funzione exec_out(cmd)

local file = io.popen(cmd) se non file allora restituisce nil end output locale = file:read('*all') file:close() print("Run: "..cmd.." -> ".. output) return output end function read_file(percorso) file locale = io.open(percorso, "rb") se non file allora restituisce nil end local content = file:leggi "*a" file:close() print("Leggi: "..percorso.." -> "..contenuto) restituisce fine contenuto

Usando queste utilità, ora possiamo implementare le effettive funzioni di recupero dei dati:

funzione 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

Puoi eseguire parti di questi comandi della shell, per ottenere una comprensione più approfondita di come funziona e per adattarlo alle tue esigenze.

La parte più semplice è inviare i dati all'app Blynk. L'esempio predefinito imposta già il timer, che esegue del codice ogni 5 secondi, quindi lo riutilizziamo:

local tmr1 = Timer:new{intervallo = 5000, func = funzione()

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

Nell'app, aggiungiamo 3 widget di etichette e li assegniamo ai Pin virtuali 10, 11, 12 di conseguenza.

Sebbene funzioni, è piuttosto inefficiente, poiché l'IP WAN o il numero di client non si aggiornano così frequentemente. Risolviamo questo problema

Per IP WAN, lo spostiamo sul gestore connesso. Verrà eseguito ogni volta che il router stabilisce la connessione a Blynk Cloud. Questo dovrebbe essere sufficiente:

blynk:on("connesso", funzione()

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

Per Uptime e Client Number, creiamo un timer separato con 5 min. intervallo:

local tmr2 = Timer:new{intervallo = 5*60*1000, func = funzione()

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

Passaggio 5: Controllo WiFi: ON/OFF

Controllo Wi-Fi: ON/OFF
Controllo Wi-Fi: ON/OFF

Finora ricevevamo solo alcune informazioni dal dispositivo. Proviamo a controllarlo!

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

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

Sul lato app, ho appena aggiunto un widget Pulsante (modalità: Switch) e l'ho assegnato a V20.

Questo è tutto. Sorprendente.

Passaggio 6: grafico delle statistiche di sistema

Grafico delle statistiche di sistema
Grafico delle statistiche di sistema
Grafico delle statistiche di sistema
Grafico delle statistiche di sistema

funzione 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 ' {stampa ($3-$7)/$2 * 100.0}'")) fine

Dobbiamo anche inviare i dati a Blynk (usiamo di nuovo tmr1):

local tmr1 = Timer:new{intervallo = 5000, func = funzione()

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

Sul lato app, aggiungi il widget SuperChart. Aggiungi CPU, flussi di dati RAM e assegna a V5, V6.

Passaggio 7: stato di rotazione dell'HDD

Il mio router ha un'unità HDD esterna collegata come dispositivo di archiviazione collegato alla rete. Il fatto è che questa unità è configurata per iniziare a girare quando qualcuno vi accede e per sospendere dopo un timeout.

Ovviamente sarebbe bello sapere quante volte si accende durante la giornata. Quindi ho aggiunto un altro flusso di dati al mio grafico di sistema.

È un po' più complicato ottenere lo stato dell'unità HDD, ma ho trovato un modo! Prima di tutto, installa smartmontools dalla console SSH:

aggiornamento opkg

opkg installa smartmontools

Quindi, nel nostro codice, dobbiamo eseguire un comando speciale e controllare il codice di uscita:

funzione exec_ret(cmd)

local exit = os.execute(cmd) print("Esegui: "..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

Nota: il mio HDD è /dev/sda

Passaggio 8: grafico dell'attività di rete

Grafico dell'attività di rete
Grafico dell'attività di rete

Creiamo un altro widget SuperChart (simile al precedente), aggiungiamo flussi di dati TX e RX e assegniamo a V1 e V2. Nota: voglio visualizzare lo stato della porta WAN e la mia porta WAN è eth0.2

Funzioni di supporto:

funzione 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")) fine

Quindi, aggiungi del codice allo stesso tmr1. Questo è più complicato, poiché dobbiamo solo calcolare e visualizzare la differenza nei byte trasmessi/ricevuti:

locale prevTx, prevRx

local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() if prevTx e prevTx ~= tx then blynk:virtualWrite(1, tx - prevTx) end if prevRx e prevRx ~= rx then blynk:virtualWrite(2, rx - prevRx) end prevTx = tx prevRx = rx blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) blynk:virtualWrite(7, getCpuLoad()))) fine}

Passaggio 9: notifiche

Notifiche
Notifiche

Volevo anche essere avvisato quando il mio router perde l'alimentazione o la connessione a Internet. Per questo, abbiamo bisogno del widget di notifica.

Nelle impostazioni del widget, abilita "notifica offline". Nessun codice necessario. Ma possiamo anche inviare notifiche personalizzate dal nostro codice.

Passaggio 10: esecuzione automatica in background

Per ora lo script deve essere eseguito manualmente, ma voglio farlo eseguire automaticamente in background all'accensione del router.

Questo viene fatto creando un servizio. Crea un file /etc/init.d/blynkmon:

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

START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $pidfile]; then echo "blynkmon già in esecuzione" exit 0 fi cd /root/lua-blynk lua blynkmon.lua tuo-auth-token > /dev/null & echo $! > $pidfile } stop() { if [! -f $filepid]; then echo "blynkmon non in esecuzione" exit 0 fi kill -9 $(cat $pidfile) rm $pidfile }

Nota: non dimenticare di sostituire il token di autenticazione

Quindi, abilita il servizio blynkmon:

servizio blynkmon abilita

Passaggio 11: conclusione e ulteriori idee

Conclusione e ulteriori idee
Conclusione e ulteriori idee

Puoi scansionare questo QR per ottenere il clone del mio progetto Blynk. Richiede alcuni punti energia (4600), poiché utilizza molti widget!

Trova il codice Lua completo qui:

Fin qui tutto bene, ma ecco alcune idee che vorrei aggiungere nel prossimo futuro.

  • Aggiungi il comando di riavvio. Evita di fare clic su di esso accidentalmente.
  • Aggiungi il widget Terminale per eseguire qualsiasi comando Linux.
  • Aggiungi il grafico della temperatura della CPU.

    UPD: Sfortunatamente OpenWrt al momento non ha alcuni driver per il mio modello di router. Ma è disponibile per molti altri router

  • Aggiungi una notifica quando un particolare dispositivo si unisce/esce dalla rete. Abbiamo già informazioni arp, ora controlla solo l'indirizzo MAC.

In questo modo, possiamo monitorare e controllare stampanti 3D, robot, un normale PC/laptop, Arduino/ESP8266/ESP32/RaspberryPi, dispositivi Smart Home e praticamente qualsiasi cosa intorno. Fatemi sapere se avete altre idee interessanti. Cosa ne pensate di tutto questo?

Consigliato: