Sommario:
- Passaggio 1: presumo che tu abbia già OpenWrt …
- Passaggio 2: software e strumenti
- Passaggio 3: creazione di un'app minima
- Passaggio 4: aggiunta di alcune informazioni: numero di client, indirizzo IP WAN, tempo di attività
- Passaggio 5: Controllo WiFi: ON/OFF
- Passaggio 6: grafico delle statistiche di sistema
- Passaggio 7: stato di rotazione dell'HDD
- Passaggio 8: grafico dell'attività di rete
- Passaggio 9: notifiche
- Passaggio 10: esecuzione automatica in background
- Passaggio 11: conclusione e ulteriori idee
Video: App Android/iOS per accedere al tuo router OpenWrt da remoto: 11 passaggi
2024 Autore: John Day | [email protected]. Ultima modifica: 2024-01-30 10:02
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 …
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
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
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
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
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
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
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:
Steam Punk Il tuo UPS per ottenere ore di attività per il tuo router Wi-Fi: 4 passaggi (con immagini)
Steam Punk Il tuo UPS per ottenere ore di attività per il tuo router Wi-Fi: C'è qualcosa di fondamentalmente sgradevole nel fatto che il tuo UPS converta la sua alimentazione a batteria da 12 V CC in alimentazione a 220 V CA in modo che i trasformatori che eseguono il router e la fibra ONT possano riconvertirlo in 12V CC! Sei anche contro il [tipicamente
Come accedere a un disco rigido Dell Inspiron 15 serie 3000: 10 passaggi
Come accedere a un disco rigido Dell Inspiron 15 serie 3000: Ciao lettori di Instructables, oggi ti mostrerò come accedere a un disco rigido in un laptop Dell Inspiron 15 serie 3000. Molto probabilmente, se stai leggendo questo articolo, hai problemi a risolvere il problema del computer e stai cercando di reinstallare il disco rigido o
Come accedere alla tua musica senza iTunes!!: 6 passaggi
Come accedere alla tua musica senza iTunes!!: Questo Instructable ti mostrerà come accedere alla musica sul tuo iPod touch, iPhone o iPad senza iTunes Per favore iscriviti al mio canale Grazie
Hack per visualizzare tutti i passaggi di un Instructable senza accedere
Hack per visualizzare tutti i passaggi di un Instructable senza accedere!: Ecco un piccolo trucco che ti farà risparmiare inutili minuti di accesso. In pratica ti consente di "Visualizzare tutti i passaggi su una pagina" di qualsiasi Instructable senza accedere e SENZA usare qualsiasi software di "hacking"! Per favore, non che questo sia solo un piccolo trucco
Come accedere alla tua musica da qualsiasi luogo con il tuo Mac Mini: 5 passaggi
Come accedere alla tua musica da qualsiasi luogo con il tuo Mac Mini: questa istruzione trasforma il tuo computer in un server di condivisione privato. Ospiterà la tua musica in modo che solo tu possa accedervi. Ma, supponendo che la tua connessione Internet sia abbastanza veloce, sarai in grado di accedervi da tutto il mondo. Quanto è figo