Turinys:
- 1 žingsnis: Manau, kad jau turite „OpenWrt“…
- 2 žingsnis: Programinė įranga ir įrankiai
- 3 žingsnis: sukurkite minimalią programą
- 4 veiksmas: tam tikros informacijos pridėjimas: klientų skaičius, WAN IP adresas, veikimo laikas
- 5 veiksmas: „WiFi“valdymas: ĮJUNGTA/IŠJUNGTA
- 6 žingsnis: Sistemos statistikos diagrama
- 7 veiksmas: HDD sukimosi būsena
- 8 veiksmas: tinklo veiklos diagrama
- 9 veiksmas: pranešimai
- 10 veiksmas: automatinis paleidimas fone
- 11 žingsnis: Išvada ir kitos idėjos
Video: „Android“/„iOS“programa nuotoliniu būdu pasiekti „OpenWrt“maršrutizatorių: 11 žingsnių
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:47
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“…
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
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
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
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
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
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
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:
„Pasidaryk pats“ir nuotoliniu būdu valdoma LED juostelė: 10 žingsnių (su nuotraukomis)
„Pasidaryk pats“ir nuotoliniu būdu valdoma LED juostelė: Sveiki, visi, sveiki atvykę į mūsų naujus nurodymus, nes iš miniatiūros jau žinote, kad šiame projekte mes pagaminsime „Ir led“juostos valdiklį, kurį galima valdyti naudojant bet kurį dažniausiai prieinamą IR nuotolinio valdymo pultą. naudojamas
Nuotoliniu būdu valdoma namų programa su atminties funkcija: 4 žingsniai
Nuotolinio valdymo namų programa su atminties funkcija: naudodamiesi šia grandine, mes galime valdyti 4 relę naudodami ir nuotolinio valdymo pultą, o naudodamiesi „eeprom“funkcija prisimins paskutinę relių būseną net ir dingus elektrai
Sukurkite nuotoliniu būdu aktyvuojamą purkštuvą naudodami „PiFace“ir „Ubidots“: 13 žingsnių
Sukurkite nuotoliniu būdu aktyvuojamą purkštuvą naudodami „PiFace“ir „Ubidots“: tai puikus pavyzdys, mokantis, kaip naudoti „Raspberry Pi“, „PiFace“ir „Ubidots“, kad laistytumėte savo sodą iš toli. Galėsite nuotoliniu būdu valdyti elektrinį vožtuvą, kad laistytumėte augalus iš bet kurios vietos, tiesiog naudodami savo telefoną
Sukurkite 15 USD kainuojantį nuotoliniu būdu valdomą ESP8266 roboto lizdą / automobilį / baką, skirtą „iOS“ir „Android“: 4 žingsniai
Sukurkite 15 USD kainuojantį nuotoliniu būdu valdomą ESP8266 roboto liokajų / automobilį / baką, skirtą „iOS“ir „Android“: ar nekenčiate vaikščioti į virtuvę norėdami užkąsti? Arba nusipirkti naujo gėrimo? Visa tai galima išspręsti naudojant šį paprastą 15 USD nuotoliniu būdu valdomą liokajų. Prieš eidami toliau, šiuo metu vykdau „Kickstarter“projektą, skirtą balsu valdomam RGB šviesos diodui
Nuotoliniu būdu valdomas laikmatis su „NodeMCU“: 14 žingsnių
Nuotoliniu būdu valdomas laikmatis su „NodeMCU“: Čia mes sukursime laikmatį naudodami „NodeMCU“ir „Adafruit“. Mes rodysime savo laikmatį su LED juostele ir galėsime jį valdyti naudodami savo telefoną ar kompiuterį! Mūsų tikslas: Sukurkite laikmatį naudodami LED juostelę, kurią galime: pradėti, pau