Turinys:

„Android“/„iOS“programa nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių: 11 žingsnių
„Android“/„iOS“programa nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių: 11 žingsnių

Video: „Android“/„iOS“programa nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių: 11 žingsnių

Video: „Android“/„iOS“programa nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių: 11 žingsnių
Video: Telefono seklys REPTILICUS (Android, IOS) 2024, Lapkritis
Anonim
„Android“/„iOS“programa, skirta nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių
„Android“/„iOS“programa, skirta nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių
„Android“/„iOS“programa, skirta nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių
„Android“/„iOS“programa, skirta nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių

Neseniai nusipirkau naują maršrutizatorių („Xiaomi Mi Router 3G“). Ir, žinoma, ši nauja, nuostabi aparatinė įranga įkvėpė mane pradėti dirbti su šiuo projektu;)

1 žingsnis: Manau, kad jau turite „OpenWrt“…

Manau, kad jūs jau turite „OpenWrt“…
Manau, kad jūs jau turite „OpenWrt“…

Pirmiausia turėjau įdiegti „OpenWrt“… Dažniausiai vadovavausi šiuo vadovu (specialiai šiam maršrutizatoriaus modeliui): https://dzone.com/articles/hacking-into-xiaomi-mi-… Dirbdamas su juo radau šį nuostabų vaizdo įrašą: „Openwrt“diegimas, „WiFi“etalonas, merginos mirksėjimas. Oho, aš taip juokiausi!:)

Dėmesio! Įdiegę „OpenWrt“, galite sugadinti maršrutizatorių. Tačiau baigus, jis atveria visą galią ir valdymą. Nesu pakankamai drąsus, kad galėčiau čia pateikti bet kokias instrukcijas, nes jos gali skirtis kiekvienam maršrutizatoriaus modeliui.

Bet jei jau turite „OpenWrt“savo maršrutizatoriuje, galėsite pradėti nuo šios pamokos

BTW, kai kuriose kūrimo lentose yra „OpenWrt“iš karto, pvz., „Onion Omega“, „VoCore“, „LinkIt Smart 7688“ir kitos. Ši pamoka taip pat paaiškina pagrindines tokių programų kūrimo idėjas, kad galėtumėte lengvai pritaikyti ją darbui su „Raspberry Pi“ir pan.

Šiam projektui daugiausia naudosiu iš anksto įdiegtą programinę įrangą (galima bet kuriame maršrutizatoriuje, kuriame veikia „OpenWrt“). Tačiau norėdamas kai kurių išplėstinių funkcijų turėjau įdiegti papildomus paketus. Tai atliekama vos keliais paspaudimais, todėl čia pateiksiu instrukcijas.

Be to, manau, kad jūs jau žinote:

  • Kaip atidaryti/naudoti SSH terminalą prie „OpenWrt“maršrutizatoriaus
  • Kaip įkelti/redaguoti failus maršrutizatoriuje (naudokite „FileZilla“arba „scp/sftp“)
  • Kaip dirbti su „Linux“konsole

2 žingsnis: Programinė įranga ir įrankiai

Programinė įranga ir įrankiai
Programinė įranga ir įrankiai

Iš išmaniųjų telefonų pusės naudoju „Blynk“. Jame yra „iOS“ir „Android“programos, skirtos valdyti bet kokią aparatinę įrangą. Galite lengvai sukurti gražias grafines sąsajas visiems savo projektams tiesiog vilkdami ir numesdami valdiklius tiesiai į savo išmanųjį telefoną. „Blynk“dažniausiai naudojamas su „Arduino“, „Raspberry Pi“ir kt. Bet kodėl gi nepaleidus jo pačiame maršrutizatoriuje?;)

Įrenginio pusėje naudoju „Lua“norimam funkcionalumui scenarijuoti. Taip pat galėčiau naudoti „Python“arba „Node.js“, tačiau, deja, šios parinktys ne visada pasiekiamos, nes kai kuriuose maršrutizatoriuose trūksta išteklių. Arba C/C ++, bet tai nėra taip patogu dirbti (persikompiliuoti kiekvienam pakeitimui ir pan.) Kita vertus, „Lua“yra iš anksto įdiegta, paprasta naudoti ir išmokti. Jį naudoja numatytoji žiniatinklio sąsaja „LuCI“.

3 žingsnis: sukurkite minimalią programą

Pradėti naudotis „Blynk“ir „Lua“yra taip paprasta, kaip:

  • Atsisiųskite „Blynk“programą (iš „App Store“, „Google Play“)
  • Sukurkite naują projektą ir gaukite „Auth Token“
  • Vykdykite „Blynk Lua“„OpenWrt“diegimo instrukcijas.

Norėdami pasiekti maršrutizatoriaus konsolę, naudokite SSH. Paleidus numatytąjį pavyzdį:

lua./examples/client.lua

Turėtume pamatyti kažką panašaus:

Prisijungiama…

SSL rankos paspaudimas … Paruošta.

Tai reiškia, kad yra sukurtas saugus, dvikryptis ryšys su programa! YAY!

Dabar galime lengvai pratęsti pateiktą pavyzdį, todėl tai daro kažką įdomaus. Sukūriau šio pavyzdžio kopiją, kad galėčiau jį redaguoti:

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

4 veiksmas: tam tikros informacijos pridėjimas: klientų skaičius, WAN IP adresas, veikimo laikas

Pagrindinė idėja yra periodiškai gauti informaciją iš OS, prireikus atlikti kelis paprastus skaičiavimus ir tada nusiųsti rezultatą į „Blynk“, kad jis būtų rodomas.

„Linux“/„OpenWrt“sistemoje turime kelis būdus, kaip gauti sistemos duomenis:

  • Vykdykite komandą ir išanalizuokite jos pateiktą tekstą
  • Vykdykite komandą ir stebėkite išeinantį kodą, kurį jis grąžina
  • Perskaitykite sistemos failą, esantį/proc/ir/sys/class/kataloguose

Dabar noriu parodyti prijungtų įrenginių skaičių.

Kai konsolėje paleidžiu cat/proc/net/arp, jis pateikia žinomų įrenginių sąrašą kartu su jų MAC ir IP adresais:

IP adresas HW tipas Vėliavos HW adresas Mask Device

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

Mes galime jį išanalizuoti tiesiogiai „Lua“, tačiau dažnai lengviau naudotis specializuotomis paslaugomis. „Linux“sistemoje tai yra grep, head, tail, cut, wc, awk.

Norėdami gauti klientų skaičių iš arp išvesties, turiu filtruoti lentelę (pašalinti nesusijusius elementus) ir suskaičiuoti lentelės eilutes, todėl gaunama tokia komanda:

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

Pamėginkime:

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

1

Puiku. Dabar mes suprantame, kaip galime surinkti visą reikalingą informaciją. Automatizuokime. Kad mūsų kodas būtų švarus ir išplėstas, sukurkime keletą pagalbinių funkcijų:

funkcija exec_out (cmd)

vietinis failas = io.popen (cmd), jei ne failas, tada grąžinkite nulinį pabaigą vietinis išėjimas = failas: skaityti ('*visi') failas: uždaryti () spausdinti ("Vykdyti:"..cmd.. " ->".. išvestis) grįžti išvesties pabaigos funkcija read_file (kelias) vietinis failas = io.open (kelias, „rb“), jei ne failas, tada grąžinkite nulinį pabaigą vietinis turinys = failas: skaitykite „*a“failą: uždarykite () spausdinkite („Skaitykite: "..path.." -> "..content) grąžinti turinį

Naudodamiesi šiomis paslaugomis, dabar galime įgyvendinti faktines duomenų gavimo funkcijas:

funkcija getArpClients ()

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

Galite paleisti šių apvalkalo komandų dalis, kad geriau suprastumėte, kaip tai veikia, ir pritaikykite ją savo poreikiams.

Lengviausia yra siųsti duomenis į „Blynk“programą. Numatytasis pavyzdys jau nustato laikmatį, kuris paleidžia kodą kas 5 sekundes, todėl mes jį tiesiog pakartotinai naudojame:

local tmr1 = Laikmatis: naujas {interval = 5000, func = function ()

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

Programoje pridedame 3 etikečių valdiklius ir atitinkamai priskiriame juos 10, 11, 12 virtualiems kaiščiams.

Nors tai veikia, tai yra gana neveiksminga, nes WAN IP ar klientų skaičius neatnaujinamas taip dažnai. Ištaisykime tai

Jei naudojate WAN IP, perkeliame jį į prijungtą tvarkyklę. Jis bus paleistas kiekvieną kartą, kai maršrutizatorius užmezga ryšį su „Blynk Cloud“. To turėtų pakakti:

blynk: on ("prijungtas", funkcija ()

print („Ready“) blynk: virtualWrite (12, getWanIP ()) pabaiga)

„Uptime“ir „Client Number“sukuriame atskirą laikmatį su 5 min. intervalas:

local tmr2 = Laikmatis: naujas {interval = 5*60*1000, func = function ()

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

5 veiksmas: „WiFi“valdymas: ĮJUNGTA/IŠJUNGTA

„WiFi“valdymas: ON/OFF
„WiFi“valdymas: ON/OFF

Iki šiol iš įrenginio gaudavome tik tam tikrą informaciją. Pabandykime ją valdyti!

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

jei param [1] == "1", tada os.execute ("wifi up") else os.execute ("wifi down") pabaiga)

Programos pusėje aš ką tik pridėjau mygtuko valdiklį (režimas: jungiklis) ir priskyriau jį V20.

Viskas. Nuostabu.

6 žingsnis: Sistemos statistikos diagrama

Sistemos statistikos diagrama
Sistemos statistikos diagrama
Sistemos statistikos diagrama
Sistemos statistikos diagrama

funkcija getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2+$ 4}'")) pabaigos funkcija getRamUsage () return tonumber (exec_out ("free | grep Mem | awk ' {print ($ 3- $ 7)/$ 2 * 100.0} '")) pabaiga

Taip pat turime nusiųsti duomenis į „Blynk“(dar kartą naudokime tmr1):

local tmr1 = Laikmatis: naujas {interval = 5000, func = function ()

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

Programos pusėje pridėkite „SuperChart“valdiklį. Pridėkite procesoriaus, RAM duomenų srautus ir priskirkite V5, V6.

7 veiksmas: HDD sukimosi būsena

Mano maršrutizatorius turi išorinį HDD diską, prijungtą kaip prie tinklo prijungtas saugojimo įrenginys. Reikalas tas, kad šis diskas yra sukonfigūruotas taip, kad pradėtų suktis, kai kas nors prie jo prieitų, ir sustabdyti po skirtojo laiko.

Akivaizdu, kad būtų šaunu žinoti, kiek kartų jis įsijungia per dieną. Taigi į savo sistemos diagramą įtraukiau dar vieną duomenų srautą.

Šiek tiek sudėtingiau gauti HDD įrenginio būseną, bet radau būdą! Pirmiausia įdiekite „smartmontools“iš SSH konsolės:

opkg atnaujinimas

opkg įdiegti smartmontools

Tada savo kode turime paleisti specialią komandą ir patikrinti išėjimo kodą:

funkcija exec_ret (cmd)

vietinis išėjimas = os.execute (cmd) print ("Vykdyti:"..cmd.. " -> išeiti:".. išeiti) grįžti išėjimo pabaigos funkcija getHddSpinning () if exec_ret ("smartctl --nocheck = budėjimo režimas -informacija /dev/sda>/dev/null ") == 0, tada grąžinkite 1 kitą grąžinkite 0 pabaigos

Pastaba: mano HDD yra /dev /sda

8 veiksmas: tinklo veiklos diagrama

Tinklo veiklos diagrama
Tinklo veiklos diagrama

Mes sukuriame kitą „SuperChart“valdiklį (panašų į ankstesnį), pridedame TX ir RX duomenų srautus ir priskiriame V1 ir V2. Pastaba: noriu rodyti WAN prievado statistiką, o mano WAN prievadas yra eth0.2

Pagalbinės funkcijos:

funkcija getWanRxBytes ()

return tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) pabaigos funkcija getWanTxBytes () grąžinti tonumber (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) galas

Tada pridėkite kodą prie to paties tmr1. Tai sudėtingiau, nes mums reikia tik apskaičiuoti ir parodyti perduotų/gautų baitų skirtumus:

vietinis prevTx, prevRx

local tmr1 = Laikmatis: naujas {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () if prevTx and prevTx ~ = tx then blynk: virtualWrite (1, tx - prevTx) end if prevRx and prevRx ~ = rx tada blynk: virtualWrite (2, rx - prevRx) pabaiga prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning)) galas}

9 veiksmas: pranešimai

Pranešimai
Pranešimai

Aš taip pat norėjau būti informuotas, kai mano maršrutizatorius praranda maitinimą ar interneto ryšį. Tam mums reikia pranešimų valdiklio.

Valdiklio nustatymuose įgalinkite „pranešimus neprisijungus“. Kodo nereikia. Bet mes taip pat galime siųsti pasirinktinius pranešimus iš savo kodo.

10 veiksmas: automatinis paleidimas fone

Kol kas scenarijus turi būti vykdomas rankiniu būdu, bet noriu, kad jis būtų paleistas automatiškai fone, kai maršrutizatorius įjungiamas.

Tai daroma sukuriant paslaugą. Sukurkite failą /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; tada echo "blynkmon jau veikia" išeiti 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; tada aidi "blynkmon neveikia" išeiti 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Pastaba: nepamirškite pakeisti savo autoriaus žetono

Tada įjunkite „blynkmon“paslaugą:

paslauga blynkmon įjungti

11 žingsnis: Išvada ir kitos idėjos

Išvada ir kitos idėjos
Išvada ir kitos idėjos

Galite nuskaityti šį QR, kad gautumėte mano „Blynk Project“kloną. Tam reikia tam tikrų energijos taškų (4600), nes jis naudoja daugybę valdiklių!

Visą „Lua“kodą rasite čia:

Kol kas viskas gerai, bet čia yra keletas idėjų, kurias norėčiau pridėti artimiausiu metu.

  • Pridėti komandą Reboot. Neleiskite spustelėti jo atsitiktinai.
  • Pridėkite terminalo valdiklį, kad paleistumėte bet kurią „Linux“komandą.
  • Pridėkite procesoriaus temperatūros diagramą.

    UPD: Deja, šiuo metu „OpenWrt“trūksta kelių maršrutizatoriaus modelio tvarkyklių. Tačiau jis yra prieinamas daugeliui kitų maršrutizatorių

  • Pridėkite pranešimą, kai tam tikras įrenginys prisijungia prie tinklo arba išeina iš jo. Mes jau turime arp informaciją, dabar patikrinkite tik MAC adresą.

Tokiu būdu galime stebėti ir valdyti 3D spausdintuvus, robotus, įprastą asmeninį kompiuterį/nešiojamąjį kompiuterį, „Arduino“/ESP8266/ESP32/„RaspberryPi“daiktus, išmaniuosius namų įrenginius ir praktiškai viską, kas yra aplink. Leiskite man žinoti, ar turite kitų įdomių idėjų. Ką manote apie visa tai?

Rekomenduojamas: