Точка доступа Wi-Fi из камеры видеонаблюдения на OpenIPC

Точка доступа Wi-Fi из камеры видеонаблюдения на OpenIPC

Life-Hack - Linux/Хакинг/Хакер/ИБ/Osint • 14 января 2024


Пару десятков лет назад меня впечатлила новость, что какая-то корпорация смогла использовать настолько крутые технологии, что впихнули веб-сервер в коннектор RJ45. Для чего это нужно было уже и не вспомню, но сейчас, ковыряясь со своими камерами видеонаблюдения, меня осенила мысль, что плата камеры 38x38 мм не намного больше. Веб-сервер на ней и так есть. Это уже бытовуха. Скукота-скукотища. А вот сделать из ненужной камеры Wi-Fi-точку доступа — тут уже и польза будет. Вместо того, чтобы бороться одним роутером за дальность сигнала, можно просто использовать ещё один, чтобы «вафля» подключалась в самых недосягаемых уголках дома, таких как подвал или шубохранилище. Подобные устройства продаются совсем недорого. Но если имеется плата камеры с мусорки, то мы можем получить на халяву такой гаджет и в нагрузку получить бесценный опыт по тюнингу и сборке OpenIPC. Да и по сути, цель поста — не получение девайса ради экономии трёх копеек, а использование примера для понимания, как может быть полезна OpenIPC. Возможно, вы хотите собрать для одного из своих проектов камеру, которая в дополнение работает как Wi-Fi-точка доступа. Возможно, ещё миллион идей вас посетят в процессе чтения.

Похожим образом можно сделать роутер из камеры


Сегодняшний пост покажет, что можно творить с помощью OpenIPC, которую мы возьмём за базу. Ведь это даже не просто операционная система, а фреймворк для сборки прошивки, в котором можно выбрать необходимые компоненты и заставить их работать на плате камеры, по сути являющейся ARM-компьютером. Поэтому пост будет полезен тем, кого не устраивают классические бинарные сборки OpenIPC с ограниченным набором компонентов и для тех, кто хочет научиться компилировать прошивку самостоятельно, добавлять драйвера в ядро, выбирать дополнительные пакеты и всячески тюнинговать эту систему. Да и вообще пост будет познавателен для приверженцев «Да кому она нужна эта OpenIPC, если там и половины функций от стоковой прошивки даже нет».


Итак, сегодня в посте вы узнаете, как скачать и скомпилировать прошивку OpenIPC на локальной машине с Linux, как включить существующий пакет в сборку, как включить модули ядра, такие как драйвера сетевой карты или USB-свисток.


Представьте себе, находите на мусорке отличную почти новую Wi-Fi-камеру. Вы в надежде тащите её домой, начинаете задалбывать всех поиском прошивки, которая будет работать без доступа к облаку хоть по какому-нибудь вменяемому протоколу вроде ONVIF/RTSP. Заводских прошивок без облака нет — производители и сделали эту камеру для того, чтобы вам облака впарить по подписке. Только вот они уже разорились и свои сервера выключили, а камера, соответственно, стала кирпичом. Но даже если камера не поддерживается в OpenIPC полностью как камера видеонаблюдения, то, возможно, на ней с большой вероятностью можно запустить Linux из проекта OpenIPC, и это можно использовать.


Для Wi-Fi-роутера нужна плата либо с двумя Wi-Fi-адаптерами, либо с одним Wi-Fi и с одним LAN-интерфейсом. Сегодня речь пойдёт для примера про настройку варианта, когда камера имеет на борту Wi-Fi и LAN. Пост рассчитан на тех, кто имеет опыт работы с Linux, и основной акцент делается на деталях работы с OpenIPC. Такой читатель знает, что если бы такое оборудование было подключено к обычному компьютеру с Linux, то нам было бы достаточно нескольких команд, чтобы ядро Linux начало перекидывать пакеты между интерфейсами eth и wlan. А чтобы сделать Wi-Fi точку доступа, мы бы запустили что-то вроде 'apt install hostapd' в зависимости от дистрибутива. Но вот OpenIPC Linux урезан так, чтобы вместе со всем сопутствующим софтом поместится на флэшку размером 8 мегабайт. И поэтому нам придётся немного сплясать.


Кстати, если всерьёз вовлечётесь в какой-либо проект на камере и вам не будет хватать места на флэшке, то есть решение. Производители обычно стараются ставить флэшки самого минимального размера. Но если размер меньше 8 мегабайт, то на такой камере будет крайне ограниченный функционал. Флэшки, где хранится прошивка, бывают разных типов и в разых корпусах. Самые недорогие и очень распространённые — это микросхемы в корпусе SOIC-8 с надписью 25Q64xxxx (64 мегабита). Если это ваш вариант, то её не так сложно заменить на 25Q128xxxx (128 мегабит). Несколько раз потренироваться феном на сдохших платах от любой электроники с мусорки и вперёд.


Перехожу от лирики про гипотетическую камеру с мусорки к своим реальным камерам с мусорки.

Камеры для экспериментов на выбор

Из коробочки сегодня нам достаётся камера на процессоре Hisilicon hi3518ev200. На ней не работает сенсор и её не жалко отдать на растерзание. На самом деле эта камера из коробочки «попалась» довольно давно, и некоторые читатели её уже могли видеть в посте про Wi-Fi-мобиль из камеры видеонаблюдения. Камеру после экспериментов можно вернуть к работе по своему первоначальному предназначению в любой момент, если она, конечно, могла выполнять такие функции. Поэтому буду делать вид, будто я только что её выудил из коробочки.

Распиновка платы: подпаиваю USB хвост на +5V, USB_DM, USB_DP,GND

Немного о USB-Wi-Fi-модулях


Чаще всего на дешёвых камерах стоят самые дешёвые чипы Wi-Fi, которые лишены такой возможности. Поэтому если не получится нагуглить эту информацию, лучше подключить к компьютеру и проверить через hostapd, получится ли создать именно с вашим адаптером точку доступа.

Wi-Fi - адаптеры на выбор… всегда выбирайте самый большой ( шучу,нет! )

У меня из мешка со свистками для этой цели подошёл USB-Wi-Fi-двухдиапазонный адаптер на чипе RTL8812AU. Кроме того, что этот чип поддерживает режим точки доступа, он ещё отлично показал себя в плане качества связи: в результате халявная точка доступа отлично работала через несколько кирпичных и бетонных стен. Не удивительно, ведь адаптер имеет две антенны, каждая из которых имеет свой усилитель RTC5638H. Характеристики этого усилителя из документации:


  • TX Gain: 30Db (коэффициент усиления передачи)
  • RX Gain: 14Db (коэффициент усиления приёма)
  • Pout: 20dBm (выходная мощность)
  • Rx NF 2.8dB (внутренняя шумность на приёмнике — чем меньше, тем лучше)

Вот что говорит документация об усилителе RTC5638HE


Определяется этот адаптер через lsusb так:


Bus 003 Device 025: ID 0bda:8812 Realtek Semiconductor Corp. RTL8812AU 802.11a/b/g/n/ac 2T2R DB WLAN Adapter

Плата адаптера KuWfi 1200Mbps AC1200 на чипе RTL8812AU с двумя усилителями RTC5638H

При выборе добротного свистка нужно рассматривать не название или пластиковый корпус с надписями, а смело разбирать и смотреть схемотехнику: какие микросхемы используются и соответствуют ли их характеристики заявлениям производителя адаптера. В большинстве свистков усилители просто отсутствуют. Кстати, всё сказанное касается и популярных роутеров. Так, если захотите сравнить характеристики свистка со своим роутером, смело разбирайте и его.


Но следует признать, что при всей стабильности и дальнобойности связи я не получил сверхвысоких скоростей. Upload — 30 мегабит и download — 65 мегабит. Я проверил на мощном компьютере, используя 5Ghz, и получил около 70 мегабит в каждом направлении. В любом случае это тема для отдельного исследования, а пост сегодня не об этом.


Кроме того, этот адаптер на Али уже не найти. Он был взят впрок, провалялся много лет и для меня самого стало приятной новостью его нафаршированность полезностями. Закажу для исследований на подобном чипе RTL8812AU и на чипе RT3070L со съёмной антенной и усилителем сигнала.


Вернёмся к Wi-Fi-камерам. Зачастую на камерах установлен Wi-Fi-модуль отдельной платой специального формата 12 мм х 13 мм (как обычно, примерно), но работает такой модуль по USB-интерфейсу с тем лишь нюансом, что запитаны они от 3.3 в вместо стандартного для USB напряжения в 5 в. Продаются такие модулии отдельно на торговых площадках.

Плата Wi-Fi - камеры с распаянным зелёным USB-модулем на чипе Altobeam

Контакты таких модулей, как правило, размещены стандартизированно, поэтому модули можно перепаивать, даже если чипсет другой и вы не боитесь решать проблему с драйверами в прошивке:


  1. GND
  2. ANT
  3. 3.3V
  4. USB-
  5. USB+
  6. GND


Кстати, обеспечив такому модулю питание 3.3 в, его можно подключить к обычному компьютеру через USB. Для этого такой модуль не обязательно выпаивать из платы камеры — достаточно отключить шлейф, который ведёт к процессору. Питание поступает напрямую на эту плату камеры, но прошивка контролирует питание USB-Wi-Fi-модуля через транзистор, который подключён к GPIO. Именно поэтому в OpenIPC в файле /etc/wireless/usb можно увидеть, что для работы с Wi-Fi загружается не только модуль ядра, но и включается питание установкой нужного GPIO командой set_gpio. Естественно, для каждой модели камеры номера GPIO отличаются. Чтобы подать 3.3 в на USB-Wi-Fi-модуль, я просто бросал «соплю» припоя, чтобы подать питание напрямую с DC-DC-преобразователя на зелёную USB-плату, минуя транзистор. DC-DC-преобразователь даёт 3.3 в. На рисунке это шестиногий таракан (очень плохо виден) чуть выше надписи "+3.3V" чёрной платы. К компьютеру по USB-кабелю подключаются лишь GND, Data+, Data-. Дальше такая плата работает как обычное USB-устройство.


Теперь перейдём от аппаратной части к программной.


План настройки Wi-Fi-моста на основе OpenIPC


  • Скачиваю исходный код OpenIPC.
  • Включаю пакет hostapd, который позволит создать точку доступа на основе Wi-Fi-адаптера.
  • Включаю пакет с драйвером сетевого адаптера (в старых ядрах нет поддержки очень многих адаптеров). 
  • Компилирую OpenIPC.
  • Прошиваю собранную OpenIPC.
  • Создаю сетевой мост между сетями Wi-Fi и LAN, что позволит использовать DHCP, DNS и прочие сервисы от вашей локальной сети.


Как видите, чтобы упростить задачу, я остановился на том, чтобы создать точку доступа и сделать лишь бридж между eth и wlan, ведь в любой сети уже есть сервисы NAT, DNS, DHCP и дублировать их, создавая полноценный роутер, смысла не вижу.


Сборка OpenIPC с компонентами по умолчанию


Чтобы скачать и собрать OpenIPC с дефолтными настройками, нужно запустить несколько команд из консоли:


$ git clone https://github.com/OpenIPC/firmware
$ cd firmware && ./building.sh


Конечно, это предполагает что у вас уже установлены необходимые для сборки программы.


Сборщик спросит, под какую платформу хотите собрать и выбрать тип сборки Lite, Ultimate или FPV. Обратите внимание, что не под каждую платформу доступны типовые конфигурации сборки.

Меню сборщика OpenIPS
  • FPV — узкоспециализированная сборка под летательные аппараты с видом FPV.
  • Lite — лишь базовые компоненты для камеры видеонаблюдения с флэшкой на 8 мегабайт. Установится такая прошивка и на флэшку большего размера.
  • Ultimate — включает в себя поддержку таких фишек, как Telegram, Wireguard, Zerotire, MQTT и многое многое другое. Тут уже потребуется флэшка на 16 мегабайт.


Но я уже выбрал платформу для сборки, и чтобы каждый раз не выбирать с клавиатуры в меню ncurses вместо ./building.sh, я запускаю следующую команду, типичную для BUILDROOT проекта:


make BOARD=hi3518ev200_lite all


В результате сборки в директории /output/images вы найдёте файлы с архивом openipc.hi3518ev200-nor-lite.tgz, распаковав который при моей выбранной платформе, можно найти такие файлы:


uImage.hi3518ev200 — ядро Linux для hi3518ev200

rootfs.squashfs.hi3518ev200 — корневая файловая система под эту платформу


Есть множество способов прошить полученную систему в камеру, и сегодня я не буду заострять на этом внимание. Всё это много раз объяснено в wiki проекта как на английском так и на русском.


Я же для прошивки кастомной сборки OpenIPC обычно сначала вливаю OpenIPC самым простым способом используя Coupler, а потом подключившись в консоль камеры по ssh делаю обновление используя команду sysupgrade:


mount -o nolock 192.168.1.3:/mnt/nfs /mnt/
cd /mnt
sysupgrade --kernel=uImage.hi3518ev200 --rootfs=rootfs.squashfs.hi3518ev200 --force_all


Первая команда подмонтирует по NFS в /mnt сетевую директорию с полученными нами двумя файлами и команда sysupgrade прошивает эти файлы. При этом нужно внимательно прочесть каждую строку результата и убедиться, что всё прошло успешно и ни на одном из шагов не было ошибок. Особенно с учётом опции --force_all, которая отключает все проверки. Иногда своевременное обнаружение ошибки поможет облегчить её исправление, а исправлять подобные ошибки иногда бывает очень и очень проблематично.


Сборка OpenIPC с необходимыми компонентами


Приступим к тюнингу нашей будущей точки доступа на OpenIPC. Тот, кто пытался самостоятельно компилировать программы для Linux, знает, что как только программа становится чуть сложнее и зависит от каких-либо библиотек, то начинается ад с добавлением зависимостей в конфигураторе и перечислением директорий, где можно найти компоненты этих зависимостей. Чтобы вручную не заниматься такой адской работой, в OpenIPC используется система сборки BuildRoot, для которой пишутся файлы конфигурации и подключаются программы, необходимые нам в сборке.


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


▍ Подключение пакета hostapd и пакета с драйвером Wi-Fi USB-адаптера 


Включим hostapd (это программное обеспечение для точки доступа и сервера аутентификации). Поддержка драйвера Wi-Fi-адаптера RTL8812AU, который я буду использовать, отсутствует в ядре Linux, но разработчики OpenIPC включили его в проект как пакет BuildRoot. Чтобы включить в сборку это дополнительное ПО, находим файл ./br-ext-chip-hisilicon/configs/hi3518ev200_lite_defconfig и добавим строки:


BR2_PACKAGE_RTW_HOSTAPD=y

BR2_PACKAGE_RTL8812AU_OPENIPC=y


Все доступные пакеты находятся в директории ./general/package/, и вы можете выбрать существующий пакет или на их примере создать свой. А для экономии места на флэшке камеры смело можно в этом же конфиге убрать лишние пакеты, зная, что они не понадобятся в точке доступа. Это придётся сделать, если флэшка вашей камеры имеет всего лишь 8 мегабайт под всю прошивку и выбрана сборка Lite. Иначе на самом последнем этапе упаковки прошивки при сборке вы получите невнятную ошибку о нехватке места. Поэтому кроме самого распространённого драйвера MT7601, сборки OpenIPC Lite не включают больше никакие драйверы Wi-Fi. Некоторые драйверы Wi-Fi могут заниматься мегабайт и более. Я убрал следующие пакеты, раз уж в этой прошивке мне не нужно использовать точку доступа как камеру:


BR2_PACKAGE_LIBYAML=y

BR2_PACKAGE_MAJESTIC_FONTS=y

BR2_PACKAGE_MAJESTIC=y

BR2_PACKAGE_WEBUI=y

BR2_PACKAGE_MOTORS=y

BR2_PACKAGE_OPUS_OPENIPC=y

BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y

BR2_PACKAGE_VTUND_OPENIPC=y

BR2_PACKAGE_YAML_CLI=y

BR2_PACKAGE_WIREGUARD_LINUX_COMPAT=y

BR2_PACKAGE_WIREGUARD_TOOLS=y


▍ Поправим настройки ядра и подключим необходимые дровишки 


Если же необходимый вам драйвер находится в самом ядре, то поступаем так. Сначала запускаем сборку по умолчанию. В процессе сборки BuildRoot скачает исходники Linux, и их можно будет поднастроить:


$ cd ./output/build/linux-custom/

$ make menuconfig


Находим следующие пункты в меню:


Device Drivers ---> 

[*] Network device support --->

USB Network Adapters --->

Wireless LAN --->


Имейте в виду, что после настройки ядра больше нельзя запускать ./building.sh, потому что он перед сборкой запускает make distclean и очищает директорию /output/ (настройки платформы в файле hi3518ev200_lite_defconfig это не коснётся). Запустить повторную сборку без очистки можно через make, как я описывал выше. Поэтому после конфигурации нужно сделать очень важный пункт: скопировать полученную конфигурацию ядра из файла .config в ./br-ext-chip-hisilicon/board/hi3518ev200/kernel.


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


После загрузки прошивки убеждаюсь, что файл драйвера адаптера на месте. Так как он был собран не с ядром, а отдельным пакетом OpenIPC, то такие драйвера сохраняются при сборке в директорию extra. У меня ядро версии 4.9.37 и, соответственно, полный путь к файлу /lib/modules/4.9.37/extra/88XXau.ko.


modprobe 88XXau


После этой команды «ifconfig -a» должен показать, что создан интерфейс wlan0. Для автоматической загрузки драйвера добавьте его имя в файл /etc/modules.


Запуск hostapd для создания точки доступа


Изменяю конфиг hostapd. Для редактирования используйте редактор vi — единственный доступный в OpenIPC. Вот пример настройки для 2.4Ghz для тех, кому лень разбираться, но этот адаптер умеет и 5Ghz.


interface=wlan0

driver=nl80211

ieee80211n=1

auth_algs=1

ssid=OpenIPC

hw_mode=g

channel=7

wpa=2

wpa_passphrase=mywifipassword

wpa_key_mgmt=WPA-PSK

wpa_pairwise=TKIP

rsn_pairwise=CCMP


Запускаю:


hostapd -dB /etc/hostapd.conf


Если адаптер не умеет в точку доступа, то в логах запуска hostapd будут подобные строки:


wlan0: interface state UNINITIALIZED->DISABLED

hostapd_bss_deinit: deinit bss wlan0

wlan0: AP-DISABLED 

hostapd_cleanup(hapd=0xb6ec81d0 (wlan0))

wlan0: CTRL-EVENT-TERMINATING 


Лог при успешном создании точки доступа


Ключевым признаком успеха создания точки доступа будут строки:


wlan0: interface state UNINITIALIZED->ENABLED

wlan0: AP-ENABLED 


После этого среди доступных сетей Wi-Fi будет видно точку «OpenIPC», имя которой задано в конфигурационном файле hostapd.conf.


Настройка сетевого моста между wlan и eth


Теперь приступим к созданию сетевого моста. Мост подразумевает собой объединение нескольких сетевых интерфейсов в один виртуальный (обычно его называют br0). Так, наши интерфейсы eth0 и wlan0 не должны быть настроены на какой-либо IP-адрес, адрес присваивается интерфейсу br0. После этого объединения все клиенты точки доступа будут видеть все IP-адреса из кабельной локалки и, соответственно, эти IP-адреса будут все из одной подсети. Наш девайс, перебрасывая пакеты из сети Wi-Fi для клиента, просто сделает вид, что клиент находится внутри локальной сети, к которой по кабелю подключена наша точка доступа. Все запросы DHCP, DNS и сервис NAT будут отправлены к основному роутеру локальной сети.


brctl addbr br0 #создаём виртуальный интерфейс моста br0

brctl addif br0 wlan0 #включаем wlan0 в мост

brctl addif br0 eth0 #включаем eth0 в мост

brctl show #проверим, что получилось

ip link set dev br0 up #поднимаем интерфейс

ifconfig br0 192.168.1.254/24


Для работы моста в нашем кейсе даже не нужно включать форвардинг пакетов через установку единицы по пути /proc/sys/net/ipv4/ip_forward.


Также в OpenIPC мостом можно управлять через команду ip, и тогда необходимые действия будут выглядеть так:


ip link add br0 type bridge
ip link set wlan0 master br0
ip link set eth0 master br0
ip link set br0 up


Я определил IP на интерфейсе br0, предварительно удалив с интерфейса eth0:


ip addr del 192.168.1.205/24 dev eth0
ip addr add 192.168.1.205/24 dev br0
route add default gw 192.168.1.1


Обращаю внимание, что добавление в мост интерфейса wlan0 должно происходить уже после успешного запуска hostapd, иначе будет ошибка:


brctl: bridge br0: Not supported


Как настроить скрипты, чтобы все интерфейсы поднимались автоматически через настройки в /etc/network/interfaces.d/ после загрузки, я уже описывать не буду, потому как тут отличий от обычной Linux-системы нет.


Заключение


Мне очень нравится тема переиспользования старых устройств. Как и многие другие устройства IoT, даже довольно старые камеры являются вполне неплохой и относительно мощной ARM-платформой для различных проектов. Учитывая, каким огромным потоком они летят в мусорные баки по причинам не связанным с поломками, их стоит взять на карандаш. Благодаря таким проектам как OpenIPC для камер и Armbian для телевизонных приставок, эти устройства становятся в конкуренцией плодово-ягодным компьютерам.


А с учётом цены в 10-20$ на новые платы камер без такого обвеса как объектив, IR-фильтр, корпус и подсветка и 15-25$ за полноценную камеру в сборе, стоит вообще всерьёз задуматься, чтобы для запуска своих программ использовать именно эту платформу. Но если же для проекта требуется сенсор, то рассмотренный сегодня кейс с камерой, на которой будет 128-256 мегабайт RAM и процессор 500-900Mhz, даст серьёзную фору таким альтернативам, как ESP32-CAM с самыми отвратными сенсорами и минимальным количеством ресурсов без аппаратной поддержки кодеков вроде h.264 (и уж даже не заикаясь о h.265).


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


Источник


Report Page