Все свои публичные выступления (к счастью, их не так много) я начинаю с явного или неявного упоминания тезиса «Наша отрасль сложна, проблемы могут возникнуть на любом, даже самом очевидном шаге, и наивно оптимистично предполагать что все будет просто и легко».
.
Как ни странно, эта простая идея, полученная путем многих лет попаданий в неприятности, иногда оказывается откровением для более опытных специалистов, хотя, казалось бы, весь бешеный энтузиазм и вера в непогрешимость собственных идей и практик давно должны были угаснуть.
назад. Расскажу вам об этом историю, пример простого на первый взгляд проекта.
В один прекрасный день друг прислал мне ссылку на интересный стартап .
Ребята предложили представителям малого бизнеса из сферы услуг и продаж установить точку доступа (с каптивным порталом) для своих клиентов, чтобы раздавать интернет, попутно собирая MAC-адреса смартфонов проходящих мимо людей.
Цель этого действия очень проста – большое количество рекламных сетей позволяют таргетинг по списку адресов устройств, поэтому направив рекламную кампанию на проходящих мимо пользователей, мы, скорее всего, получим новых посетителей (ведь это близко и «я где-то это уже видел»).
Те.
такая раздача виртуальных флаеров.
Друг спросил, как это сделано и можем ли мы повторить это.
Быстрый поиск в Google по этой теме выявил механизм сбора таких данных.
WiFi-адаптер запустился в режиме широковещательного прослушивания и бегал по каналам, перехватывая пакеты, анализируя их и агрегируя полученные данные.
Для этого были готовые открытые утилиты, например airodump-ng от aircrack-нг .
Те.
повторюсь, нам просто нужно запустить эту утилиту, желательно на отдельном компактном и носимом устройстве, и запихнуть полученные данные в базу данных, из которой потом можно будет извлечь готовые списки MAC-адресов рекламных сетей.
Вроде простая задача, решаемая за один, максимум два вечера неторопливой работы, и почти все готово.
Конечно, этого не произошло.
Как известно, то, что позволено Юпитеру, не позволено Быку.
А при использовании одноплатных карт приходится жертвовать, в первую очередь, вычислительными ресурсами и памятью.
Далее, после жертвования ресурсами идет жертва простоты разработки и отладки — не каждая система позволит перетащить на устройство инструменты компиляции.
Изначально мы хотели взять что-то простое и дешевое, например коробки.
Оранжевый Пи Ноль , устанавливаем туда airodump-ng и пересылаем выдаваемые утилитой данные на сервер, где их можно безопасно сохранить в базе данных.
У меня был опыт работы с такими распределенными системами с выделенным центром (правда, «рабочими лошадками» там были виртуальные машины, поднятые через облачное API тем же центром по мере необходимости, но это не главное), поэтому часть кода благополучно перекочевала в новый проект .
Инструментом для пересылки данных на сервер было написанное простое Erlang-приложение, которое должно было извлекать данные из воздушного дампера (парсинг), сериализовать их (native Erlang сериализация) и передавать через веб-сокет на сервер по HTTPS (без вызывая подозрения системы DPI и не изобретая собственных протоколов).
Процессоры Allwinner H2+, используемые в Orange Pi, достаточно мощны, чтобы их можно было собирать и отлаживать непосредственно на устройстве.
Опять же, теоретически все в порядке.
На практике это началось.
1. как оказалось, встроенный в Orange Pi WiFi годился только для того, чтобы подключиться к точке доступа и закинуть данные на сервер.
Ну точнее не сам адаптер, а поддержка его чипсета в ядре.
Для большинства проектов Интернета вещей этого, вероятно, будет достаточно.
Однако мы были готовы к этому удару, поскольку предварительное изучение сайта aircrack-ng дало весьма четкую и двусмысленную информацию «это не везде будет работать, если что, это не наша вина, список проверенных чипсетов прилагаем».
В список вошли почти все устройства Atheros (куплен Qualcomm) и Ralink (куплен MediaTek), что предполагало некоторые перспективы в случае перехода от энергоемких китайских ARM к более аскетичным чипсетам MIPS для роутеров.
Но пока это все собрано из соплей и палок, т.е.
прототипировано - проблему надо решать здесь и сейчас.
Поэтому мы воспользовались таким экзотическим в наше технологическое время устройством (когда в любой зажигалке доступна беспроводная связь) как USB-адаптер Wi-Fi. Изучение списка совместимости и сравнение его с ассортиментом ближайшего магазина выявило жертву - DLink DWA-160 в ревизии С1 (это важно, поскольку другие аппаратные ревизии использовали другой чип и вызывали неиллюзорную головную боль в плане заставить его работать).
Двухдиапазонный, не требующий танцев с драйвером, так как поддержка уже давно есть в ядре, данный свисток пригодился в будущем для использования в других проектах, так что я, наверное, купил все (штук пять), которые были в наличии в нашем провинциале город.
Убедившись в работоспособности устройства, я подключил его к одноплатнику и отключил встроенный WiFi-адаптер в расчете на то, что Интернет будет доступен через интерфейс Ethernet.
Вторую болванку подложил aircrack-ng. Данный набор утилит создан с целью взлома тестирования на проникновение сетей Wi-Fi, т.е.
написан хакерами для хакеров.
Я не знаю, почему воздушный дампер беспроводной сети решили использовать не в виде традиционного unix-way подхода по выкладыванию структурированного текста для последующей обработки, а для создания полноценного терминального интерфейса, на котором информация отображается практически в реальном времени (и с учетом настроек терминала) по обнаруженным сетям и устройствам, но именно это и сделали.
Да, я нашел для всего этого Python API неизвестной степени готовности, но, опять же, паук прототипирования, живший у меня в голове, категорически запрещал перетаскивать другой язык, переходить на другой (помним, серверная часть уже была частично готова и написано было далеко не на Python) или, не дай бог, реализовать airodump-ng самостоятельно на базе tcpdump. И, следовательно, нужно было искать обходные пути.
К счастью, беспроводные хакеры начали подозревать, что постоянно возиться с интерфейсом — это непростая задача, поэтому они реализовали периодическую загрузку всего найденного и агрегированного в виде CSV-файлов.
С указанным интервалом.
С этим уже можно жить.
Разумеется, с наивным вариантом — запустить утилиту и перечитать файл по таймеру — сразу разобрались.
Работая на ноутбуке, при пересадке на одноплатное устройство он начинал глючить в процессе чтения файла по понятным причинам – иногда утилита просто не успевала все выгрузить и часть данных безвозвратно терялась.
Решением этой проблемы стал механизм inotify в ядре, уведомляющий о файловых операциях — как только мой код видел изменения в файле данных, он инициировал его чтение с небольшой задержкой (скорее, имея чисто психологическое значение, чтобы успокоить свой автор).
Эксперименты показали, что в этом случае не происходит сбоев чтения или потери данных.
Ну и отлично, парсим CSV, раскладываем по внутренним структурам и передаем на сервер.
Сохраняем на сервере в PostgreSQL (спасибо за jsonb) и после этого можно делать запросы, создавать закачки и т.д. Давайте добавим простейшую авторизацию по симметричному ключу, чтобы нас там мусором не забивали и мы могли привязываем данные к точке, где установлено устройство, и вроде бы все нормально, можно идти в бой.
Да, сейчас, конечно.
Тестовая сборка этой цепочки (а написание кода и отладка фактически заняли пару вечеров) выявила забавный факт — количество ловимых за день адресов в нашем офисе, довольно далеком от общественных мест, колебалось в районе пары тысяч.
Да, конечно, рядом была небольшая гостиница (это было в докарантинное и изоляционное время, не удивляйтесь), но все равно ее было много.
Освежив знания по Структура MAC-адреса и помня о том, что мобильные устройства часто генерируют локальные адреса, чтобы скрыть свой истинный MAC-адрес, я модифицировал серверную часть простым фильтром, очищающим на входе все широковещательные и локальные адреса.
Список сократился на порядок и уже выглядел похоже на правду.
Все было готово к полевым испытаниям.
Как известно, при смене локации из теплого и уютного офиса в беспощадные боевые условия прототипы имеют свойство переставать нормально функционировать, поэтому процесс внедрения должен сопровождаться наличием карманного инженера, который исправит все всплывшие дефекты.
С другой стороны, также общеизвестно, что устройство, не требующее дополнительных танцев с бубном в начале эксплуатации, скорее всего, скоро выйдет из строя, причем безвозвратно.
Вероятно, это отражено в законах Мерфи, но, увы, автору этих строк лень проверить, в каком именно, поэтому остановимся на термине «закон подлости».
Первая установка сразу выявила кучу недостатков.
Во-первых, большинство китайских макетных плат оснащены долговременной памятью MicroSD, а не флэш-чипами NAND/NOR. Исключение сделано лишь для мощных SoC, которые для данной задачи явно избыточны.
Увы, MicroSD - это прямая головная боль оператора - окисление контактных площадок, выход из строя SD-карт, зависимость контактов от температуры внутри корпуса (а она немалая, китайские чипы не очень энергоэффективны, а платы зачастую рассчитываются сразу исходя из пикового энергопотребления, так что без дополнительного радиатора никак).
Так вот получилось, что при отключении питания устройства система стала неработоспособной - были повреждены файлы с байт-кодом ERTS, а после перезагрузки приложение отказалось работать.
Второй неприятный момент — в месте установки интернет обеспечивался LTE-роутером и был, мягко говоря, посредственного качества, в отличие от офисных кабелей.
Сеть постоянно глючила, приложение часто переподключалось, а то и вовсе умирало от накопившихся в очередях отправки сообщений сообщений.
Конечно, обе проблемы преодолимы, например, потерю данных можно было бы исключить, найдя оптимальное сочетание хорошей карты MicroSD и настроек файловой системы, а нестабильность соединения можно было бы компенсировать предварительной агрегацией данных, короткими сессиями отправки, разрежением времени, и т. д. Но выявленные проблемы – повод задуматься, правильный ли путь был выбран.
Необходимость постоянного подключения к серверу положила конец сбору данных о событиях, когда устройство подвешивается на внешний аккумулятор и забрасывается в рюкзак, владелец которого отправляется на массовое мероприятие, где, конечно, нельзя ожидать стабильная связь.
Соответственно, следующим шагом стал отказ от серверной части и локализация хранилища данных непосредственно на устройстве.
Кроме того, чтобы избежать долгих и очень утомительных экспериментов с SD-картами, в следующей итерации было решено использовать макетные платы с флеш-чипами.
В этот момент я вспомнил, что у меня в коллекции есть замечательная доска.
Карамбола 2 от литовских товарищей 8Устройств .
А если зайти на их сайт, то можно найти еще более компактное устройство на том же чипе под названием Сороконожка .
Прошлые эксперименты с этим классом устройств показали, что Erlang хорошо вписывается в отведенные 16 МБ флэш-памяти (и еще немного остается для приложения).
Единственный минус (что, скорее, даже плюс) — маломощность MIPS и необходимость кросс-компиляции, что делает сборку Erlang-приложения немного более нетривиальной.
Но это был уже известный маршрут, поэтому я заказал пару Сороконожек, а сам портировал на Карамболь имеющуюся версию, работающую с сервером.
Когда приехали комплектующие, начался новый этап.
Чип AR9331 успешно поддержался aircrack-ng из коробки, данные можно брать с интерфейса Ethernet, последние версии OpenWRT и ERTS скомпилированы и успешно протестированы.
Приложение было переписано — часть кода была перенесена в код устройства, данные накапливались в отдельном процессе и периодически сбрасывались в файл в виде сериализованного Эрланга-терма.
Для этого был нарисован простой веб-интерфейс, получающий данные через вебсокет. Порты для уведомлять И эрлексек успешно собран с использованием OpenWRT. Смущало только одно: для данных оставалось 300 килобайт. Дело не в том, что недостаточно хранить только MAC-адреса клиентских устройств, но airodump-ng дает гораздо больше интересной информации, включая адреса точек доступа, их ESSID и т. д., которые тоже неплохо было бы запомнить.
На всякий случай.
Ладно, будем действовать по обстоятельствам.
Собираем и проверяем.
Проблема обнаруживается сразу.
OpenWRT Как мы все знаем, это минималистичная сборка Linux, разработанная специально для устройств с ограниченной памятью.
В результате то, что можно было выкинуть безболезненно, было выброшено, а то, что можно было упростить, было упрощено, в том числе и многопользовательский режим.
Те.
Обычно код запускается от имени пользователя root и работает с максимальными привилегиями, что, конечно, упрощает вопросы, связанные с группами, пользователями и контролем их действий.
Да-да, буква S в аббревиатуре IoT означает безопасность.
Проблема в том, что эрлексек , который я использовал для запуска и управления airodump-ng, не может выполнять операции от имени root — для этого ему нужен дополнительный пользователь, от имени которого он будет порождать назначенные ему процессы.
А когда вы создаете дополнительного пользователя с другим уровнем привилегий.
правильно, это предотвращает попадание airodump на сетевое устройство.
Откручивание этого ограничения из библиотеки показалось медленным процессом, поэтому erlexec заменили на порты — встроенный механизм запуска сторонних процессов в Эрланге.
Это мелочь, но неприятная.
Итак, аппараты получены, перепрошиты и даже работают в тепличных условиях.
Подключаем аккумулятор, бросаем коробку в рюкзак и отправляемся в торговый центр.
На следующий день смотрим результат - фиаско, файл данных нулевой длины - то ли места не хватило, то ли блок питания не сработал в очень удачный момент. Редактируем код так, чтобы сохранение происходило в два этапа — сначала создается временный файл, затем он заменяет текущий.
Однако проверить работоспособность этой опции мы так и не дошли - на глаза попалась еще одна игрушка - Лук Омега2+ на Медиатек 7688. Как и их собратья, дизайнер LinkIt Smart 7688 , там было Много всего , но самое главное — в два раза больше флеш-памяти, а значит, вам больше не придется беспокоиться о нехватке места для хранения данных.
ХОРОШО.
Заказываем и ждем.
Месяц.
Два.
Терпение на исходе — пишем американцам о «где товар, Зин».
Тишина.
Откройте спор на PayPal. Американцы просыпаются.
Они говорят: «Ой, у нас система приема заказов дала сбой, сейчас все отправим».
Присылают, ждем три недели.
Уф, аппарат на руках и даже работает.
Здесь нужно сделать небольшое отступление - несмотря на то, что у меня в шаговой доступности было несколько плат LinkIt Smart, я не рассматривал их как платформу, поскольку в самом начале эпопеи попытка использовать их в качестве устройств захвата не удалась .
На тот момент драйвера для чипа поставлялись в виде собранных модулей для конкретных версий ядра и, видимо, это и было причиной неработоспособности.
Последние версии OpenWRT имеют как встроенную поддержку 7688, так и открытый драйвер, так что это повод пересмотреть подход к этим устройствам.
Однако наличие WiFi непосредственно на чипе было принято использовать по прямому назначению — ведь устройству нужен хоть какой-то интерфейс управления, да и в полевых условиях тоже, хотя бы для того, чтобы понять, работает ли оно.
или нет. Также было бы полезно посмотреть на полученные данные.
Соответственно, мы объединяем предыдущие подходы — используем единственный на MiniDoc USB-интерфейс для WiFi-свистка для сканирования пространства, а встроенный WiFi для управления устройством как маломощную точку доступа.
Собираем, проверяем, все работает. Но аппетит приходит во время еды.
Начнём с того, что файл данных в виде Эрланг-сериализации — удел настоящих маньяков, а чуть более широкому кругу специально обученных специалистов нужно что-то попроще.
Опять же, помимо сложения данных с аэродампа, хотелось бы еще точное время измерения и, желательно, хоть какую-то привязку к местоположению аппарата в пространстве.
Встраиваем USB хаб между WiFi свистком и устройством.
Настройки (а они зависят от положения устройства на шине в случае OpenWRT) идут хорошо, но это мелочи.
Редактируем.
Вытаскиваем из-под завалов USB-GPS приемник, благо он уже проверен временем и с написанным код парсинг NMEA-0183 (код, конечно, еще пришлось подправить).
Проверяем — устройство не успешно определяется системой, явно не хватает драйверов.
Собираем драйвера USB Serial и заливаем их в устройство - тоже тишина.
Тогда мы помним, что в больших системах GPS-свисток определялся не как ttyUSBx, а как ttyACMx, т.е.
USB GSM-модем.
Что ж, отлично, вторая попытка добавления драйверов, успех.
Берем код и интегрируем его в приложение.
Добавьте sqlite3 в приложение в качестве хранилища.
Теперь не будет необходимости проверять наличие записи в состоянии, и в целом работа с данными упрощена до небольшого количества строк.
Собираем все воедино, учим снимать показания GPS при добавлении данных, редактируем JS код на лице для отображения в случае неполного набора данных (это может произойти, когда GPS еще не поймал спутники, но эфир данные сканирования уже выполняются).
Проверяем работу - вроде работает. Можно объявить промежуточную победу.
За пару недель бесперебойной работы очень много данных как по станциям в эфире, так и по клиентам.
Сейчас борюсь с искушением предложить это устройство информбезопасникам для контроля эфира на вверенных территориях и государству для контроля перемещения телефонов граждан.
Шучу, конечно, они и так все знают. Итак, все вышеописанные мытарства — это всего лишь любимый проект с очень низкой сложностью (почти сразу было понятно, что и как делать), отсутствием аппаратной разработки (привет, физика) и выпуском более-менее полноценного продукта.
Нет, конечно, нельзя исключать, что автор этих строк - плотный дилетант, и настоящие гуру проходят этот путь за один вечер в промежутке между вечерним чаем и рюмкой коньяка, но пока опыт показывает лишь одно вещь: ЭТО сложно и оптимизм здесь наказуем и финансово и репутационно и мотивационно, а те, кто говорит "там все просто" - либо гении, либо аферисты, причем второе более вероятно.
Теги: #Беспроводные технологии #iot #Разработка для Интернета вещей #Сделай сам или сделай сам #erlang #Erlang/OTP #OpenWRT #wi-fi #Airodump-ng
-
Лучшие Домашние Принтеры
19 Oct, 24 -
3 Стратегии Улучшения Интернет-Маркетинга
19 Oct, 24 -
Приливы И Отливы
19 Oct, 24 -
Как Устроить Праздник Для Компании
19 Oct, 24