Пару десятков лет назад меня впечатлила новость, что какая-то корпорация смогла использовать настолько крутые технологии, что впихнули веб-сервер в коннектор 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-мобиль из камеры видеонаблюдения. Камеру после экспериментов можно вернуть к работе по своему первоначальному предназначению в любой момент, если она, конечно, могла выполнять такие функции. Поэтому буду делать вид, будто я только что её выудил из коробочки.
Плата камеры на процессоре Hisilicon hi3518ev200
Многие камеры могут состоять из двух плат и более: основная плата с процессором, плата с сенсором, плата с коннектором LAN, Wi-Fi-модулем, MMC-карточкой, контроллером моторов PTZ, POE-модуль для удалённого питания. На некоторых платах контакты подписаны, потому что многие разъёмы одинаковы и, если не читать, то легко можно воткнуть 2PIN-коннектор микрофона или спикера в разъём IRCUT, который тоже 2PIN. Но чаще всего придётся искать документацию или вызванивать. И при разборке камеры стоит всё же записать, что куда было подключено.
На моей плате не было Wi-Fi-модуля, но были неиспользованные контакты классического USB с питанием 5 вольт. Именно к этим четырём контактам я и подпаял USB-хвост, в который воткнул Wi-Fi-USB-свисток. Это хороший вариант, потому что USB-свисток нужно будет подобрать такой, чтобы поддерживал возможность создания точки доступа (далеко не все чипы это умеют делать).
Распиновка платы: подпаиваю 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
The RichWave RTC5638HE with QFN-16 RF Chips ROHS is an electronic component used in radio frequency (RF) and wireless communication systems. The component offers high performance and high efficiency in a compact form factor of 16 pins. It provides low-power operation, low-noise received signal strength indication (RSSI), and integrated audio output. The component is designed for low-power and long-range use in applications such as Bluetooth, Zigbee, WLAN, FM, GPS, and Glonass, and is ROHS compliant. It includes an integrated dual-channel power amplifier, a low-noise amplifier (LNA) with gain control, an output switch, a band-pass filter, a low-skew oscillator, and various other components. The component is suitable for ultra-low standby power, high volume production, and has an operating temperature range of -40°C to +85°C.
Определяется этот адаптер через 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
Контакты таких модулей, как правило, размещены стандартизированно, поэтому модули можно перепаивать, даже если чипсет другой и вы не боитесь решать проблему с драйверами в прошивке:
- GND
- ANT
- 3.3V
- USB-
- USB+
- 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. Обратите внимание, что не под каждую платформу доступны типовые конфигурации сборки.
Меню сборщика OpenIPC
- 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
Лог при успешном создании точки доступа
random: Trying to read entropy from /dev/random
Configuration file: /etc/hostapd.conf
nl80211: Supported cipher 00-0f-ac:1
nl80211: Supported cipher 00-0f-ac:5
nl80211: Supported cipher 00-0f-ac:2
nl80211: Supported cipher 00-0f-ac:4
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4608
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4609
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4610
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4106
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4107
nl80211: interface wlan0 in phy phy2
nl80211: Set mode ifindex 6 iftype 3 (AP)
nl80211: Setup AP(wlan0) — device_ap_sme=1 use_monitor=0
nl80211: Subscribe to mgmt frames with AP handle 0xb6fe2930 (device SME)
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=04
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0501
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0503
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0504
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=06
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=08
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=09
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0a
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=11
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=7f
nl80211: Register frame type=0xb0 (WLAN_FC_STYPE_AUTH) nl_handle=0xb6fe2930 match=
nl80211: Enable Probe Request reporting nl_preq=0xb6fe2870
nl80211: Register frame type=0x40 (WLAN_FC_STYPE_PROBE_REQ) nl_handle=0xb6fe2870 match=
rfkill: initial event: idx=2 type=1 op=0 soft=0 hard=0
nl80211: Add own interface ifindex 6 (ifidx_reason -1)
nl80211: if_indices[16]: 6(-1)
phy: phy2
BSS count 1, BSSID mask 00:00:00:00:00:00 (0 bits)
nl80211: Regulatory information — country=00
nl80211: 2402-2472 @ 40 MHz 20 mBm
nl80211: 2457-2482 @ 20 MHz 20 mBm (no IR)
nl80211: 2474-2494 @ 20 MHz 20 mBm (no OFDM) (no IR)
nl80211: 5170-5250 @ 80 MHz 20 mBm (no IR)
nl80211: 5250-5330 @ 80 MHz 20 mBm (DFS) (no IR)
nl80211: 5490-5730 @ 160 MHz 20 mBm (DFS) (no IR)
nl80211: 5735-5835 @ 80 MHz 20 mBm (no IR)
nl80211: 57240-63720 @ 2160 MHz 0 mBm
nl80211: Added 802.11b mode based on 802.11g information
nl80211: Mode IEEE 802.11g: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467[NO_IR] 2472[NO_IR] 2484[NO_IR]
nl80211: Mode IEEE 802.11a: 5180[NO_IR] 5200[NO_IR] 5220[NO_IR] 5240[NO_IR] 5260[NO_IR][RADAR] 5280[NO_IR][RADAR] 5300[NO_IR][RADAR] 5320[NO_IR][RADAR] 5500[NO_IR][RADAR] 5520[NO_IR][RADAR] 5540[NO_IR][RADAR]
nl80211: Mode IEEE 802.11b: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467[NO_IR] 2472[NO_IR] 2484[NO_IR]
Completing interface initialization
Mode: IEEE 802.11g Channel: 7 Frequency: 2442 MHz
DFS 0 channels required radar detection
nl80211: Set freq 2442 (ht_enabled=1, vht_enabled=0, he_enabled=0, bandwidth=20 MHz, cf1=2442 MHz, cf2=0 MHz)
* freq=2442
* he_enabled=0
* vht_enabled=0
* ht_enabled=1
* sec_channel_offset=0
* channel_type=1
RATE[0] rate=10 flags=0x1
RATE[1] rate=20 flags=0x1
RATE[2] rate=55 flags=0x1
RATE[3] rate=110 flags=0x1
RATE[4] rate=60 flags=0x0
RATE[5] rate=90 flags=0x0
RATE[6] rate=120 flags=0x0
RATE[7] rate=180 flags=0x0
RATE[8] rate=240 flags=0x0
RATE[9] rate=360 flags=0x0
RATE[10] rate=480 flags=0x0
RATE[11] rate=540 flags=0x0
hostapd_setup_bss(hapd=0xb6efb1d0 (wlan0), first=1)
wlan0: Flushing old station entries
nl80211: flush -> DEL_STATION wlan0 (all)
wlan0: Deauthenticate all stations
nl80211: sta_remove -> DEL_STATION wlan0 ff:ff:ff:ff:ff:ff --> -22 (Invalid argument)
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=0 set_tx=0 seq_len=0 key_len=0
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=1 set_tx=0 seq_len=0 key_len=0
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=2 set_tx=0 seq_len=0 key_len=0
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=3 set_tx=0 seq_len=0 key_len=0
Using interface wlan0 with hwaddr 00:13:ef:f2:17:cc and ssid «OpenIPC»
Deriving WPA PSK based on passphrase
SSID — hexdump_ascii(len=7):
4f 70 65 6e 49 50 43 OpenIPC
PSK (ASCII passphrase) — hexdump_ascii(len=12): [REMOVED]
PSK (from passphrase) — hexdump(len=32): [REMOVED]
random: Got 20/20 random bytes
GMK — hexdump(len=32): [REMOVED]
Key Counter — hexdump(len=32): [REMOVED]
WPA: Delay group state machine start until Beacon frames have been configured
nl80211: Set beacon (beacon_set=0)
nl80211: Beacon head — hexdump(len=58): 80 00 00 00 ff ff ff ff ff ff 00 13 ef f2 17 cc 00 13 ef f2 17 cc 00 00 00 00 00 00 00 00 00 00 64 00 11 04 00 07 4f 70 65 6e 49 50 43 01 08 82 84 8b 96 0c 12 18 24 03 01 07
nl80211: Beacon tail — hexdump(len=109): 2a 01 04 32 04 30 48 60 6c 30 14 01 00 00 0f ac 04 01 00 00 0f ac 04 01 00 00 0f ac 02 0c 00 2d 1a 0c 00 1f ff ff 00 00 00 00 00 00 00 00 b8 0b 01 00 00 00 00 00 00 00 00 00 00 3d 16 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 dd 18 00 50 f2 02 01 01 01 00 03 a4 00 00 27 a4 00 00 42 43 5e 00 62 32 00 00
nl80211: ifindex=6
nl80211: beacon_int=100
nl80211: beacon_rate=0
nl80211: rate_type=0
nl80211: dtim_period=2
nl80211: ssid=OpenIPC
* beacon_int=100
* dtim_period=2
nl80211: hidden SSID not in use
nl80211: privacy=1
nl80211: auth_algs=0x1
nl80211: wpa_version=0x2
nl80211: key_mgmt_suites=0x2
nl80211: pairwise_ciphers=0x10
nl80211: group_cipher=0x10
nl80211: SMPS mode — off
WPA: Start group state machine to set initial keys
WPA: group state machine entering state GTK_INIT (VLAN-ID 0)
GTK — hexdump(len=16): [REMOVED]
WPA: group state machine entering state SETKEYSDONE (VLAN-ID 0)
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=3 addr=0x7f66008d key_idx=1 set_tx=1 seq_len=0 key_len=16
nl80211: KEY_DATA — hexdump(len=16): [REMOVED]
broadcast key
nl80211: Set wlan0 operstate 0->1 (UP)
netlink: Operstate: ifindex=6 linkmode=-1 (no change), operstate=6 (IF_OPER_UP)
nl80211: TX queue param set: queue=0 aifs=1 cw_min=3 cw_max=7 burst_time=15 --> res=-95
Failed to set TX queue parameters for queue 0.
nl80211: TX queue param set: queue=1 aifs=1 cw_min=7 cw_max=15 burst_time=30 --> res=-95
Failed to set TX queue parameters for queue 1.
nl80211: TX queue param set: queue=2 aifs=3 cw_min=15 cw_max=63 burst_time=0 --> res=-95
Failed to set TX queue parameters for queue 2.
nl80211: TX queue param set: queue=3 aifs=7 cw_min=15 cw_max=1023 burst_time=0 --> res=-95
Failed to set TX queue parameters for queue 3.
nl80211: Set Deny ACL (num_mac_acl=0)
nl80211: Failed to set MAC ACL: -1 (Operation not permitted)
Failed to set deny acl
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
wlan0: Setup of interface done.
ctrl_iface not configured!
Configuration file: /etc/hostapd.conf
nl80211: Supported cipher 00-0f-ac:1
nl80211: Supported cipher 00-0f-ac:5
nl80211: Supported cipher 00-0f-ac:2
nl80211: Supported cipher 00-0f-ac:4
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4608
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4609
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4610
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4106
nl80211: Supported vendor command: vendor_id=0x1a11 subcmd=4107
nl80211: interface wlan0 in phy phy2
nl80211: Set mode ifindex 6 iftype 3 (AP)
nl80211: Setup AP(wlan0) — device_ap_sme=1 use_monitor=0
nl80211: Subscribe to mgmt frames with AP handle 0xb6fe2930 (device SME)
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=04
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0501
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0503
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0504
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=06
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=08
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=09
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=0a
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=11
nl80211: Register frame type=0xd0 (WLAN_FC_STYPE_ACTION) nl_handle=0xb6fe2930 match=7f
nl80211: Register frame type=0xb0 (WLAN_FC_STYPE_AUTH) nl_handle=0xb6fe2930 match=
nl80211: Enable Probe Request reporting nl_preq=0xb6fe2870
nl80211: Register frame type=0x40 (WLAN_FC_STYPE_PROBE_REQ) nl_handle=0xb6fe2870 match=
rfkill: initial event: idx=2 type=1 op=0 soft=0 hard=0
nl80211: Add own interface ifindex 6 (ifidx_reason -1)
nl80211: if_indices[16]: 6(-1)
phy: phy2
BSS count 1, BSSID mask 00:00:00:00:00:00 (0 bits)
nl80211: Regulatory information — country=00
nl80211: 2402-2472 @ 40 MHz 20 mBm
nl80211: 2457-2482 @ 20 MHz 20 mBm (no IR)
nl80211: 2474-2494 @ 20 MHz 20 mBm (no OFDM) (no IR)
nl80211: 5170-5250 @ 80 MHz 20 mBm (no IR)
nl80211: 5250-5330 @ 80 MHz 20 mBm (DFS) (no IR)
nl80211: 5490-5730 @ 160 MHz 20 mBm (DFS) (no IR)
nl80211: 5735-5835 @ 80 MHz 20 mBm (no IR)
nl80211: 57240-63720 @ 2160 MHz 0 mBm
nl80211: Added 802.11b mode based on 802.11g information
nl80211: Mode IEEE 802.11g: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467[NO_IR] 2472[NO_IR] 2484[NO_IR]
nl80211: Mode IEEE 802.11a: 5180[NO_IR] 5200[NO_IR] 5220[NO_IR] 5240[NO_IR] 5260[NO_IR][RADAR] 5280[NO_IR][RADAR] 5300[NO_IR][RADAR] 5320[NO_IR][RADAR] 5500[NO_IR][RADAR] 5520[NO_IR][RADAR] 5540[NO_IR][RADAR]
nl80211: Mode IEEE 802.11b: 2412 2417 2422 2427 2432 2437 2442 2447 2452 2457 2462 2467[NO_IR] 2472[NO_IR] 2484[NO_IR]
Completing interface initialization
Mode: IEEE 802.11g Channel: 7 Frequency: 2442 MHz
DFS 0 channels required radar detection
nl80211: Set freq 2442 (ht_enabled=1, vht_enabled=0, he_enabled=0, bandwidth=20 MHz, cf1=2442 MHz, cf2=0 MHz)
* freq=2442
* he_enabled=0
* vht_enabled=0
* ht_enabled=1
* sec_channel_offset=0
* channel_type=1
RATE[0] rate=10 flags=0x1
RATE[1] rate=20 flags=0x1
RATE[2] rate=55 flags=0x1
RATE[3] rate=110 flags=0x1
RATE[4] rate=60 flags=0x0
RATE[5] rate=90 flags=0x0
RATE[6] rate=120 flags=0x0
RATE[7] rate=180 flags=0x0
RATE[8] rate=240 flags=0x0
RATE[9] rate=360 flags=0x0
RATE[10] rate=480 flags=0x0
RATE[11] rate=540 flags=0x0
hostapd_setup_bss(hapd=0xb6efb1d0 (wlan0), first=1)
wlan0: Flushing old station entries
nl80211: flush -> DEL_STATION wlan0 (all)
wlan0: Deauthenticate all stations
nl80211: sta_remove -> DEL_STATION wlan0 ff:ff:ff:ff:ff:ff --> -22 (Invalid argument)
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=0 set_tx=0 seq_len=0 key_len=0
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=1 set_tx=0 seq_len=0 key_len=0
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=2 set_tx=0 seq_len=0 key_len=0
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=0 addr=0 key_idx=3 set_tx=0 seq_len=0 key_len=0
Using interface wlan0 with hwaddr 00:13:ef:f2:17:cc and ssid «OpenIPC»
Deriving WPA PSK based on passphrase
SSID — hexdump_ascii(len=7):
4f 70 65 6e 49 50 43 OpenIPC
PSK (ASCII passphrase) — hexdump_ascii(len=12): [REMOVED]
PSK (from passphrase) — hexdump(len=32): [REMOVED]
random: Got 20/20 random bytes
GMK — hexdump(len=32): [REMOVED]
Key Counter — hexdump(len=32): [REMOVED]
WPA: Delay group state machine start until Beacon frames have been configured
nl80211: Set beacon (beacon_set=0)
nl80211: Beacon head — hexdump(len=58): 80 00 00 00 ff ff ff ff ff ff 00 13 ef f2 17 cc 00 13 ef f2 17 cc 00 00 00 00 00 00 00 00 00 00 64 00 11 04 00 07 4f 70 65 6e 49 50 43 01 08 82 84 8b 96 0c 12 18 24 03 01 07
nl80211: Beacon tail — hexdump(len=109): 2a 01 04 32 04 30 48 60 6c 30 14 01 00 00 0f ac 04 01 00 00 0f ac 04 01 00 00 0f ac 02 0c 00 2d 1a 0c 00 1f ff ff 00 00 00 00 00 00 00 00 b8 0b 01 00 00 00 00 00 00 00 00 00 00 3d 16 07 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 dd 18 00 50 f2 02 01 01 01 00 03 a4 00 00 27 a4 00 00 42 43 5e 00 62 32 00 00
nl80211: ifindex=6
nl80211: beacon_int=100
nl80211: beacon_rate=0
nl80211: rate_type=0
nl80211: dtim_period=2
nl80211: ssid=OpenIPC
* beacon_int=100
* dtim_period=2
nl80211: hidden SSID not in use
nl80211: privacy=1
nl80211: auth_algs=0x1
nl80211: wpa_version=0x2
nl80211: key_mgmt_suites=0x2
nl80211: pairwise_ciphers=0x10
nl80211: group_cipher=0x10
nl80211: SMPS mode — off
WPA: Start group state machine to set initial keys
WPA: group state machine entering state GTK_INIT (VLAN-ID 0)
GTK — hexdump(len=16): [REMOVED]
WPA: group state machine entering state SETKEYSDONE (VLAN-ID 0)
wpa_driver_nl80211_set_key: ifindex=6 (wlan0) alg=3 addr=0x7f66008d key_idx=1 set_tx=1 seq_len=0 key_len=16
nl80211: KEY_DATA — hexdump(len=16): [REMOVED]
broadcast key
nl80211: Set wlan0 operstate 0->1 (UP)
netlink: Operstate: ifindex=6 linkmode=-1 (no change), operstate=6 (IF_OPER_UP)
nl80211: TX queue param set: queue=0 aifs=1 cw_min=3 cw_max=7 burst_time=15 --> res=-95
Failed to set TX queue parameters for queue 0.
nl80211: TX queue param set: queue=1 aifs=1 cw_min=7 cw_max=15 burst_time=30 --> res=-95
Failed to set TX queue parameters for queue 1.
nl80211: TX queue param set: queue=2 aifs=3 cw_min=15 cw_max=63 burst_time=0 --> res=-95
Failed to set TX queue parameters for queue 2.
nl80211: TX queue param set: queue=3 aifs=7 cw_min=15 cw_max=1023 burst_time=0 --> res=-95
Failed to set TX queue parameters for queue 3.
nl80211: Set Deny ACL (num_mac_acl=0)
nl80211: Failed to set MAC ACL: -1 (Operation not permitted)
Failed to set deny acl
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
wlan0: Setup of interface done.
ctrl_iface not configured!
Ключевым признаком успеха создания точки доступа будут строки:
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-хвост
Помоги спутнику бороться с космическим мусором в нашей новой игре! ?