İçindekiler:

OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması: 11 Adım
OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması: 11 Adım

Video: OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması: 11 Adım

Video: OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması: 11 Adım
Video: Ethernet Kablosu Takılı internet Yok %100 Çözüm #shorts #internet 2024, Kasım
Anonim
OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması
OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması
OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması
OpenWrt Yönlendiricinize Uzaktan Erişmek için Android/iOS Uygulaması

Geçenlerde yeni bir yönlendirici (Xiaomi Mi Router 3G) satın aldım. Ve elbette, bu yeni, harika donanım parçası, bu proje üzerinde çalışmaya başlamam için bana ilham verdi;)

Adım 1: Zaten OpenWrt'e Sahip Olduğunuzu Varsayıyorum…

Zaten OpenWrt'e Sahip Olduğunuzu Varsayalım…
Zaten OpenWrt'e Sahip Olduğunuzu Varsayalım…

Önce OpenWrt'i kurmam gerekiyordu… Çoğunlukla bu kılavuzu takip ettim (bu yönlendirici modeline özel):https://dzone.com/articles/hacking-into-xiaomi-mi-…Bunun üzerinde çalışırken bu harika videoyu buldum: Openwrt kurulumu, WiFi benchmark, Girlfriend Flashing. Wow çok güldüm!:)

Dikkat! OpenWrt'i yüklemek yönlendiricinizi engelleyebilir. Ancak tamamlandığında, tam güç ve kontrolün kilidini açar. Her yönlendirici modeli için farklı olabileceğinden, burada herhangi bir talimat verecek kadar cesur değilim.

Ancak yönlendiricinizde zaten OpenWrt varsa, bu eğitime hemen başlayabilirsiniz

BTW, Onion Omega, VoCore, LinkIt Smart 7688 ve diğerleri gibi bazı geliştirme kartları OpenWrt ile birlikte gelir. Bu eğitim ayrıca, bu tür uygulamaları oluşturmanın ardındaki bazı temel fikirleri açıklar, böylece onu Raspberry Pi ve benzerleriyle çalışmaya kolayca uyarlayabilirsiniz.

Bu proje için çoğunlukla önceden yüklenmiş yazılımı kullanacağım (herhangi bir OpenWrt özellikli yönlendiricide bulunur). Ancak bazı gelişmiş işlevler için ek paketler yüklemem gerekiyordu. Bu sadece birkaç tıklamayla yapılır, bu yüzden talimatları buraya ekleyeceğim.

Ayrıca, zaten bildiğinizi varsayıyorum:

  • OpenWrt yönlendiricinize SSH terminali nasıl açılır/kullanılır
  • Yönlendiricinize dosyalar nasıl yüklenir/düzenlenir (FileZilla veya scp/sftp kullanın)
  • Linux konsolu ile nasıl çalışılır

2. Adım: Yazılım ve Araçlar

Yazılım ve Araçlar
Yazılım ve Araçlar

Akıllı telefon tarafında Blynk kullanıyorum. Herhangi bir donanımı kontrol etmek için iOS ve Android uygulamaları sağlar. Widget'ları doğrudan akıllı telefonunuzdan sürükleyip bırakarak tüm projeleriniz için kolayca güzel grafik arayüzler oluşturabilirsiniz. Blynk çoğunlukla Arduino, Raspberry Pi vb. ile kullanılır. Ama neden yönlendiricinin kendisinde çalıştırmıyorsunuz?;)

Cihaz tarafında, gerekli işlevselliği kodlamak için Lua kullanacağım. Python veya Node.js de kullanabilirim, ancak ne yazık ki bu seçenekler, bazı yönlendiricilerdeki kaynak eksikliğinden dolayı her zaman mevcut değildir. Veya C/C++, ancak (her değişiklik için yeniden derleme, vb.) ile çalışmak çok uygun değildir. Öte yandan, Lua önceden yüklenmiştir, kullanımı ve öğrenmesi kolaydır. Varsayılan web arayüzü LuCI tarafından kullanılır.

3. Adım: Minimal Bir Uygulama Oluşturma

Blynk ve Lua'yı kullanmaya başlamak şu kadar kolay:

  • Blynk Uygulamasını indirin (App Store, Google Play'den)
  • Yeni bir proje oluşturun ve Auth Token'ı alın
  • OpenWrt için Blynk Lua kurulum talimatlarını izleyin.

Yönlendirici konsolunuza erişmek için SSH kullanın. Varsayılan örneği çalıştırdıktan sonra:

lua./examples/client.lua

Bunun gibi bir şey görmeliyiz:

Bağlanıyor…

SSL anlaşması… Hazır.

Bu, uygulamaya güvenli, çift yönlü bağlantı kurulduğu anlamına gelir! YAY!

Şimdi sağlanan örneği kolayca genişletebiliriz, böylece ilginç bir şey yapar. Düzenlemek için bu örneğin bir kopyasını oluşturdum:

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

Adım 4: Bazı Bilgilerin Eklenmesi: İstemci Sayısı, WAN IP Adresi, Çalışma Süresi

Temel fikir, işletim sisteminden periyodik olarak bilgi almak, gerekirse bazı basit hesaplamalar yapmak ve ardından sonucu görüntülemek için Blynk'e göndermektir.

Linux/OpenWrt'de sistem verilerini almanın birkaç yolu vardır:

  • Bir komut çalıştırın ve çıkardığı metni ayrıştırın
  • Bir komut çalıştırın ve döndürdüğü çıkış kodunu izleyin
  • /proc/ ve /sys/class/ dizinlerinde bulunan bir sistem dosyasını okuyun

Şimdi bağlı cihazların sayısını görüntülemek istiyorum.

Konsolda cat /proc/net/arp çalıştırdığımda, MAC ve IP adresleriyle birlikte bilinen cihazların listesini çıkarıyor:

IP adresi HW tipi Bayraklar HW adresi Maske Cihaz

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

Doğrudan Lua'da ayrıştırabiliriz, ancak özel yardımcı programları kullanmak genellikle daha kolaydır. Linux'ta bunlar grep, head, tail, cut, wc, awk'dir.

Arp çıktısından istemci sayısını almak için tabloyu filtrelemem (ilgisiz öğeleri kaldırmam) ve aşağıdaki komutla sonuçlanan tablo satırlarını saymam gerekiyor:

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

Hadi deneyelim:

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

1

Harika. Artık gerekli tüm bilgileri nasıl toplayabileceğimiz fikrine sahibiz. Hadi otomatikleştirelim. Kodumuzu temiz ve genişletilebilir hale getirmek için bazı yardımcı işlevler oluşturalım:

fonksiyon exec_out(cmd)

local file = io.popen(cmd) dosya değilse, o zaman nil end local output değerini döndürün: file:read('*all') file:close() print("Çalıştır: "..cmd.." -> ".. çıktı) çıktı döndür bitiş işlevi read_file(path) local file = io.open(path, "rb") dosya değilse, o zaman nil end local içerik döndür = dosya:oku "*a" file:close() print("Oku: "..path.." -> "..content) içerik sonu döndürür

Bu yardımcı programları kullanarak artık gerçek veri alma işlevlerini uygulayabiliriz:

function getArpClients()

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

Nasıl çalıştığını daha iyi anlamak ve ihtiyaçlarınıza göre ayarlamak için bu kabuk komutlarının bölümlerini çalıştırabilirsiniz.

En kolay kısım, verileri Blynk Uygulamasına göndermektir. Varsayılan örnek, her 5 saniyede bir kod çalıştıran zamanlayıcıyı zaten ayarlar, bu yüzden onu yeniden kullanırız:

yerel tmr1 = Zamanlayıcı:yeni{aralık = 5000, işlev = işlev()

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

Uygulamada 3 etiket widget'ı ekliyoruz ve buna göre Sanal Pinlere 10, 11, 12 atadık.

Bu çalışırken, WAN IP'si veya istemci sayısı çok sık güncellenmediğinden oldukça verimsizdir. Bunu düzeltelim

WAN IP için onu bağlı işleyiciye taşıyoruz. Yönlendirici, Blynk Cloud ile her bağlantı kurduğunda çalıştırılacaktır. Bu yeterli olmalıdır:

blynk:on("bağlı", function()

print("Hazır.") blynk:virtualWrite(12, getWanIP()) sonu)

Uptime ve Clients Number için 5 dk ile ayrı bir timer oluşturuyoruz. Aralık:

yerel tmr2 = Zamanlayıcı:yeni{aralık = 5*60*1000, işlev = işlev()

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

Adım 5: WiFi Kontrolü: AÇIK/KAPALI

WiFi Kontrolü: AÇIK/KAPALI
WiFi Kontrolü: AÇIK/KAPALI

Şu ana kadar cihazdan sadece bazı bilgiler alıyorduk. Kontrol etmeyi deneyelim!

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

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

Uygulama tarafında, bir Düğme widget'ı (mod: Anahtar) ekledim ve onu V20'ye atadım.

Bu kadar. İnanılmaz.

Adım 6: Sistem İstatistikleri Tablosu

Sistem İstatistikleri Tablosu
Sistem İstatistikleri Tablosu
Sistem İstatistikleri Tablosu
Sistem İstatistikleri Tablosu

işlev getCpuLoad()

dönüş tonumber(exec_out("top -bn1 | grep 'CPU:' | head -n1 | awk '{print $2+$4}'")) end function getRamUsage() return tonumber(exec_out("ücretsiz | grep Mem | awk ') {baskı (3-$7$/$2 * 100.0}'")) bitiş

Ayrıca verileri Blynk'e göndermemiz gerekiyor (tekrar tmr1 kullanalım):

yerel tmr1 = Zamanlayıcı:yeni{aralık = 5000, işlev = işlev()

blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) bitiş}

Uygulama Tarafında, SuperChart widget'ını ekleyin. CPU, RAM veri akışları ekleyin ve V5, V6'ya atayın.

7. Adım: HDD Dönme Durumu

Yönlendiricimin, Ağa Bağlı Depolama aygıtı olarak bağlı harici bir HDD sürücüsü var. Mesele şu ki, bu sürücü, birisi ona eriştiğinde dönmeye başlayacak ve bir zaman aşımından sonra askıya alınacak şekilde yapılandırılmıştır.

Açıkçası, bir gün boyunca kaç kez açıldığını bilmek harika olurdu. Bu yüzden Sistem grafiğime başka bir veri akışı ekledim.

HDD sürücüsünün durumunu almak biraz daha zor ama bir yol buldum! Her şeyden önce, SSH konsolundan smartmontools'u kurun:

opkg güncellemesi

opkg smartmontools'u kurun

Ardından kodumuzda özel bir komut çalıştırmamız ve çıkış kodunu kontrol etmemiz gerekiyor:

fonksiyon exec_ret(cmd)

yerel çıkış = os.execute(cmd) print("Çalıştır: "..cmd.." -> çıkış:"..exit) exec_ret("smartctl --nocheck=standby --info ise) çıkış bitiş işlevi getHddSpinning() döndür /dev/sda > /dev/null") == 0 sonra 1 döndürür, aksi takdirde 0 döndürür

Not: HDD'm /dev/sda

Adım 8: Ağ Etkinliği Tablosu

Ağ Aktivite Tablosu
Ağ Aktivite Tablosu

Başka bir SuperChart widget'ı oluşturuyoruz (bir öncekine benzer), TX ve RX veri akışlarını ekliyor ve V1 ve V2'ye atadık. Not: WAN bağlantı noktası statc'sini görüntülemek istiyorum ve WAN bağlantı noktam eth0.2

Yardımcı fonksiyonlar:

işlev getWanRxBytes()

dönüş tonumber(read_file("/sys/class/net/eth0.2/statistics/rx_bytes")) bitiş işlevi getWanTxBytes() dönüş tonumber(read_file("/sys/class/net/eth0.2/statistics/tx_bytes")) son

Ardından, aynı tmr1'e biraz kod ekleyin. Bu, yalnızca iletilen/alınan baytlardaki farkı hesaplamamız ve görüntülememiz gerektiğinden daha karmaşıktır:

yerel prevTx, prevRx

local tmr1 = Timer:new{interval = 5000, func = function() local tx = getWanTxBytes() local rx = getWanRxBytes() eğer prevTx ve prevTx ~= tx ise blynk:virtualWrite(1, tx - prevTx) prevRx ise end ve prevRx ~= rx sonra blynk:virtualWrite(2, rx - prevRx) end prevTx = tx prevRx = rx blynk:virtualWrite(5, getCpuLoad()) blynk:virtualWrite(6, getRamUsage()) blynk:virtualHdd(S))) son}

9. Adım: Bildirimler

Bildirimler
Bildirimler

Ayrıca Router'ım güç veya internet bağlantısı kesildiğinde haberdar olmak istedim. Bunun için Bildirim widget'ına ihtiyacımız var.

Widget ayarlarında "çevrimdışı bildirimi" etkinleştirin. Kod gerekmez. Ancak kodumuzdan özel bildirimler de gönderebiliriz.

Adım 10: Arka Planda Otomatik Çalıştırma

Şimdilik betiğin manuel olarak yürütülmesi gerekiyor, ancak yönlendirici açıldığında otomatik olarak arka planda çalışmasını istiyorum.

Bu, bir hizmet oluşturarak yapılır. /etc/init.d/blynkmon dosyası oluşturun:

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

START=99 STOP= pidfile="/var/run/blynkmon.pid" start() { if [-f $pidfile]; ardından yankı "blynkmon zaten çalışıyor" çıkış 0 fi cd /root/lua-blynk lua blynkmon.lua kimlik doğrulama belirteciniz > /dev/null & echo $! > $pidfile } stop() { if [! -f $pid dosyası]; sonra yankı "blynkmon çalışmıyor" çıkış 0 fi kill -9 $(cat $pidfile) rm $pidfile }

Not: auth-token'ınızı değiştirmeyi unutmayın

Ardından, blynkmon hizmetini etkinleştirin:

hizmet blynkmon etkinleştir

Adım 11: Sonuç ve Diğer Fikirler

Sonuç ve Diğer Fikirler
Sonuç ve Diğer Fikirler

Blynk Projemin klonunu almak için bu QR'yi tarayabilirsiniz. Çok sayıda widget kullandığı için bazı enerji noktaları (4600) gerektirir!

Tam Lua kodunu burada bulabilirsiniz:https://Gist.github.com/vshymanskyy/3d3388a4e17f44…

Buraya kadar çok iyi ama yakın gelecekte eklemek istediğim bazı fikirler var.

  • Yeniden Başlat komutu ekleyin. Yanlışlıkla üzerine tıklamayı önleyin.
  • Herhangi bir linux komutunu çalıştırmak için Terminal widget'ı ekleyin.
  • CPU sıcaklık tablosu ekleyin.

    UPD: Maalesef OpenWrt şu anda yönlendirici modelim için bazı sürücülere sahip değil. Ancak diğer birçok yönlendirici için kullanılabilir

  • Belirli bir cihaz ağa katıldığında/ayrıldığında bildirim ekleyin. Zaten arp bilgisine sahibiz, şimdi yalnızca MAC adresini kontrol edin.

Bu şekilde, 3D Yazıcıları, Robotları, normal bir PC/Dizüstü Bilgisayarı, Arduino/ESP8266/ESP32/RaspberryPi öğelerini, Akıllı Ev cihazlarını ve neredeyse her şeyi izleyebilir ve kontrol edebiliriz. Başka ilginç fikirleriniz varsa bana bildirin. Tüm bunlar hakkında ne düşünüyorsunuz?

Önerilen: