Автор - Александр Простак
Программист ООО «СМАРТС-Кванттелеком»
Современный мир интернета вещей (IoT) и смарт-устройств требует гибкости и мощности при управлении сетевым оборудованием. Найти подходящее решение, сочетающее в себе одновременно простоту, надежность и доступность, может быть сложной задачей. Сегодня я хочу рассмотреть одну из таких комбинаций: одноплатный компьютер Orange Pi с операционкой OpenWRT + Python.
Orange Pi – мощная и компактная альтернатива другим одноплатным компьютерам. Он обладает большой вычислительной мощностью, расширяемыми возможностями и множеством интерфейсов. OpenWRT, в свою очередь, легкая и гибкая ОС, специально разработанная для маршрутизаторов и сетевых устройств. ОС предлагает широкие возможности настройки и расширения сетевых функций. Ну и Python – один из самых популярных языков программирования в мире, предоставляет простоту и эффективность для разработки скриптов и автоматизации задач.
Рассмотрим использование Orange Pi с установленной на нем OpenWRT и разработанном на языке Python скрипте. Имея под рукой такие инструменты, попробуем создать собственную сетевую систему управления! В конечном итоге, вы сможете самостоятельно и легко воспроизвести этот пример и адаптировать его под свои нужды, открывая новые возможности в области управления сетевыми устройствами.
Итак, мы имеем:
Orange Pi R1 Plus LTS
Одноплатный ПэКа Orange Pi R1 Plus LTS – оказался под рукой и стал подопытным для реализации проектов, связанных с управлением сетевыми устройствами. Вот некоторые из его особенностей.
Плюсы:
Вычислительная мощь: 4-ядерный проц ARM Cortex-A53 с тактовой частотой до 1.5 ГГц, достаточно неплохая производительность для выполнения различных задач и обработки данных, не только сетевых.
Поддержка сети: на борту Ethernet-порты 10M/100M/1000M Ethernet (YT8531C) и 10M/100M/1000M USB Ethernet (на чипе RTL8153B).
Расширяемость: «О»–пельсинка имеет различные интерфейсы, такие как USB-порт, USB Type-C порт (для питания) и слот для microSD-карт, что существенно прокачивает возможности по расширению и подключению внешних устройств.
Поддержка операционной системы OpenWRT: поддержка OpenWRT – это то, что надо для стабильности и гибкости в управлении сетевыми функциями.
И конечно, цена: хороший баланс между функциональностью и стоимостью, что делает его привлекательным вариантом для любого проекта с ограниченным бюджетом.
Минусы:
Ограниченная поддержка сообщества: по сравнению с некоторыми другими одноплатниками, «О»–пельсинка может иметь весьма ограниченную поддержку в сообществе разработчиков. Не так много доступной документации и не так много рассмотрено решений для некоторых конкретных проблем.
Ограниченное количество портов: хоть они и есть, их может не хватить конкретно для Ваших задач, да и другие одноплатники на этом фоне выглядят солидней.
Использование Orange Pi R1 Plus LTS в связке с операционной системой OpenWRT и скриптами на Python позволяет создать мощную и гибкую сетевую систему управления. Это открывает широкие возможности для реализации различных проектов, связанных с IoT, автоматизацией и сетевой инфраструктурой.
OpenWRT
Многие уже слышали и знают, что это такое, поэтому вкратце: ОС OpenWRT является мощным инструментом для управления сетевыми устройствами и роутерами. Многие умельцы их накатывают на домашние роутеры, существенно расширяющие их функционал. Основные характеристики ОС.
Плюсы:
Гибкость и настраиваемость: OpenWRT предоставляет широкие возможности для настройки и конфигурации сетевых функций. Вы можете выбрать только те компоненты и пакеты, которые вам нужны, и создать оптимальное решение для своих потребностей. Это обеспечивает гибкость и экономию ресурсов.
Активное сообщество и поддержка: OpenWRT имеет большое сообщество разработчиков и пользователей, которые активно вносят вклад в его развитие. Это означает наличие обширной документации, форумов поддержки и регулярных обновлений, что облегчает работу с этой операционкой.
Мощные сетевые возможности: OpenWRT предлагает широкий спектр функций и протоколов для управления сетевыми устройствами, включая маршрутизацию, межсетевое экранирование (firewall), VPN, QoS и другие. Вы можете создавать сложные сетевые конфигурации и обеспечивать высокую степень безопасности и производительности.
Поддержка различных аппаратных платформ: OpenWRT совместима с множеством аппаратных платформ и архитектур, что позволяет использовать её на широком спектре сетевых устройств и роутеров.
Минусы:
Сложность для новичков: изначально OpenWRT может показаться сложной для новичков в области сетевых технологий и Линукса. Требуется некоторое время и изучение, чтобы стать более опытным пользователем и использовать всю мощь этой операционной системы.
Ограниченная поддержка аппаратных устройств: в некоторых случаях, OpenWRT может иметь ограниченную поддержку для некоторых аппаратных устройств и роутеров, особенно для более новых моделей. Это может потребовать дополнительных усилий и времени для обеспечения совместимости.
OpenWRT является рекомендуемой операционкой для одноплатников Orange Pi, включая модель Orange Pi R1 Plus LTS. Создатели Оранжа активно используют и рекомендуют OpenWRT в своих руководствах пользователя. Это подтверждает сочетание надежности и совместимости между OpenWRT и Orange Pi, что обеспечивает стабильную и эффективную работу сетевых устройств.
Python
Пайтон является мощным и мейнстримным языком программирования. Он предоставляет широкие возможности для сетевого взаимодействия. Вот некоторые из его плюсов и минусов, связанных с сетевым программированием.
Плюсы:
Простота использования: Пайтон обладает простым и понятным синтаксисом, который делает его доступным для новичков и упрощает разработку и отладку кода для сетевого взаимодействия.
Богатая стандартная библиотека: Python поставляется с обширной стандартной библиотекой, которая содержит модули и инструменты для работы с различными сетевыми протоколами, включая UDP. Это облегчает разработку сетевых приложений и сокращает время разработки.
Кроссплатформенность: Python поддерживается на различных операционках, что делает его универсальным выбором для создания платформонезависимых сетевых приложений. Вам не придется переписывать код для каждой платформы отдельно.
Поддержка сокетов: Python предоставляет мощный и удобный API для работы с сокетами, что облегчает создание и управление сетевыми соединениями на различных уровнях, включая UDP. Вы можете использовать сокеты для отправки и приема пакетов данных по сети.
Минусы:
Относительная медлительность: Пайтон может быть несколько медленнее по сравнению с некоторыми другими языками программирования, такими как C или C++, особенно при работе с высоконагруженными сетевыми приложениями. Однако, для большинства сетевых задач этот недостаток несущественен.
Потребление ресурсов: Python, как интерпретируемый язык, требует больше ресурсов проца и памяти по сравнению с языками программирования, скомпилированными в машинный код. В некоторых случаях это может быть проблемой при работе с высоконагруженными сетевыми приложениями или на системах с ограниченными ресурсами.
Использование Пайтона для сетевого взаимодействия, включая UDP, позволяет вам создавать эффективные и гибкие сетевые приложения, обеспечивая простоту разработки и обширный выбор инструментов для работы с сетевыми протоколами.
Пример реализации
В нашем конкретном примере требовалось написать подобие сервера, связанного с одной стороны с управляемым устройством через Ethernet напрямую, а с другой стороны с пользователями – находящимися в одной подсети с одноплатником.
В ходе работы выяснились некоторые не самые очевидные моменты, которые я и опишу.
Для начала нужно было выбрать, какую версию операционки использовать и понять, как создать загрузочную microSD-карту.
В итоге оптимальным выбором стала ОС OpenWRT версии 21.02.1 с сайта самих разработчиков Orange Pi.
Для форматирования microSD-карты использовалась утилита SD Card Formatter. После того, как microSD карта вставлена в ПэКа, необходимо выбрать ее в выпадающем списке, затем нажать «Format» и согласиться с форматированием.
Для загрузки образа OpenWRT на микросд-карту использовалась утилита Win32DiskImager. Необходимо указать путь до образа OpenWRT, выбрать отформатированную microSD-карту из выпадающего списка и нажать «Write». После завершения процесса, нажать «Exit», и вставить microSD-карту в Оранж.
После включения Orange Pi, самым простым способом подключения к нему является подключение по SSH. Итак, по умолчанию LAN-порт имеет статический айпишник 192.168.2.1. На одной из сетевых карт ПК необходимо изменить сетевые настройки так, чтобы ПК находился в одной подсети с LAN-портом Оранжа. К примеру, можно выставить следующий айпи – 192.168.2.2.
После этого нужно соединить порт настроенной сетевой карты ПК и LAN-порт Orange Pi. Далее подключение будет производиться через командную строку Винды. По умолчанию для SSH подключения установлен логин root и пустой пароль. То есть, для подключения достаточно в командной строке ввести следующую команду:
ssh root@192.168.2.1
Далее возникла потребность поменять айпишник LAN-порта Оранжа на 192.168.0.1. Добиться этого можно следующими командами:
uci set network.lan.ipaddr=’192.168.0.1’
uci commit
ubus call network restart
Теперь у нас есть настроенный LAN-порт. Но для связи с пользователями будет использоваться WAN-порт. Необходимо подключить WAN-порт к коммутатору, чтобы получить IP адрес из той же подсети, к которой подключены остальные юзеры. После чего узнать полученный айпи можно командой ifconfig, интересующий нас интерфейс – eth0. В итоге сетевые настройки будут иметь следующий вид:
Для установки пакетов в OpenWRT используется менеджер пакетов opkg. Интерпретатор Пайтон можно установить следующими командами:
opkg update
opkg install python3
Установленная версия python – 3.9.16, это нужно учитывать при написании скрипта.
В нашем проекте был необходим внешний накопитель – автоматическое монтирование в необходимую директорию можно сделать, редактируя файл /etc/config/fstab.
Последнее приготовление, касаемое OpenWRT – добавить написанный скрипт в автозагрузку операционки. Для этого необходимо в каталоге /etc/init.d создать файл (например, с именем example), в котором будут содержаться скрипты, выполняемые при запуске и остановке работы операционной системы. После создания файла, разрешить его исполнение для всех групп пользователей командой:
chmod +x /etc/init.d/example
Пример содержимого файла автозагрузки приведен ниже:
Разберем содержимое файла. Первая строка — это строка shebang, которая используется /etc/rc.common в качестве оболочки для обеспечения своей основной функциональности и функций по умолчанию, а также для проверки сценария перед выполнением.
По этому rc.common шаблону доступны следующие команды для сценариев инициализации:
start - Запустить службу.
stop - Остановить службу.
restart - Перезапустить службу.
reload - Перезагрузить файлы конфигурации (или перезапустить, если это не удается).
enable - Включить автозапуск службы.
disable - Отключить автозапуск службы.
Все эти аргументы могут быть переданы сценарию при запуске. Например, чтобы перезапустить службу, вызовите ее с помощью restart:
/etc/init.d/example restart
Необходимые функции start() и stop() в сценарии определяют основные шаги, необходимые для запуска и остановки этой службы.
start() - эти команды будут выполняться при вызове с параметром start.
В нашем примере все, что делает функция start() – переходит в папку со скриптом и запускает его в фоновом режиме.
stop() - эти команды будут выполняться при вызове с параметром stop.
В нашем примере функция stop находит процесс скрипта и останавливает его по PID.
Строки START= и STOP= определяют, в какой момент последовательности инициализации запускается этот скрипт.
START=99 означает, что файл будет иметь символическую ссылку /etc/rc.d/S99example - другими словами, он будет запускаться после сценариев инициализации с START=98 и ниже.
STOP=1 означает, что файл будет иметь символическую ссылку /etc/rc.d/K1example – то есть он будет остановлен первым.
После создания и редактирования файла /etc/init.d/example включить автозапуск службы можно командой:
/etc/init.d/example enable
Готово, теперь написанный скрипт будет запускаться и останавливаться вместе с операционной системой.
Обработать остановку скрипта можно следующим образом.
В данном случае используется модуль signal, который предоставляет механизмы для использования обработчиков сигналов в Пайтоне.
Осталось разобраться с сокетами. В начале нужно создать сам UDP IPv4 сокет:
socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Если вы хотите выполнить привязку ко всем доступным IPv4-адресам, укажите 0.0.0.0 в качестве IP-адреса. Порт 0 означает привязку к случайному свободному доступному порту. Вы можете получить порт, который был выбран, с помощью socket.getsockname()[1].
socket.bind(("0.0.0.0", 0))
Для того, чтобы сделать сокет неблокирующим, необходимо вызвать функцию:
socket.setblocking(0)
Далее, все что осталось сделать – получать в бесконечном цикле в отдельном потоке дейтаграммы на созданный сокет, и при необходимости посылать через сокет данные.
Вызов select.select проверяет сокеты в списке sockets и по готовности хотя бы одного - возвращает списки: reads
, send
, excepts
. Последний аргумент вызова select.select - timeout – это время ожидания.
socket.fileno возвращает файловый дескриптор сокета или -1 в случае ошибки.
В конце концов, получить данные позволяет вызов socket.recvfrom(2048), где 2048 – размер буфера в байтах.
А отправить дейтаграмму можно вызовом socket.sendto(data, (ip, port)), где data – пакет для отправки, а (ip, port) – адрес destination для дейтаграммы.
Заключение
Варианты использования рассмотренной программно-аппаратной платформы ограничиваются только вашей фантазией. Представьте, что у вас есть небольшое устройство с ориентированной на сетевые задачи операционной системой, подключенное к интернету 24/7… Теперь просто дайте волю своему воображению! Вот несколько идей: VPN-сервер, BitTorrent-клиент, файловый сервер, веб-сервер, блокировщик рекламы, онлайн система видеонаблюдения и многое другое.