Автор - Александр Простак

Программист ООО «СМАРТС-Кванттелеком»

Современный мир интернета вещей (IoT) и смарт-устройств требует гибкости и мощности при управлении сетевым оборудованием. Найти подходящее решение, сочетающее в себе одновременно простоту, надежность и доступность, может быть сложной задачей. Сегодня я хочу рассмотреть одну из таких комбинаций: одноплатный компьютер Orange Pi с операционкой OpenWRT + Python.

Orange Pi – мощная и компактная альтернатива другим одноплатным компьютерам. Он обладает большой вычислительной мощностью, расширяемыми возможностями и множеством интерфейсов. OpenWRT, в свою очередь, легкая и гибкая ОС, специально разработанная для маршрутизаторов и сетевых устройств. ОС предлагает широкие возможности настройки и расширения сетевых функций. Ну и Python – один из самых популярных языков программирования в мире, предоставляет простоту и эффективность для разработки скриптов и автоматизации задач.


Рассмотрим использование Orange Pi с установленной на нем OpenWRT и разработанном на языке Python скрипте. Имея под рукой такие инструменты, попробуем создать собственную сетевую систему управления! В конечном итоге, вы сможете самостоятельно и легко воспроизвести этот пример и адаптировать его под свои нужды, открывая новые возможности в области управления сетевыми устройствами.

Итак, мы имеем:

Orange Pi R1 Plus LTS

Одноплатный ПэКа Orange Pi R1 Plus LTS – оказался под рукой и стал подопытным для реализации проектов, связанных с управлением сетевыми устройствами. Вот некоторые из его особенностей.

Плюсы:

  1. Вычислительная мощь: 4-ядерный проц ARM Cortex-A53 с тактовой частотой до 1.5 ГГц, достаточно неплохая производительность для выполнения различных задач и обработки данных, не только сетевых.

  2. Поддержка сети: на борту Ethernet-порты 10M/100M/1000M Ethernet (YT8531C) и 10M/100M/1000M USB Ethernet (на чипе RTL8153B).

  3. Расширяемость: «О»–пельсинка имеет различные интерфейсы, такие как USB-порт, USB Type-C порт (для питания) и слот для microSD-карт, что существенно прокачивает возможности по расширению и подключению внешних устройств.

  4. Поддержка операционной системы OpenWRT: поддержка OpenWRT – это то, что надо для стабильности и гибкости в управлении сетевыми функциями.

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

Минусы:

  1. Ограниченная поддержка сообщества: по сравнению с некоторыми другими одноплатниками, «О»–пельсинка может иметь весьма ограниченную поддержку в сообществе разработчиков. Не так много доступной документации и не так много рассмотрено решений для некоторых конкретных проблем.

  2. Ограниченное количество портов: хоть они и есть, их может не хватить конкретно для Ваших задач, да и другие одноплатники на этом фоне выглядят солидней.

Использование Orange Pi R1 Plus LTS в связке с операционной системой OpenWRT и скриптами на Python позволяет создать мощную и гибкую сетевую систему управления. Это открывает широкие возможности для реализации различных проектов, связанных с IoT, автоматизацией и сетевой инфраструктурой.

OpenWRT

Многие уже слышали и знают, что это такое, поэтому вкратце: ОС OpenWRT является мощным инструментом для управления сетевыми устройствами и роутерами. Многие умельцы их накатывают на домашние роутеры, существенно расширяющие их функционал. Основные характеристики ОС.

Плюсы:

  1. Гибкость и настраиваемость: OpenWRT предоставляет широкие возможности для настройки и конфигурации сетевых функций. Вы можете выбрать только те компоненты и пакеты, которые вам нужны, и создать оптимальное решение для своих потребностей. Это обеспечивает гибкость и экономию ресурсов.

  2. Активное сообщество и поддержка: OpenWRT имеет большое сообщество разработчиков и пользователей, которые активно вносят вклад в его развитие. Это означает наличие обширной документации, форумов поддержки и регулярных обновлений, что облегчает работу с этой операционкой.

  3. Мощные сетевые возможности: OpenWRT предлагает широкий спектр функций и протоколов для управления сетевыми устройствами, включая маршрутизацию, межсетевое экранирование (firewall), VPN, QoS и другие. Вы можете создавать сложные сетевые конфигурации и обеспечивать высокую степень безопасности и производительности.

  4. Поддержка различных аппаратных платформ: OpenWRT совместима с множеством аппаратных платформ и архитектур, что позволяет использовать её на широком спектре сетевых устройств и роутеров.

Минусы:

  1. Сложность для новичков: изначально OpenWRT может показаться сложной для новичков в области сетевых технологий и Линукса. Требуется некоторое время и изучение, чтобы стать более опытным пользователем и использовать всю мощь этой операционной системы.

  2. Ограниченная поддержка аппаратных устройств: в некоторых случаях, OpenWRT может иметь ограниченную поддержку для некоторых аппаратных устройств и роутеров, особенно для более новых моделей. Это может потребовать дополнительных усилий и времени для обеспечения совместимости.

OpenWRT является рекомендуемой операционкой для одноплатников Orange Pi, включая модель Orange Pi R1 Plus LTS. Создатели Оранжа активно используют и рекомендуют OpenWRT в своих руководствах пользователя. Это подтверждает сочетание надежности и совместимости между OpenWRT и Orange Pi, что обеспечивает стабильную и эффективную работу сетевых устройств.

Python

Пайтон является мощным и мейнстримным языком программирования. Он предоставляет широкие возможности для сетевого взаимодействия. Вот некоторые из его плюсов и минусов, связанных с сетевым программированием.

Плюсы:

  1. Простота использования: Пайтон обладает простым и понятным синтаксисом, который делает его доступным для новичков и упрощает разработку и отладку кода для сетевого взаимодействия.

  2. Богатая стандартная библиотека: Python поставляется с обширной стандартной библиотекой, которая содержит модули и инструменты для работы с различными сетевыми протоколами, включая UDP. Это облегчает разработку сетевых приложений и сокращает время разработки.

  3. Кроссплатформенность: Python поддерживается на различных операционках, что делает его универсальным выбором для создания платформонезависимых сетевых приложений. Вам не придется переписывать код для каждой платформы отдельно.

  4. Поддержка сокетов: Python предоставляет мощный и удобный API для работы с сокетами, что облегчает создание и управление сетевыми соединениями на различных уровнях, включая UDP. Вы можете использовать сокеты для отправки и приема пакетов данных по сети.

Минусы:

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

  2. Потребление ресурсов: 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 шаблону доступны следующие команды для сценариев инициализации:

  1. start - Запустить службу.

  2. stop - Остановить службу.

  3. restart - Перезапустить службу.

  4. reload - Перезагрузить файлы конфигурации (или перезапустить, если это не удается).

  5. enable - Включить автозапуск службы.

  6. 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-клиент, файловый сервер, веб-сервер, блокировщик рекламы, онлайн система видеонаблюдения и многое другое.

Комментарии (1)


  1. NutsUnderline
    16.11.2023 16:54
    +2

    использовать кастомный протокол да на тяжеловесном питоне.. ну такое... неуловимый Джо

    в то время когда это можно сделать через секурный ssh и без всяких питонов