Оглавление:

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

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

Видео: Приложение Android / iOS для удаленного доступа к маршрутизатору OpenWrt: 11 шагов
Видео: Шаг 10. Настройка доступа со смартфона и планшета 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, прошивка подруги. Ух ты, я так смеялся!:)

Внимание! Установка 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: Добавление информации: количество клиентов, IP-адрес WAN, время работы

Основная идея состоит в том, чтобы периодически получать информацию от ОС, при необходимости выполнять некоторые простые вычисления, а затем отправлять результат в Blynk для отображения.

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

  • Запустите команду и проанализируйте выводимый ею текст
  • Запустите команду и посмотрите, какой код выхода она возвращает.
  • Прочтите системный файл, расположенный в каталогах / proc / и / sys / class /

Теперь я хочу отобразить количество подключенных устройств.

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

IP-адрес Тип аппаратного обеспечения Флаги Аппаратный адрес Маска устройства

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 * бр-лан

Мы можем разобрать его прямо в Lua, но часто проще использовать специализированные утилиты. В Linux это grep, head, tail, cut, wc, awk.

Чтобы получить количество клиентов из вывода arp, мне нужно отфильтровать таблицу (удалить несвязанные элементы) и подсчитать строки таблицы, что приводит к следующей команде:

cat / proc / net / arp | grep br-lan | grep 0x2 | туалет -l

Давай попробуем:

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

1

Большой. Теперь мы понимаем, как собрать всю необходимую информацию. Давайте автоматизируем это. Чтобы сделать наш код чистым и расширяемым, давайте создадим несколько вспомогательных функций:

функция exec_out (cmd)

local file = io.popen (cmd) если не файл, то вернуть nil end local output = file: read ('* all') file: close () print ("Run:"..cmd.. "->".. output) return output end function read_file (path) local file = io.open (path, "rb") если не файл, то вернуть nil end local content = file: read "* a" file: close () print ("Read: "..path.." -> "..content) return content end

Используя эти утилиты, теперь мы можем реализовать фактические функции выборки данных:

функция 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

Вы можете запускать части этих команд оболочки, чтобы лучше понять, как они работают, и настроить их в соответствии с вашими потребностями.

Самая простая часть - отправить данные в приложение Blynk. В примере по умолчанию уже установлен таймер, который запускает некоторый код каждые 5 секунд, поэтому мы просто используем его повторно:

local tmr1 = Таймер: новый {интервал = 5000, func = function ()

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

В приложении мы добавляем 3 виджета меток и назначаем их виртуальным контактам 10, 11, 12 соответственно.

Хотя это работает, это довольно неэффективно, так как WAN IP или количество клиентов обновляются не так часто. Давайте исправим это

Для WAN IP мы перемещаем его в подключенный обработчик. Он будет запускаться каждый раз, когда маршрутизатор устанавливает соединение с Blynk Cloud. Этого должно быть достаточно:

blynk: on ("подключен", function ()

print ("Готово.") blynk: virtualWrite (12, getWanIP ()) end)

Для Uptime и количества клиентов мы создаем отдельный таймер на 5 мин. интервал:

local tmr2 = Таймер: новый {интервал = 5 * 60 * 1000, func = function ()

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

Шаг 5: Управление WiFi: ВКЛ / ВЫКЛ

Управление Wi-Fi: ВКЛ / ВЫКЛ
Управление Wi-Fi: ВКЛ / ВЫКЛ

До сих пор мы получали только некоторую информацию с устройства, давайте попробуем управлять им!

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

if param [1] == "1", то os.execute ("Wi-Fi включен") иначе os.execute ("Wi-Fi отключен") конец конец)

Что касается приложения, я просто добавил виджет Button (режим: Switch) и назначил его 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):

local tmr1 = Таймер: новый {интервал = 5000, func = function ()

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

На стороне приложения добавьте виджет SuperChart. Добавьте потоки данных CPU, RAM и назначьте V5, V6.

Шаг 7: Статус вращения жесткого диска

В моем маршрутизаторе есть внешний жесткий диск, подключенный как сетевое устройство хранения данных. Дело в том, что этот диск настроен на запуск вращения, когда кто-то обращается к нему, и на приостановку после тайм-аута.

Очевидно, было бы круто узнать, сколько раз он включается в течение дня. Поэтому я добавил еще один поток данных в свою системную диаграмму.

Получить статус жесткого диска немного сложнее, но я нашел способ! Прежде всего, установите smartmontools из консоли SSH:

обновление opkg

opkg установить smartmontools

Затем в нашем коде нам нужно запустить специальную команду и проверить код выхода:

функция exec_ret (cmd)

local exit = os.execute (cmd) print ("Run:"..cmd.. "-> exit:".. exit) return exit end function getHddSpinning () if exec_ret ("smartctl --nocheck = standby --info / dev / sda> / dev / null ") == 0 затем вернуть 1 иначе вернуть 0 конец конец

Примечание: мой жесткий диск / dev / sda

Шаг 8: Диаграмма сетевой активности

График сетевой активности
График сетевой активности

Мы создаем еще один виджет SuperChart (аналогичный предыдущему), добавляем потоки данных TX и RX и назначаем их V1 и V2. Примечание: я хочу отобразить statc порта WAN, а мой порт WAN - eth0.2.

Вспомогательные функции:

функция 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")) конец

Затем добавьте код в тот же файл tmr1. Это более сложно, поскольку нам нужно только вычислить и отобразить разницу в переданных / полученных байтах:

местный prevTx, prevRx

local tmr1 = Timer: new {interval = 5000, func = function () local tx = getWanTxBytes () local rx = getWanRxBytes () если prevTx и prevTx ~ = tx, то blynk: virtualWrite (1, tx - prevTx) end, если prevRx и prevRx ~ = rx, затем blynk: virtualWrite (2, rx - prevRx) end prevTx = tx prevRx = rx blynk: virtualWrite (5, getCpuLoad ()) blynk: virtualWrite (6, getRamUsage ()) blynk: virtualWrite (7, getddSpin)) конец}

Шаг 9: Уведомления

Уведомления
Уведомления

Я также хотел получать уведомления, когда мой маршрутизатор теряет питание или подключение к Интернету. Для этого нам понадобится виджет уведомлений.

В настройках виджета включите «офлайн-уведомление». Код не нужен. Но мы также можем отправлять настраиваемые уведомления из нашего кода.

Шаг 10: Автозапуск в фоновом режиме

На данный момент сценарий должен выполняться вручную, но я хочу, чтобы он работал в фоновом режиме автоматически при включении маршрутизатора.

Это делается путем создания сервиса. Создайте файл /etc/init.d/blynkmon:

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

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

Примечание: не забудьте заменить your-auth-token

Затем включите службу blynkmon:

сервис blynkmon включить

Шаг 11: Заключение и дальнейшие идеи

Заключение и дальнейшие идеи
Заключение и дальнейшие идеи

Вы можете отсканировать этот QR, чтобы получить клон моего проекта Blynk. Он требует некоторых энергетических очков (4600), так как он использует множество виджетов!

Полный код Lua можно найти здесь:

Пока все хорошо, но вот несколько идей, которые я хотел бы добавить в ближайшем будущем.

  • Добавить команду перезагрузки. Предотвратите случайное нажатие на нее.
  • Добавьте виджет терминала для запуска любой команды Linux.
  • Добавьте график температуры процессора.

    UPD: К сожалению, в OpenWrt на данный момент отсутствуют некоторые драйверы для моей модели роутера. Но он доступен для многих других роутеров.

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

Таким образом, мы можем отслеживать и управлять 3D-принтерами, роботами, обычным ПК / ноутбуком, Arduino / ESP8266 / ESP32 / RaspberryPi, устройствами умного дома и практически всем вокруг. Дайте мне знать, если у вас появятся другие интересные идеи. Что вы думаете обо всем этом?

Рекомендуемые: