Съдържание:

Приложение Android/iOS за отдалечен достъп до вашия маршрутизатор OpenWrt: 11 стъпки
Приложение Android/iOS за отдалечен достъп до вашия маршрутизатор OpenWrt: 11 стъпки

Видео: Приложение Android/iOS за отдалечен достъп до вашия маршрутизатор OpenWrt: 11 стъпки

Видео: Приложение Android/iOS за отдалечен достъп до вашия маршрутизатор OpenWrt: 11 стъпки
Видео: Как исправить бесконечное «Получение IP-адреса» Wi-Fi на Android \ Исправляем - ожидание сети Wi-Fi 2024, Ноември
Anonim
Приложение за Android/iOS за отдалечен достъп до вашия рутер OpenWrt
Приложение за Android/iOS за отдалечен достъп до вашия рутер OpenWrt
Приложение Android/iOS за отдалечен достъп до вашия маршрутизатор OpenWrt
Приложение Android/iOS за отдалечен достъп до вашия маршрутизатор OpenWrt

Наскоро си купих нов рутер (Xiaomi Mi Router 3G). И разбира се, този нов, страхотен хардуер ме вдъхнови да започна да работя по този проект;)

Стъпка 1: Предполагам, че вече имате OpenWrt…

Предполагам, че вече имате OpenWrt…
Предполагам, че вече имате OpenWrt…

Първо трябваше да инсталирам OpenWrt … Най-вече следвах това ръководство (специфично за този модел рутер): https://dzone.com/articles/hacking-into-xiaomi-mi-… Докато работех върху това, открих това страхотно видео: Openwrt инсталация, WiFi бенчмарк, Girlfriend Flashing. Как се разсмях толкова силно!:)

Внимание! Инсталирането на OpenWrt може да затрудни вашия рутер. Но след като приключи, той отключва пълна мощност и контрол. Не съм достатъчно смел да предоставям инструкции тук, тъй като те може да са различни за всеки модел рутер.

Но ако вече имате OpenWrt на вашия рутер, ще можете да започнете с този урок след време

Между другото, някои дъски за разработка се предлагат с OpenWrt извън кутията, като Onion Omega, VoCore, LinkIt Smart 7688 и други. Този урок също обяснява някои основни идеи зад създаването на такива приложения, така че лесно можете да го адаптирате за работа с Raspberry Pi и подобни.

За този проект ще използвам най-вече предварително инсталиран софтуер (наличен на всеки маршрутизатор, поддържащ OpenWrt). Но за някои разширени функции трябваше да инсталирам допълнителни пакети. Това става само с няколко кликвания, затова ще включа инструкциите тук.

Също така предполагам, че вече знаете:

  • Как да отворите/използвате SSH терминал към вашия OpenWrt рутер
  • Как да качвате/редактирате файлове на вашия рутер (използвайте FileZilla или scp/sftp)
  • Как да работите с Linux конзола

Стъпка 2: Софтуер и инструменти

Софтуер и инструменти
Софтуер и инструменти

От страна на смартфона използвам Blynk. Той предоставя приложения за iOS и Android за контрол на всеки хардуер. Можете лесно да изградите красиви графични интерфейси за всичките си проекти, като просто плъзнете и пуснете джаджи направо на вашия смартфон. Blynk се използва най -вече с Arduino, Raspberry Pi и т.н. Но защо не го стартирате на самия рутер?;)

От страна на устройството ще използвам Lua за скрипт на необходимата функционалност. Мога да използвам и Python или Node.js, но за съжаление тези опции не винаги са налични поради липса на ресурси на някои рутери. Или C/C ++, но не е толкова удобно да работите (прекомпилирайте за всяка промяна и т.н.) От друга страна, Lua е предварително инсталиран, лесен за използване и учене. Използва се от уеб интерфейса по подразбиране LuCI.

Стъпка 3: Създаване на минимално приложение

Първите стъпки с Blynk и Lua са толкова лесни, колкото:

  • Изтеглете приложението Blynk (от App Store, Google Play)
  • Създайте нов проект и вземете токен за удостоверяване
  • Следвайте инструкциите за инсталиране на Blynk Lua за OpenWrt.

Използвайте SSH за достъп до конзолата на рутера. След стартиране на примера по подразбиране:

lua./examples/client.lua

Трябва да видим нещо подобно:

Свързва се…

SSL ръкостискане … Готов.

Което означава, че сигурната двупосочна връзка с приложението е установена! ДА!

Вече можем лесно да разширим предоставения пример, така че да направи нещо интересно. Създадох копие на този пример, за да го редактирам:

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

Стъпка 4: Добавяне на информация: Брой клиенти, WAN IP адрес, време на работа

Основната идея е периодично да получавате информация от операционната система, да извършвате някои прости изчисления, ако е необходимо, и след това да изпращате резултата на Blynk за показване.

В Linux/OpenWrt имаме няколко начина за получаване на системни данни:

  • Изпълнете команда и анализирайте текста, който извежда
  • Изпълнете команда и гледайте кода за излизане, който тя връща
  • Прочетете системния файл, разположен в/proc/и/sys/class/директории

Сега искам да покажа броя на свързаните устройства.

Когато стартирам cat/proc/net/arp на конзолата, той извежда списъка с известни устройства, заедно с техните MAC и IP адреси:

IP адрес HW тип Флагове HW адрес Маска Устройство

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

Можем да го анализираме директно в Lua, но често е по -лесно да използваме специализирани помощни програми. В Linux това са grep, head, tail, cut, wc, awk.

За да получа брой клиенти от arp изход, трябва да филтрирам таблицата (да премахна несвързани елементи) и да преброя редовете на таблицата, което води до следната команда:

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

Да пробваме:

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

1

Страхотен. Сега получаваме представа как можем да съберем цялата необходима информация. Нека го автоматизираме. За да направим нашия код чист и разширяем, нека създадем някои помощни функции:

функция exec_out (cmd)

локален файл = io.popen (cmd) ако не е файл, тогава връща нулев край локален изход = файл: четене ('*всички') файл: close () print ("Изпълнение:"..cmd.. " ->".. изход) връщане изход край функция read_file (пътека) локален файл = io.open (път, "rb") ако не файл, тогава връщане нула край локално съдържание = файл: прочетете "*a" файл: close () print ("Прочетете: "..path.." -> "..content) връщане на съдържанието край

Използвайки тези помощни програми, вече можем да реализираме действителните функции за извличане на данни:

функция getArpClients ()

return tonumber (exec_out ("cat/proc/net/arp | grep br -lan | grep 0x2 | wc -l")) крайна функция getUptime () връщане към номер (exec_out ("cat/proc/uptime | awk '{print $ 1 } '")) крайна функция getWanIP () връщане exec_out (" ifconfig eth0.2 | grep' inet addr: '| cut -d: -f2 | awk' {print $ 1} '") end

Можете да изпълнявате части от тези команди на обвивката, за да разберете по -задълбочено как работи и да я настроите според вашите нужди.

Най -лесната част е изпращането на данните към приложението Blynk. Примерът по подразбиране вече настройва таймера, който изпълнява някакъв код на всеки 5 секунди, така че просто го използваме отново:

локален tmr1 = Таймер: нов {интервал = 5000, func = функция ()

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

В приложението добавяме 3 джаджи за етикети и съответно ги присвояваме на Virtual Pins 10, 11, 12.

Въпреки че това работи, това е доста неефективно, тъй като WAN IP или броят на клиентите не се актуализират толкова често. Нека поправим това

За WAN IP го преместваме в свързания манипулатор. Той ще се изпълнява всеки път, когато маршрутизаторът установи връзка с Blynk Cloud. Това трябва да е достатъчно:

blynk: on ("свързан", функция ()

print ("Готов.") blynk: virtualWrite (12, getWanIP ()) край)

За време на работа и брой клиенти създаваме отделен таймер с 5 минути. интервал:

локален tmr2 = Таймер: нов {интервал = 5*60*1000, func = функция ()

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

Стъпка 5: WiFi контрол: ВКЛ./ИЗКЛ

WiFi контрол: ВКЛ./ИЗКЛ
WiFi контрол: ВКЛ./ИЗКЛ

Досега получавахме само малко информация от устройството. Нека се опитаме да го контролираме!

blynk: on ("V20", функция (параметър)

ако param [1] == "1", тогава os.execute ("wifi up") иначе os.execute ("wifi down") end end)

От страна на приложението току -що добавих джаджа за бутони (режим: Превключване) и я назначих на V20.

Това е. Удивително.

Стъпка 6: Диаграма на системната статистика

Диаграма на системната статистика
Диаграма на системната статистика
Диаграма на системната статистика
Диаграма на системната статистика

функция getCpuLoad ()

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

Също така трябва да изпратим данните до Blynk (нека използваме tmr1 отново):

локален tmr1 = Таймер: нов {интервал = 5000, func = функция ()

blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) край}

От страна на приложението добавете джаджа SuperChart. Добавете потоци от данни на процесора, RAM и задайте на V5, V6.

Стъпка 7: Статус на въртене на твърдия диск

Моят рутер има външно HDD устройство, свързано като мрежово устройство за съхранение. Работата е там, че това устройство е конфигурирано да започне да се върти, когато някой има достъп до него, и да спре след изчакване.

Очевидно би било готино да се знае колко пъти се включва през деня. Затова добавих друг поток от данни към моята системна диаграма.

Малко по -сложно е да получите статуса на HDD устройството, но намерих начин! На първо място, инсталирайте smartmontools от конзолата SSH:

актуализация на opkg

opkg инсталирайте smartmontools

След това в нашия код трябва да изпълним специална команда и да проверим кода за излизане:

функция exec_ret (cmd)

локален изход = os.execute (cmd) печат ("Изпълнение:"..cmd.. " -> изход:".. изход) връщане изход край функция getHddSpinning () ако exec_ret ("smartctl --nocheck = standby --info /dev/sda>/dev/null ") == 0 след това върнете 1 else върнете 0 end end

Забележка: моят HDD е /dev /sda

Стъпка 8: Диаграма на мрежовата активност

Диаграма на мрежовата активност
Диаграма на мрежовата активност

Създаваме друга приспособление SuperChart (подобно на предишната), добавяме потоци от данни TX и RX и възлагаме на V1 и V2. Забележка: Искам да покажа stat WAN порт и моят WAN порт е eth0.2

Помощни функции:

функция getWanRxBytes ()

return tonumber (read_file ("/sys/class/net/eth0.2/statistics/rx_bytes")) крайна функция getWanTxBytes () връщане към номер (read_file ("/sys/class/net/eth0.2/statistics/tx_bytes")) край

След това добавете код към същия tmr1. Това е по -сложно, тъй като трябва само да изчислим и покажем разликата в предадените/получените байтове:

локален prevTx, prevRx

local tmr1 = Timer: new {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () if prevTx и prevTx ~ = tx тогава blynk: virtualWrite (1, tx - prevTx) край, ако prevRx и prevRx ~ = rx след това blynk: virtualWrite (2, rx - prevRx) край prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getHddSpinning (7, getHddSpinning)) край}

Стъпка 9: Известия

Известия
Известия

Също така исках да бъда уведомен, когато моят рутер прекъсне захранването или интернет връзката. За това се нуждаем от джаджа за известия.

В настройките на приспособленията активирайте „офлайн известие“. Не е необходим код. Но също така можем да изпращаме персонализирани известия от нашия код.

Стъпка 10: Автоматично стартиране във фонов режим

Засега скриптът трябва да се изпълнява ръчно, но искам да го направя да работи автоматично във фонов режим при включване на рутера.

Това става чрез създаване на услуга. Създайте файл /etc/init.d/blynkmon:

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

START = 99 STOP = pidfile = "/var/run/blynkmon.pid" start () {if [-f $ pidfile]; след това ехо "blynkmon вече работи" изход 0 fi cd /root /lua-blynk lua blynkmon.lua your-auth-token> /dev /null & echo $! > $ pidfile} stop () {ако [! -f $ pidfile]; след това ехо "blynkmon не работи" exit 0 fi kill -9 $ (cat $ pidfile) rm $ pidfile}

Забележка: не забравяйте да смените вашия-auth-token

След това активирайте услугата blynkmon:

услуга blynkmon активиране

Стъпка 11: Заключение и допълнителни идеи

Заключение и допълнителни идеи
Заключение и допълнителни идеи

Можете да сканирате този QR, за да получите клона на моя проект Blynk, Той изисква някои енергийни точки (4600), тъй като използва много джаджи!

Намерете пълния код на Lua тук:

Дотук добре, но ето няколко идеи, които бих искал да добавя в близко бъдеще.

  • Добавете командата за рестартиране. Предотвратете случайното щракване върху него.
  • Добавете джаджа за терминал, за да изпълните всяка команда на Linux.
  • Добавете диаграма на температурата на процесора.

    UPD: За съжаление на OpenWrt в момента липсват някои драйвери за моя модел рутер. Но той е достъпен за много други рутери

  • Добавете известие, когато определено устройство се присъедини/напусне мрежата. Вече имаме информация за arp, сега проверяваме само MAC адреса.

По този начин можем да наблюдаваме и контролираме 3D принтери, роботи, обикновен компютър/лаптоп, Arduino/ESP8266/ESP32/RaspberryPi, устройства за интелигентен дом и почти всичко наоколо. Кажете ми, ако имате други интересни идеи. Какво мислите за всичко това?

Препоръчано: