Оглавление:
- Шаг 1: Я предполагаю, что у вас уже есть OpenWrt…
- Шаг 2. Программное обеспечение и инструменты
- Шаг 3. Создание минимального приложения
- Шаг 4: Добавление информации: количество клиентов, IP-адрес WAN, время работы
- Шаг 5: Управление WiFi: ВКЛ / ВЫКЛ
- Шаг 6: диаграмма системной статистики
- Шаг 7: Статус вращения жесткого диска
- Шаг 8: Диаграмма сетевой активности
- Шаг 9: Уведомления
- Шаг 10: Автозапуск в фоновом режиме
- Шаг 11: Заключение и дальнейшие идеи
Видео: Приложение Android / iOS для удаленного доступа к маршрутизатору OpenWrt: 11 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
Недавно купил новый роутер (Xiaomi Mi Router 3G). И, конечно же, это новое замечательное оборудование вдохновило меня начать работу над этим проектом;)
Шаг 1: Я предполагаю, что у вас уже есть 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: ВКЛ / ВЫКЛ
До сих пор мы получали только некоторую информацию с устройства, давайте попробуем управлять им!
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, устройствами умного дома и практически всем вокруг. Дайте мне знать, если у вас появятся другие интересные идеи. Что вы думаете обо всем этом?
Рекомендуемые:
Как превратить Raspberry Pi в шлюз удаленного доступа: 6 шагов
Как превратить Raspberry Pi в шлюз удаленного доступа: Привет, ребята! В свете последних событий наша команда из remote.it усердно работала над мозговой атакой, чтобы сделать удаленную работу безболезненной и доступной. Мы придумали образ SD-карты remote.itPi, который представляет собой SD-карту, которую вы можете вставить в новую
Как создать приложение для Android с помощью Android Studio: 8 шагов (с изображениями)
Как создать приложение для Android с помощью Android Studio: это руководство научит вас основам создания приложения для Android с помощью среды разработки Android Studio. По мере того как устройства Android становятся все более распространенными, спрос на новые приложения будет только расти. Android Studio проста в использовании (
Доска для рисования со светодиодной подсветкой Bluetooth и приложение для iOS: 9 шагов (с изображениями)
Доска для рисования светодиодов Bluetooth и приложение для iOS: в этом руководстве вы сможете создать плату светодиодов Bluetooth, которая может рисовать изображения из созданного нами приложения для iPhone. В этом приложении пользователи смогут создать игру Connect 4, которая также будет отображаться на этой игровой доске. Это будет ч
Приложение Proximity Photo Sharing для iOS: 6 шагов
Приложение для iOS для обмена фотографиями на близком расстоянии: в этом руководстве мы создадим приложение для iOS со Swift, которое позволит вам обмениваться фотографиями с кем угодно поблизости без необходимости сопряжения устройств. Мы будем использовать Chirp Connect для отправки данных с использованием звука и Firebase для хранения изображений в закрытом
Как превратить сотовый телефон LG EnV 2 в портативный модем удаленного доступа для ноутбука (или настольного компьютера): 7 шагов
Как превратить свой сотовый телефон LG EnV 2 в портативный модем для коммутируемого доступа для вашего ноутбука (или настольного компьютера): нам всем когда-то приходилось использовать Интернет там, где это было просто невозможно, например, в машине или в отпуске, когда они берут дорогостоящую сумму денег в час за использование своего Wi-Fi. наконец, я придумал простой способ получить