Taula de continguts:

Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota: 11 passos
Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota: 11 passos

Vídeo: Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota: 11 passos

Vídeo: Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota: 11 passos
Vídeo: Домашний VPN с Wireguard на OpenWrt и iphone, подключающийся к VPN 2024, Desembre
Anonim
Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota
Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota
Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota
Aplicació Android / iOS per accedir al vostre router OpenWrt de forma remota

Recentment he comprat un enrutador nou (Xiaomi Mi Router 3G). I, per descomptat, aquest nou i impressionant maquinari em va inspirar a començar a treballar en aquest projecte;)

Pas 1: Suposo que ja teniu OpenWrt …

Suposo que ja teniu OpenWrt …
Suposo que ja teniu OpenWrt …

Vaig haver d’instal·lar OpenWrt primer … Sobretot, vaig seguir aquesta guia (específica per a aquest model d’encaminador): https://dzone.com/articles/hacking-into-xiaomi-mi- … Mentre treballava en això, vaig trobar aquest vídeo increïble: Instal·lació Openwrt, referència WiFi, Girlfriend Flashing. Wow vaig riure tant!:)

Atenció! La instal·lació d’OpenWrt pot bloquejar el vostre enrutador. Però un cop acabat, desbloqueja la potència i el control. No sóc prou valent per proporcionar cap instrucció aquí, ja que poden ser diferents per a cada model d’encaminador.

Però si ja teniu OpenWrt al vostre encaminador, podreu començar amb aquest tutorial en notime

Per cert, algunes plaques de desenvolupament inclouen OpenWrt, com Onion Omega, VoCore, LinkIt Smart 7688 i altres. Aquest tutorial també explica algunes idees bàsiques darrere de la creació d’aquestes aplicacions, de manera que podeu adaptar-les fàcilment per treballar amb Raspberry Pi i similars.

Per a aquest projecte, utilitzaré principalment programari preinstal·lat (disponible en qualsevol enrutador habilitat per a OpenWrt). Però per a algunes funcions avançades, vaig haver d’instal·lar paquets addicionals. Això es fa amb pocs clics, de manera que inclouré les instruccions aquí.

A més, suposo que ja sabeu:

  • Com obrir / utilitzar el terminal SSH al vostre encaminador OpenWrt
  • Com penjar / editar fitxers al router (utilitzeu FileZilla o scp / sftp)
  • Com treballar amb la consola Linux

Pas 2: programari i eines

Programari i eines
Programari i eines

Pel que fa als telèfons intel·ligents, faig servir Blynk. Proporciona aplicacions per a iOS i Android per controlar qualsevol maquinari. Podeu crear fàcilment belles interfícies gràfiques per a tots els vostres projectes simplement arrossegant i deixant anar ginys directament al vostre telèfon intel·ligent. Blynk s'utilitza principalment amb Arduino, Raspberry Pi, etc. Però, per què no s'executa al mateix router?;)

Pel que fa al dispositiu, faré servir Lua per escriure la funcionalitat necessària. També podria utilitzar Python o Node.js, però, malauradament, aquestes opcions no sempre estan disponibles a causa de la manca de recursos en alguns enrutadors. O C / C ++, però no és tan convenient treballar amb (recompilació per a cada canvi, etc.) D'altra banda, Lua està preinstal·lat, és senzill d'utilitzar i d'aprendre. L’utilitza la interfície web per defecte, LuCI.

Pas 3: crear una aplicació mínima

Començar amb Blynk i Lua és tan fàcil com:

  • Baixeu-vos l'aplicació Blynk (des de l'App Store, Google Play)
  • Creeu un projecte nou i obteniu el testimoni d'autenticació
  • Seguiu les instruccions d'instal·lació de Blynk Lua per a OpenWrt.

Utilitzeu SSH per accedir a la consola del router. Després d'executar l'exemple per defecte:

lua./examples/client.lua

Hauríem de veure alguna cosa així:

Connectant…

Apretament de mans SSL … A punt.

Això significa que s'estableix la connexió bidireccional i segura a l'aplicació.

Ara podem ampliar fàcilment l’exemple proporcionat, de manera que fa alguna cosa interessant. He creat una còpia d'aquest exemple per editar-lo:

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

Pas 4: afegir informació: nombre de clients, adreça IP WAN, temps d’activitat

La idea bàsica és obtenir la informació del sistema operatiu periòdicament, realitzar alguns càlculs simples si cal, i després enviar el resultat a Blynk perquè es mostri.

A Linux / OpenWrt, tenim diverses maneres d’obtenir les dades del sistema:

  • Executeu una ordre i analitzeu el text que emet
  • Executeu una ordre i observeu el codi de sortida que retorna
  • Llegiu un fitxer del sistema situat als directoris / proc / i / sys / class /

Ara vull mostrar el nombre de dispositius connectats.

Quan executo cat / proc / net / arp a la consola, emet la llista de dispositius coneguts, juntament amb les seves adreces MAC i IP:

Adreça IP Tipus HW Banderes Adreça HW Dispositiu de màscara

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

El podem analitzar directament a Lua, però sovint és més fàcil utilitzar utilitats especialitzades. A Linux, es tracta de grep, head, tail, cut, wc, awk.

Per obtenir el nombre de clients de la sortida d'arp, he de filtrar la taula (eliminar els elements no relacionats) i comptar les files de la taula, el que resulta en l'ordre següent:

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

Provem-ho:

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

1

Genial. Ara ens fem la idea de com podem recollir tota la informació necessària. Automatitzem-lo. Per fer el nostre codi net i extensible, creem algunes funcions d’ajuda:

funció exec_out (cmd)

fitxer local = io.popen (cmd) si no és el fitxer, retornar zero final sortida local = fitxer: llegir ('* tot') fitxer: close () print ("Executar:"..cmd.. "->".. sortida) retorna la funció final de la sortida fitxer_lllegit (camí) fitxer local = io.open (camí, "rb") si no és fitxer, retornar nul contingut local = fitxer: llegir fitxer "* a": tancar () imprimir ("Llegir: "..path.." -> "..content) retorna el contingut

Mitjançant aquestes utilitats, ara podem implementar les funcions de recuperació de dades reals:

funció getArpClients ()

return tonumber (exec_out ("cat / proc / net / arp | grep br-lan | grep 0x2 | wc -l")) funció final getUptime () return tonumber (exec_out ("cat / proc / uptime | awk '{print $ 1 } '")) funció final getWanIP () retorna exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") end

Podeu executar parts d’aquestes ordres d’intèrpret d’ordres, per obtenir una comprensió més profunda del seu funcionament i ajustar-les a les vostres necessitats.

El més senzill és enviar les dades a l'aplicació Blynk. L'exemple predeterminat ja configura el temporitzador, que executa algun codi cada 5 segons, de manera que només el tornem a utilitzar:

local tmr1 = Temporitzador: nou {interval = 5000, func = function ()

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

A l'aplicació, afegim 3 widgets d'etiquetes i els assignem als pins virtuals 10, 11 i 12 en conseqüència.

Tot i que això funciona, és bastant ineficient, ja que la IP WAN o el nombre de clients no s’actualitzen tan sovint. Fixem-ho

Per a IP WAN, el passem al controlador connectat. S’executarà cada vegada que el router estableixi la connexió amb Blynk Cloud. Això hauria de ser suficient:

blynk: on ("connectat", function ()

print ("A punt") blynk: virtualWrite (12, getWanIP ()) end)

Per al temps d’activitat i el nombre de clients, creem un temporitzador independent amb 5 minuts. interval:

local tmr2 = Temporitzador: nou {interval = 5 * 60 * 1000, func = function ()

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

Pas 5: control WiFi: ON / OFF

Control WiFi: ON / OFF
Control WiFi: ON / OFF

Fins ara, només rebíem informació del dispositiu. Intentem controlar-la.

blynk: on ("V20", funció (param)

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

A l’aplicació, acabo d’afegir un widget Button (mode: Switch) i l’he assignat a V20.

Això és. Increïble.

Pas 6: gràfic d'estadístiques del sistema

Gràfic d’estadístiques del sistema
Gràfic d’estadístiques del sistema
Gràfic d’estadístiques del sistema
Gràfic d’estadístiques del sistema

funció getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2 + $ 4}'")) funció final getRamUsage () return tonumber (exec_out ("free | grep Mem | awk ' {print ($ 3- $ 7) / $ 2 * 100,0} '")) final

També hem d’enviar les dades a Blynk (tornem a utilitzar tmr1):

local tmr1 = Temporitzador: nou {interval = 5000, func = function ()

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

Al costat de l'aplicació, afegiu el widget SuperChart. Afegiu transmissions de dades de CPU, RAM i assigneu-les a V5, V6.

Pas 7: Estat de gir del disc dur

El meu enrutador té una unitat HDD externa connectada com a dispositiu d’emmagatzematge connectat a la xarxa, és a dir, aquesta unitat està configurada per començar a girar quan algú hi accedeix i per suspendre-la després d’un temps d’espera.

Viouslybviament, seria genial saber quantes vegades s’encén al llarg d’un dia. Així que he afegit un altre flux de dades al meu gràfic del sistema.

És una mica més complicat obtenir l’estat de la unitat de disc dur, però he trobat una manera. Primer de tot, instal·leu smartmontools des de la consola SSH:

actualització opkg

opkg instal·la smartmontools

Aleshores, al nostre codi, hem d’executar una ordre especial i comprovar el codi de sortida:

funció 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 i després torna 1 altra vegada torna 0 final

Nota: el meu disc dur és / dev / sda

Pas 8: gràfic d'activitat en xarxa

Gràfic d'activitat en xarxa
Gràfic d'activitat en xarxa

Creem un altre giny de SuperChart (similar a l’anterior), afegim transmissions de dades TX i RX i assignem a V1 i V2. Nota: Vull mostrar el statc del port WAN i el meu port WAN és eth0.2

Funcions d'assistència:

funció getWanRxBytes ()

return tonumber (read_file ("/ sys / class / net / eth0.2 / statistics / rx_bytes")) funció final getWanTxBytes () return tonumber (read_file ("/ sys / class / net / eth0.2 / statistics / tx_bytes")) final

A continuació, afegiu un codi al mateix tmr1. Això és més complicat, ja que només cal calcular i mostrar la diferència de bytes transmesos / rebuts:

prevTx local, prevRx

local tmr1 = Temporitzador: nou {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () si prevTx i prevTx ~ = tx llavors blynk: virtualWrite (1, tx - prevTx) finalitza si prevRx i prevRx ~ = rx després blynk: virtualWrite (2, rx - prevRx) final prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning ()) final}

Pas 9: notificacions

Notificacions
Notificacions

També volia rebre notificacions quan el meu router perd l'alimentació o la connexió a Internet. Per a això, necessitem un widget de notificació.

A la configuració del widget, activeu la "notificació fora de línia". No cal cap codi. Però també podem enviar notificacions personalitzades des del nostre codi.

Pas 10: execució automàtica en segon pla

De moment, l'script s'ha d'executar manualment, però vull fer-lo executar en segon pla automàticament quan s'encengui l'encaminador.

Això es fa creant un servei. Creeu un fitxer /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/ var / run / blynkmon.pid" start () {si [-f $ pidfile]; llavors ressona "blynkmon ja s'està executant" sortida 0 fi cd / root / lua-blynk lua blynkmon.lua to-auth-token> / dev / null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; llavors feu ressò de "blynkmon no s'executa" sortida 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Nota: no oblideu substituir el vostre token d'autenticació

A continuació, activeu el servei blynkmon:

servei blynkmon habilitar

Pas 11: Conclusió i idees addicionals

Conclusió i idees addicionals
Conclusió i idees addicionals

Podeu escanejar aquest QR per obtenir el clon del meu Projecte Blynk. Requereix alguns punts d’energia (4600), ja que utilitza molts widgets.

Trobeu el codi Lua complet aquí:

Fins ara està bé, però aquí hi ha algunes idees que voldria afegir en un futur proper.

  • Afegiu l'ordre Reinicia. Eviteu fer-hi clic accidentalment.
  • Afegiu el giny de Terminal per executar qualsevol ordre de Linux.
  • Afegiu un gràfic de temperatura de la CPU.

    ACTUALITZACIÓ: Malauradament OpenWrt actualment no disposa d'alguns controladors per al meu model de router. Però està disponible per a molts altres routers

  • Afegiu una notificació quan un dispositiu concret s’incorpori / surti de la xarxa. Ja tenim informació d’arp, ara només comproveu l’adreça MAC.

D'aquesta manera, podem controlar i controlar impressores 3D, robots, ordinadors portàtils, Arduino / ESP8266 / ESP32 / RaspberryPi, dispositius Smart Home i pràcticament qualsevol cosa al voltant. Feu-me saber si teniu alguna altra idea interessant. Què en penseu de tot això?

Recomanat: