Talaan ng mga Nilalaman:

Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayo: 11 Hakbang
Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayo: 11 Hakbang

Video: Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayo: 11 Hakbang

Video: Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayo: 11 Hakbang
Video: Always disconnected from Wifi Fixed!!! Tagalog 2024, Hunyo
Anonim
Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayuan
Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayuan
Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayuan
Android / iOS App upang ma-access ang Iyong OpenWrt Router mula sa malayuan

Bumili ako kamakailan ng isang bagong router (Xiaomi Mi Router 3G). At syempre, ang bago, kahanga-hangang piraso ng hardware na ito ang nagbigay inspirasyon sa akin upang magsimulang magtrabaho sa proyektong ito;)

Hakbang 1: Ipinapalagay ko, Na Mayroon Ka Nang OpenWrt…

Ipinapalagay ko, Na Mayroon Ka Nang OpenWrt Na…
Ipinapalagay ko, Na Mayroon Ka Nang OpenWrt Na…

Kinailangan kong mai-install muna ang OpenWrt … Kadalasan, sinunod ko ang patnubay na ito (tiyak para sa modelo ng router na ito): https://dzone.com/articles/hacking-into-xiaomi-mi-… Habang ginagawa ito, nahanap ko ang mahusay na video na ito: Pag-install ng Openwrt, benchmark ng WiFi, Girlfriend Flashing. Wow Tawa ako ng tawa!:)

Pansin Ang pag-install ng OpenWrt ay maaaring brick iyong router. Ngunit sa sandaling nakumpleto, ina-unlock ang buong lakas at kontrol. Hindi ako sapat na matapang upang magbigay ng anumang mga tagubilin dito, dahil maaaring magkakaiba ang mga ito para sa bawat modelo ng router.

Ngunit kung mayroon ka nang OpenWrt sa iyong router, magagawa mong magsimula sa tutorial na ito nang hindi pansamantala

Ang BTW, ang ilang mga development board ay mayroong OpenWrt out-of-the-box, tulad ng Onion Omega, VoCore, LinkIt Smart 7688 at iba pa. Ipinapaliwanag din ng tutorial na ito ang ilang pangunahing mga ideya sa likod ng paglikha ng mga naturang app, upang madali mong maiangkop ito upang gumana kasama ang Raspberry Pi at ang mga gusto.

Para sa proyektong ito, gumagamit ako ng halos paunang naka-install na software (magagamit sa anumang router na pinapagana ng OpenWrt). Ngunit para sa ilang advanced na pagpapaandar, kailangan kong mag-install ng karagdagang mga package. Ginagawa ito sa ilang pag-click lamang, kaya isasama ko ang mga tagubilin dito.

Gayundin, ipinapalagay ko na alam mo na:

  • Paano buksan / gamitin ang SSH terminal sa iyong OpenWrt router
  • Paano mag-upload / mag-edit ng mga file sa iyong router (gumamit ng FileZilla o scp / sftp)
  • Paano gagana sa Linux console

Hakbang 2: Software at Mga Tool

Software at Mga Tool
Software at Mga Tool

Sa panig ng smartphone, gumagamit ako ng Blynk. Nagbibigay ito ng mga iOS at Android app upang makontrol ang anumang hardware. Madali kang makakagawa ng magagandang mga graphic interface para sa lahat ng iyong mga proyekto sa pamamagitan lamang ng pag-drag at pag-drop ng mga widget, sa iyong smartphone. Ang Blynk ay kadalasang ginagamit sa Arduino, Raspberry Pi, atbp. Ngunit bakit hindi ito patakbuhin sa router mismo?;)

Sa panig ng aparato gagamitin ko ang Lua upang i-script ang kinakailangang pag-andar. Maaari ko ring gamitin ang Python o Node.js, ngunit sa kasamaang palad ang mga pagpipiliang ito ay hindi palaging magagamit, dahil sa kakulangan ng mga mapagkukunan sa ilang mga router. O C / C ++, ngunit hindi ito maginhawa upang gumana (muling pagsasaayos para sa bawat pagbabago, atbp.) Sa kabilang banda, si Lua ay paunang naka-install, simpleng gamitin at matuto. Ginagamit ito ng default na web interface, LuCI.

Hakbang 3: Lumilikha ng isang Minimal App

Ang pagsisimula sa Blynk at Lua ay kasing dali ng:

  • I-download ang Blynk App (mula sa App Store, Google Play)
  • Lumikha ng isang bagong proyekto at kunin ang Auth Token
  • Sundin ang mga tagubilin sa pag-install ng Blynk Lua para sa OpenWrt.

Gumamit ng SSH upang ma-access ka sa router console. Matapos patakbuhin ang default na halimbawa:

lua./examples/client.lua

Dapat nating makita ang isang bagay tulad nito:

Kumokonekta…

Pagkamayan ng SSL … Handa na.

Na nangangahulugang ang ligtas, bi-directional na koneksyon sa app ay naitatag! YAY!

Madali na nating palawakin ang ibinigay na halimbawa, kaya't gumagawa ito ng isang bagay na kawili-wili. Lumikha ako ng isang kopya ng halimbawang ito upang mai-edit ito:

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

Hakbang 4: Pagdaragdag ng Ilang Impormasyon: Bilang ng Mga kliyente, WAN IP Address, Uptime

Ang pangunahing ideya ay upang makuha ang impormasyon mula sa OS pana-panahon, magsagawa ng ilang mga simpleng pagkalkula kung kinakailangan, at pagkatapos ay ipadala ang resulta sa Blynk para ipakita.

Sa Linux / OpenWrt, mayroon kaming maraming mga paraan upang makuha ang data ng system:

  • Patakbuhin ang isang utos, at i-parse ang teksto na inilalabas nito
  • Patakbuhin ang isang utos, at panoorin ang exit code na ibinabalik nito
  • Basahin ang isang file ng system, na matatagpuan sa / proc / at / sys / klase / direktoryo

Ngayon nais kong ipakita ang bilang ng mga nakakonektang aparato.

Kapag nagpatakbo ako ng cat / proc / net / arp sa console, inilalabas nito ang listahan ng mga kilalang aparato, kasama ang kanilang mga MAC at IP address:

IP address HW type Flags HW address 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

Maaari nating mai-parse ito nang direkta sa Lua, ngunit madalas na mas madaling gamitin ang mga dalubhasang kagamitan. Sa Linux, ito ang grep, ulo, buntot, gupitin, wc, awk.

Upang makakuha ng bilang ng mga kliyente mula sa output ng arp, kailangan kong salain ang talahanayan (alisin ang mga hindi kaugnay na item) at bilangin ang mga hilera ng talahanayan, na magreresulta sa sumusunod na utos:

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

Subukan Natin:

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

1

Malaki. Nakukuha namin ngayon ang ideya kung paano namin makokolekta ang lahat ng kinakailangang impormasyon. I-automate natin ito. Upang malinis at mapalawak ang aming code, gumawa tayo ng ilang mga pagpapaandar ng helper:

function exec_out (cmd)

lokal na file = io.popen (cmd) kung hindi mag-file pagkatapos ay ibalik ang walang katapusan na lokal na output = file: basahin ('* lahat') file: isara () i-print ("Run:"..cmd.. "->".. output) ibalik ang output end function read_file (path) local file = io.open (path, "rb") kung hindi i-file pagkatapos ay ibalik ang walang katapusang lokal na nilalaman = file: basahin ang "* a" file: close () print ("Basahin: "..path.." -> ".. nilalaman) ibalik ang nilalaman ng nilalaman

Gamit ang mga utility na ito, maaari na naming ipatupad ang aktwal na mga pag-andar ng pagkuha ng data:

pagpapaandar 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

Maaari kang magpatakbo ng mga bahagi ng mga command ng shell, upang makakuha ng mas malalim na pag-unawa sa kung paano ito gumagana, at upang ayusin ito sa iyong mga pangangailangan.

Ang pinakamadaling bahagi ay ang pagpapadala ng data sa Blynk App. Ang default na halimbawa ay nag-set up na ng timer, na nagpapatakbo ng ilang code bawat 5 segundo, kaya ginagamit lang namin ito muli:

local tmr1 = Timer: bagong {interval = 5000, func = function ()

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

Sa app, nagdagdag kami ng 3 mga widget ng label, at itatalaga ang mga ito sa Virtual Pins 10, 11, 12 nang naaayon.

Habang ito ay gumagana, ito ay sa halip hindi mabisa, tulad ng WAN IP o bilang ng mga kliyente ay hindi nag-update nang madalas. Ayusin natin ito

Para sa WAN IP, inililipat namin ito sa konektadong handler. Tatakbo ito tuwing itinatakda ng router ang koneksyon sa Blynk Cloud. Ito ay dapat na sapat:

blynk: on ("konektado", function ()

i-print ("Handa.") blynk: virtualWrite (12, getWanIP ()) pagtatapos)

Para sa Uptime at Clients Number, lumilikha kami ng isang hiwalay na timer na may 5 min. agwat:

lokal tmr2 = Timer: bagong {interval = 5 * 60 * 1000, func = function ()

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

Hakbang 5: Kontrol sa WiFi: ON / OFF

Kontrol sa WiFi: ON / OFF
Kontrol sa WiFi: ON / OFF

Hanggang ngayon, nakakakuha lamang kami ng ilang impormasyon mula sa aparato. Subukan nating kontrolin ito!

blynk: sa ("V20", pagpapaandar (param)

kung ang param [1] == "1" pagkatapos ay os.execut ("wifi up") iba pa os.execut ("wifi down") end end)

Sa panig ng app, nagdagdag lamang ako ng isang Button widget (mode: Switch) at itinalaga ito sa V20.

Ayan yun. Kamangha-mangha

Hakbang 6: Tsart ng Stats ng System

Chart ng System Stats
Chart ng System Stats
Chart ng System Stats
Chart ng System Stats

pagpapaandar getCpuLoad ()

return tonumber (exec_out ("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $ 2 + $ 4}'")) end function getRamUsage () return tonumber (exec_out ("libre | grep Mem | awk ' Pagtatapos ng {print ($ 3- $ 7) / $ 2 * 100.0} '"))

Kailangan din naming ipadala ang data sa Blynk (gamitin ulit natin ang tmr1):

local tmr1 = Timer: bagong {interval = 5000, func = function ()

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

Sa App Side, magdagdag ng SuperChart widget. Magdagdag ng CPU, RAM datastreams at italaga sa V5, V6.

Hakbang 7: Katayuan sa Umiikot na HDD

Ang aking router ay may isang panlabas na HDD drive na konektado bilang isang aparato na Naka-attach sa Storage. Ang bagay na ito, ang drive na ito ay na-configure upang simulan ang pag-ikot kapag may nag-access dito, at upang suspindihin pagkatapos ng isang pag-timeout.

Malinaw na, magiging cool na malaman kung gaano karaming beses itong nakabukas sa buong isang araw. Kaya nagdagdag ako ng isa pang datastream sa aking tsart ng System.

Medyo mas mahirap upang makuha ang katayuan ng HDD drive, ngunit nakakita ako ng paraan! Una sa lahat, mag-install ng mga smartmontool mula sa SSH console:

update ng opkg

opkg install ng smartmontools

Pagkatapos, sa aming code, kailangan naming magpatakbo ng isang espesyal na utos at suriin ang exit code:

function exec_ret (cmd)

local exit = os.execut (cmd) print ("Run:"..cmd.. "-> exit:".. exit) return exit end function getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info / dev / sda> / dev / null ") == 0 pagkatapos ay ibalik ang 1 na bumalik sa 0 end end

Tandaan: ang aking HDD ay / dev / sda

Hakbang 8: Tsart ng Aktibidad sa Network

Tsart ng Aktibidad sa Network
Tsart ng Aktibidad sa Network

Lumilikha kami ng isa pang widget ng SuperChart (katulad ng dati), Magdagdag ng TX at RX datastreams, at italaga sa V1 at V2. Tandaan: Gusto kong ipakita ang WAN port statc, at ang aking WAN port ay eth0.2

Mga function ng helper:

pagpapaandar 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")) wakas

Susunod, magdagdag ng ilang code sa parehong tmr1. Ito ay mas kumplikado, dahil kailangan lamang naming kalkulahin at ipakita ang pagkakaiba sa mga naihatid / natanggap na byte:

lokal na prevTx, prevRx

local tmr1 = Timer: bagong {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () kung prevTx at prevTx ~ = tx pagkatapos ay blynk: virtualWrite (1, tx - prevTx) magtatapos kung prevRx at prevRx ~ = rx pagkatapos blynk: virtualWrite (2, rx - prevRx) end prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning)) pagtatapos}

Hakbang 9: Mga Abiso

Mga Abiso
Mga Abiso

Nais ko ring maabisuhan kapag ang aking Router ay nawalan ng kapangyarihan o koneksyon sa internet. Para sa mga ito, kailangan namin ng widget ng Notification.

Sa mga setting ng widget, paganahin ang "offline na abiso". Hindi kinakailangan ng code. Ngunit maaari rin kaming magpadala ng mga pasadyang notification mula sa aming code.

Hakbang 10: Mag-Autorun sa Background

Sa ngayon ang script ay dapat na manu-manong naisakatuparan, ngunit nais kong patakbuhin ito sa background nang awtomatiko kapag pinapagana ang router.

Ginagawa ito sa pamamagitan ng paglikha ng isang serbisyo. Lumikha ng isang file /etc/init.d/blynkmon:

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

MAGSIMULA = 99 STOP = pidfile = "/ var / run / blynkmon.pid" start () {if [-f $ pidfile]; pagkatapos ay i-echo ang "blynkmon na tumatakbo na" exit 0 fi cd / root / lua-blynk lua blynkmon.lua your-auth-token> / dev / null & echo $! > $ pidfile} huminto () {kung [! -f $ pidfile]; pagkatapos ay i-echo ang "blynkmon not running" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Tandaan: huwag kalimutang palitan ang iyong-auth-token

Pagkatapos, paganahin ang serbisyo ng blynkmon:

paganahin ang service blynkmon

Hakbang 11: Konklusyon at Karagdagang Mga Ideya

Konklusyon at Karagdagang Mga Ideya
Konklusyon at Karagdagang Mga Ideya

Maaari mong i-scan ang QR na ito upang makuha ang clone ng aking Blynk Project. Nangangailangan ito ng ilang mga puntos ng enerhiya (4600), dahil gumagamit ito ng maraming mga widget!

Hanapin ang Buong code ng Lua dito:

Sa ngayon napakahusay, ngunit narito ang ilang mga ideya na nais kong idagdag sa malapit na hinaharap.

  • Magdagdag ng utos ng Reboot. Pigilan ang pag-click dito nang hindi sinasadya.
  • Magdagdag ng Terminal widget upang patakbuhin ang anumang utos ng linux.
  • Magdagdag ng tsart ng temperatura ng CPU.

    UPD: Sa kasamaang palad ay kasalukuyang kulang sa OpenWrt ang ilang mga driver para sa aking modelo ng router. Ngunit magagamit ito para sa maraming iba pang mga router

  • Magdagdag ng abiso kapag ang isang partikular na aparato ay sumali / umalis sa network. Mayroon kaming impormasyon sa arp, ngayon lamang suriin ang MAC address.

Sa ganitong paraan, masusubaybayan at makokontrol namin ang Mga 3D Printer, Robots, isang regular na PC / Laptop, Arduino / ESP8266 / ESP32 / Mga bagay na RaspberryPi, mga aparato ng Smart Home, at halos anumang bagay sa paligid. Ipaalam sa akin kung mayroong anumang iba pang mga kagiliw-giliw na ideya. Ano ang palagay mo tungkol sa lahat ng ito?

Inirerekumendang: