Sisällysluettelo:

Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöön: 11 vaihetta
Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöön: 11 vaihetta

Video: Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöön: 11 vaihetta

Video: Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöön: 11 vaihetta
Video: Create Your Own Cloud like OneDrive, Google Drive 2024, Marraskuu
Anonim
Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöä varten
Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöä varten
Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöä varten
Android/iOS -sovellus OpenWrt -reitittimen etäkäyttöä varten

Ostin äskettäin uuden reitittimen (Xiaomi Mi Router 3G). Ja tietysti tämä uusi, mahtava laitteisto inspiroi minua aloittamaan tämän projektin;)

Vaihe 1: Oletan, että sinulla on jo OpenWrt…

Oletan, että sinulla on jo OpenWrt…
Oletan, että sinulla on jo OpenWrt…

Minun oli ensin asennettava OpenWrt … Enimmäkseen seurasin tätä opasta (erityisesti tätä reititinmallia varten): https://dzone.com/articles/hacking-into-xiaomi-mi-… Löysin tämän mahtavan videon: Openwrt -asennus, WiFi -vertailuarvo, tyttöystävä vilkkuu. Wow nauroin niin kovasti!:)

Huomio! OpenWrtin asentaminen voi katkaista reitittimen. Mutta kun se on valmis, se avaa täyden tehon ja hallinnan. En ole tarpeeksi rohkea antamaan ohjeita täällä, koska ne voivat olla erilaisia jokaisella reitittimellä.

Mutta jos sinulla on jo OpenWrt reitittimessäsi, voit aloittaa tämän opetusohjelman kanssa

BTW, joissakin kehityskorteissa on valmiina OpenWrt, kuten Onion Omega, VoCore, LinkIt Smart 7688 ja muut. Tämä opetusohjelma selittää myös joitain perusideoita tällaisten sovellusten luomisesta, joten voit helposti mukauttaa sen toimimaan Raspberry Pi: n ja muiden kanssa.

Tässä projektissa käytän enimmäkseen esiasennettua ohjelmistoa (saatavana millä tahansa OpenWrt-yhteensopivalla reitittimellä). Mutta joidenkin lisätoimintojen vuoksi minun oli asennettava lisäpaketteja. Tämä tehdään vain muutamalla napsautuksella, joten lisään ohjeet tähän.

Lisäksi oletan, että tiedät jo:

  • SSH -terminaalin avaaminen/käyttäminen OpenWrt -reitittimellesi
  • Tiedostojen lataaminen/muokkaaminen reitittimellä (käytä FileZillaa tai scp/sftp: tä)
  • Kuinka työskennellä Linux -konsolin kanssa

Vaihe 2: Ohjelmisto ja työkalut

Ohjelmistot ja työkalut
Ohjelmistot ja työkalut

Älypuhelimen puolella käytän Blynkia. Se tarjoaa iOS- ja Android -sovelluksia minkä tahansa laitteiston hallintaan. Voit helposti luoda kauniita graafisia käyttöliittymiä kaikkiin projekteihisi vetämällä ja pudottamalla widgettejä suoraan älypuhelimeesi. Blynkia käytetään enimmäkseen Arduinon, Raspberry Pi: n jne. Kanssa. Mutta miksi et käytä sitä itse reitittimessä?;)

Laitteen puolella käytän Luaa tarvittavien toimintojen komentamiseen. Voisin käyttää myös Pythonia tai Node.js -tiedostoa, mutta valitettavasti nämä vaihtoehdot eivät ole aina käytettävissä, koska resursseja ei ole joissakin reitittimissä. Tai C/C ++, mutta sen kanssa työskentely ei ole niin kätevää (kokoaminen uudelleen jokaista muutosta varten jne.). Toisaalta Lua on esiasennettu, helppokäyttöinen ja opittava. Sitä käyttää oletusverkkokäyttöliittymä, LuCI.

Vaihe 3: Minimaalisen sovelluksen luominen

Blynkin ja Luan käytön aloittaminen on yhtä helppoa kuin:

  • Lataa Blynk -sovellus (App Storesta, Google Playsta)
  • Luo uusi projekti ja hanki todennustunnus
  • Noudata Blynk Lua -asennusohjeita OpenWrtille.

Käytä SSH: ta reitittimen konsolin käyttämiseen. Oletusesimerkin suorittamisen jälkeen:

lua./esimerkit/asiakas.lua

Meidän pitäisi nähdä jotain tällaista:

Yhdistetään…

SSL -kättely… Valmis.

Tämä tarkoittaa, että suojattu, kaksisuuntainen yhteys sovellukseen on muodostettu!

Voimme nyt helposti laajentaa annettua esimerkkiä, joten se tekee jotain mielenkiintoista. Olen luonut kopion tästä esimerkistä muokkaamaan sitä:

cp./esimerkit/asiakas.lua./blynkmon.lua

Vaihe 4: Tietojen lisääminen: asiakkaiden määrä, WAN -IP -osoite, käyttöaika

Perusajatuksena on saada tiedot käyttöjärjestelmästä säännöllisesti, suorittaa tarvittaessa yksinkertaisia laskutoimituksia ja lähettää sitten tulos Blynkille näytettäväksi.

Linux/OpenWrt -järjestelmässä meillä on useita tapoja saada järjestelmätiedot:

  • Suorita komento ja jäsennä sen tuottama teksti
  • Suorita komento ja katso, kuinka se palauttaa poistumiskoodin
  • Lue järjestelmätiedosto, joka sijaitsee hakemistossa/proc/ja/sys/class/hakemistot

Nyt haluan näyttää yhdistettyjen laitteiden määrän.

Kun suoritan cat/proc/net/arp -konsolin, se lähettää luettelon tunnetuista laitteista sekä niiden MAC- ja IP -osoitteet:

IP -osoite HW -tyyppi Liput HW -osoite Maskilaite

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

Voimme jäsentää sen suoraan Lualla, mutta erikoisohjelmien käyttö on usein helpompaa. Linuxissa nämä ovat grep, head, tail, cut, wc, awk.

Jotta saisin asiakkaiden lukumäärän arp -tulostuksesta, minun on suodatettava taulukko (poistettava toisiinsa liittymättömät kohteet) ja laskettava taulukon rivit, mikä johtaa seuraavaan komentoon:

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

Kokeillaan:

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

1

Loistava. Nyt saamme käsityksen siitä, kuinka voimme kerätä kaikki tarvittavat tiedot. Automatisoimme sen. Jotta koodistamme tulisi puhdas ja laajennettava, luomme joitain aputoimintoja:

toiminto exec_out (cmd)

paikallinen tiedosto = io.popen (cmd) jos ei tiedosto, niin palauta null end local output = file: read ('*all') tiedosto: close () print ("Run:"..cmd.. " ->".. output) return output end function read_file (polku) local file = io.open (path, "rb") if not file then return nil end local content = file: read "*a" file: close () print ("Lue: "..polku.." -> "..sisältö) palauta sisällön loppu

Näiden apuohjelmien avulla voimme nyt toteuttaa todelliset tiedonhakutoiminnot:

funktio getArpClients ()

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

Voit suorittaa osia näistä komentokomennoista, saadaksesi syvemmän käsityksen sen toiminnasta ja säätääksesi sen tarpeidesi mukaan.

Helpoin osa on tietojen lähettäminen Blynk -sovellukseen. Oletusesimerkki asettaa jo ajastimen, joka suorittaa jonkin koodin 5 sekunnin välein, joten käytämme sitä vain uudelleen:

paikallinen tmr1 = Ajastin: uusi {interval = 5000, func = function ()

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

Lisäämme sovellukseen 3 tarra -widgettiä ja määritämme ne Virtual Pins 10, 11, 12 vastaavasti.

Vaikka tämä toimii, se on melko tehotonta, koska WAN IP tai asiakasmäärät eivät päivity niin usein

WAN IP: lle siirrämme sen yhdistettyyn käsittelijään. Se suoritetaan joka kerta, kun reititin muodostaa yhteyden Blynk Cloudiin. Tämän pitäisi riittää:

blynk: päällä ("kytketty", toiminto ()

print ("Valmis.") blynk: virtualWrite (12, getWanIP ()) end)

Luomme Uptime ja Client Number -toiminnolle erillisen ajastimen, jonka kesto on 5 minuuttia. väli:

local tmr2 = Ajastin: uusi {interval = 5*60*1000, func = function ()

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

Vaihe 5: WiFi -ohjaus: ON/OFF

WiFi -ohjaus: ON/OFF
WiFi -ohjaus: ON/OFF

Tähän asti olimme saaneet vain tietoja laitteesta, yritä hallita sitä!

blynk: päällä ("V20", toiminto (param)

jos param [1] == "1", niin os.execute ("wifi up") else os.execute ("wifi down") end end)

Sovelluspuolella lisäsin juuri painike -widgetin (tila: kytkin) ja annoin sen V20: lle.

Se siitä. Hämmästyttävä.

Vaihe 6: Järjestelmätilastotaulukko

Järjestelmätilastot
Järjestelmätilastot
Järjestelmätilastot
Järjestelmätilastot

funktio getCpuLoad ()

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

Meidän on myös lähetettävä tiedot Blynkille (käytämme tmr1: tä uudelleen):

paikallinen tmr1 = Ajastin: uusi {interval = 5000, func = function ()

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

Lisää sovelluksen puolella SuperChart -widget. Lisää suorittimen, RAM -datavirtoja ja määritä V5, V6.

Vaihe 7: Kiintolevyn kehruutila

Reitittimessäni on ulkoinen kiintolevyasema, joka on kytketty verkkoon liitettyyn tallennuslaitteeseen. Tämä asema on määritetty aloittamaan pyöriminen, kun joku käyttää sitä, ja pysähtymään aikakatkaisun jälkeen.

Ilmeisesti olisi hienoa tietää, kuinka monta kertaa se käynnistyy päivän aikana. Joten lisäsin toisen tietovirran järjestelmäkaaviooni.

On hieman hankalampaa saada kiintolevyaseman tila, mutta löysin tavan! Asenna ensin smartmontools SSH -konsolista:

opkg päivitys

opkg asentaa smartmontools

Sitten koodissamme meidän on suoritettava erityinen komento ja tarkistettava poistumiskoodi:

funktio exec_ret (cmd)

local exit = os.execute (cmd) print ("Suorita:"..cmd.. " -> exit:".. exit) palaa poistuminen lopetusfunktio getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 ja palauta sitten 1 muu palauta 0 loppu

Huomautus: kiintolevyni on /dev /sda

Vaihe 8: Verkkotoimintakaavio

Verkkotoiminnan kaavio
Verkkotoiminnan kaavio

Luomme toisen SuperChart -widgetin (samanlainen kuin edellinen), lisäämme TX- ja RX -tietovirrat ja määritämme V1: lle ja V2: lle.

Aputoiminnot:

funktio getWanRxBytes ()

return tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) lopetusfunktio getWanTxBytes () palauta tonumber (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) loppu

Lisää seuraavaksi koodia samaan tmr1: een. Tämä on monimutkaisempaa, koska meidän tarvitsee vain laskea ja näyttää lähetettyjen/vastaanotettujen tavujen ero:

paikallinen prevTx, prevRx

local tmr1 = Ajastin: uusi {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 sitten blynk: virtualWrite (2, rx - prevRx) end prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning)) loppu}

Vaihe 9: Ilmoitukset

Ilmoitukset
Ilmoitukset

Halusin myös saada ilmoituksen, kun reitittimeni katkaisee virran tai Internet -yhteyden. Tätä varten tarvitsemme Ilmoitus -widgetin.

Ota widget -asetuksissa käyttöön "offline -ilmoitus". Koodia ei tarvita. Mutta voimme myös lähettää mukautettuja ilmoituksia koodistamme.

Vaihe 10: Automaattinen käynnistys taustalla

Tällä hetkellä komentosarja on suoritettava manuaalisesti, mutta haluan saada sen toimimaan taustalla automaattisesti, kun reititin käynnistetään.

Tämä tehdään luomalla palvelu. Luo tiedosto /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; sitten echo "blynkmon jo käynnissä" exit 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {if [! -f $ pidfile]; sitten kaiku "blynkmon ei käynnissä" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Huomaa: älä unohda vaihtaa auth-tunnusta

Ota sitten blynkmon -palvelu käyttöön:

palvelu blynkmon käyttöön

Vaihe 11: Johtopäätös ja muita ideoita

Johtopäätös ja muita ideoita
Johtopäätös ja muita ideoita

Voit skannata tämän QR -koodin saadaksesi Blynk -projektini kloonin. Se vaatii joitakin energiapisteitä (4600), koska se käyttää paljon widgettejä!

Löydät koko Lua -koodin täältä:

Toistaiseksi hyvä, mutta tässä on joitain ideoita, joita haluan lisätä lähitulevaisuudessa.

  • Lisää Käynnistä uudelleen -komento. Vältä sen napsauttamista vahingossa.
  • Lisää Terminal -widget suorittaaksesi minkä tahansa linux -komennon.
  • Lisää suorittimen lämpötilakaavio.

    UPD: Valitettavasti OpenWrtistä puuttuu tällä hetkellä ajureita reitittimelleni. Mutta se on saatavilla monille muille reitittimille

  • Lisää ilmoitus, kun tietty laite liittyy verkkoon tai poistuu siitä. Meillä on jo arp -tiedot, tarkista nyt vain MAC -osoite.

Tällä tavalla voimme valvoa ja ohjata 3D -tulostimia, robotteja, tavallista PC/kannettavaa tietokonetta, Arduino/ESP8266/ESP32/RaspberryPi -kamaa, Smart Home -laitteita ja käytännössä mitä tahansa ympärilläsi. Kerro minulle, jos sinulla on muita mielenkiintoisia ideoita. Mitä mieltä olet tästä kaikesta?

Suositeltava: