«Wi-Fi-ловушки», или Как превратить «проходящих мимо» людей в покупателей
Компания Radius WiFi раскрывает возможности для ритейла, о которых, вероятно, вы никогда не слышали. Среди новинок Wi-Fi-сканер Radius Target, который привлекает проходящих мимо магазина людей посредством интернет-рекламы.
Что такое Wi-Fi-сканер
Radius Target и как его использовать Radius Target – это роутер с авторским программным обеспечением, который сканирует все устройства (смартфоны, ноутбуки, планшеты) и собирает их MAC-адреса, чтобы вы настроили на них таргетированную рекламу в myTarget и Яндекс.Директ. Подобная механика позволяет взаимодействовать с офлайн-аудиторией и увеличить эффективность работы, например, с аудиторией интровертов, которые не могут преодолеть психологический барьер и зайти в незнакомый им магазин. Переведите коммуникацию с ними в интернет – и они увидят ваше предложение в соцсетях и на любимых сайтах, где ознакомятся с товарами, услугами и акциями в комфортной для себя обстановке. Максимально сегментируйте офлайн-аудиторию дополнительными настройками и покажите им адресную рекламу:
Или же, наоборот, сохраните рекламный бюджет. Остановите показы объявлений для той аудитории, которая уже посетила ваши торговые точки.
![]() |
| От аудитории не требуется подключение к Wi-Fi-сети. Radius Target улавливает пассивные сигналы мобильных устройств и сохраняет их MAC-адреса на облачном сервере |
Комплектации: стационарный и переносной
Radius Target выпускается в трех комплектациях, чтобы работать с разными офлайн-сегментами. Например:
Интеграция с CRM-системами
Используйте Radius Target в качестве триггера для ваших CRM-систем. Отправляйте уведомления целевой аудитории именно в тот момент, когда она находится рядом с торговой точкой (SMS, push-уведомления, e-mail и т.д.).
Как магазин в торговом центре узнаёт вас по Wi-Fi (точнее, по MAC-адресу) — на базе обычных хотспотов
Телефоны ищут свои «родные» сети, поэтому время от времени отправляют в окружающее пространство пакеты с их запросами. Обычная Wi-Fi-инфраструктура (хотспот, раздающий сеть для персонала магазина) может слушать эти пакеты — не отвергать их, а записывать в лог MAC-адрес и дальность до терминала (по уровню сигнала).
В случае одной точки это используется как счётчик посетителей на уровне «за вчера 182 человека зашло в магазин, из них 34 уже у нас были», а если точек три или больше — можно уже трассировать потоки людей и видеть наиболее интересные им товары:
Ещё раз: никакого спецоборудования, обычные точки Wi-Fi Cisco и софт для обработки их логов. От модели точки доступа Cisco зависит точность. В нашей схеме нужен ещё аплинк до сервера аналитики, где также развёрнут виртуальный контроллер Cisco — точки сгружают ему логи.
Точки доступа обычно ставятся на потолок в торговом центре, вот пример монтажа:
Сами точки, например, вот:
Архитектура решения такая:
Обратите внимание: точки Cisco и так могут отдавать свою телеметрию в Cisco. Чтобы получить к ней доступ на сервере аналитики, нужно развернуть виртуальный контроллер и зарегистрировать в нём точки. Никаких физических касаний — просто туда заносятся серийники текущей инфраструктуры и вводится пароль доступа.
Есть два режима работы: «присутствие» и «месторасположение». Присутствие — это если телефон находится в зоне действия точки и имеет некий уровень сигнала. По сути, просто счётчик пользователей, который также умеет:
— Записывать MAC-адреса для аналитики дальше: как часто клиент возвращается, сколько раз был в других магазинах сети и т. п.
— И фиксировать длительность нахождения в магазине.
Для лучших результатов режима присутствия точку доступа надо монтировать в глубине магазина, а не около входа, иначе будет цепляться по радиусу много людей, проходящих мимо (их можно отсечь на сервере аналитики, но это увеличивает шум в данных).
Режим местоположения хитрее, но требует уже минимум трёх точек:
Есть определение места по триангуляции сигнала. Точки должны стоять определённым образом, и их расположение нужно будет указать с софтине сбора данных. Поскольку интерфейс «плоский», то есть 2D, имеются погрешности при разных высотных уровнях этих точек, и не обрабатываются многоэтажные магазины — на каждый этаж нужно по 3 своих точки.
Настройка новых точек довольно простая, когда всё сконфигурировано:
Есть и третий режим: если Wi-Fi планируется отдавать клиентам (а часто точки доступа ставят именно для этого), то при подключении к SSID магазина начинается уже более точный трекинг: дата-трафик позволяет получать куда больше данных о расположении с меньшими промежутками.
Заявленная точность в обычном режиме — 5–10 метров. В режиме дата-трафика — 3–5 метров. Есть возможность наблюдать в реалтайме. Ну и можно делать страницы приветствия — даже как в метро:
Итого, используя текущую инфраструктуру Циски без закупки новых устройств и без установки всяких iBeacon’ов, можно получить следующие фичи:
Пример монтажа
В мае у нас было 25-летие компании, решили выставить теплокарту помещения: у нас там выставка достижений, фуршетные столы с разными блюдами, улица с едой на огне, сцена и так далее.
Помещение используется для других мероприятий, и в результате для того, чтобы развернуть решение, у нас был ОДИН день. Правильно — приехать на место, провести радиочастотное обследование, выявить, в какие зонах помещения какая мощность сигнала, что как отражает, поглощает и так далее, оценить уровень помех. В помещении музея Москвы нельзя было эти точки нигде вешать, дабы не испортить бетонные стены. Единственным вариантом по установке точек был шанс разместить их на фермах, на которых был свет LED (это такие головы, которые устанавливаются на концертах и крутятся во все стороны). И мы на стяжках к ним присобачивали точки доступа. Это, конечно, было не круто, потому что они металлические, а металл ухудшает сигнал. Плюс бетонные стены. Эти фермы для света поставили только в ночь до мероприятия. Более того, электричество дали только в 11:00. Нам пришлось выдёргивать сменного инженера, который нам протягивал и обжимал провода, т. к. помещение достаточно большое и у нас было три бухты кабеля сетевого.
Cамо мероприятие начиналось в шесть, и в пять всё должно было быть готовым. В итоге картографировать местность с точками мы начали за час до дедлайна, чтобы правильно интерпретировать их местоположение, а также триангулировать местоположение терминалов. Мы быстро всё настроили, вывели изображение с ноутбука и за 10 минут до начала мероприятия с дергающимися глазами начали торжественно демонстрировать возможности Wi-Fi-аналитики. Не делайте так, если есть возможность. Нужно 2 дня, а в идеале с правильным RF-обследованием для высокой точности и монтажом — до недели.
WiFi-радар для сбора MAC-адресов
Стоимость: 6000 руб. Есть тариф без абонентской платы.
Прибор сканирует сеть Wi-Fi и ловит запросы (probe request) на поиск сетей от всех находящихся в радиусе 50 метров смартфонов.
В запросах содержится название сети к которой обычно подключается смартфон, уровень сигнала по которому можно определить на каком расстоянии находится смартфон от радара и MAC-адрес смартфона.
Смартфон излучает эти пакеты независимо от того, подключен ли он к какой либо сети Wi-Fi или нет!
По MAC-адресу можно определить производителя смартфона.
Данные с WiFi радара
Все запросы автоматически выгружаются на облачные сервера для хранения, анализа и выгрузки в системы контекстной рекламы.
Собранная аудитория автоматически выгружается в рекламные системы Яндекс Директ и myTarget.
На сервере в удобном WEB-интерфейсе можно просматривать отчеты и графики по посещаемости клиентов за любой период и выгружать данные для дальнейшей таргетированной рекламы.
Виды WiFi радаров
Wi-Fi радары бывают стационарные (требуется подключение к питанию и наличие Ethernet) и мобильные (работают автономно от аккумулятора, передают данные по сети GSM).
Стационарный wifi радар
Стационарные радары вай фай как правило используются для установки в магазинах, кафе, ресторанах и других местах, где есть проводной интернет и питание 220 Вольт или USB.
Пример стационарного WiFi-радара: https://my-beacon.ru/wifi-radar-targeting/
Стационарный wi-fi радар помимо сбора данных о клиентах также можно использовать для контроля сотрудников и отправки PUSH-уведомлений в мобильное приложение проходящим клиентам.
Мобильный wifi радар
Мобильный wifi radar (или беспроводной/беспроводный) позволяет собирать MAC-адреса на любых мероприятиях: на выставках, презентациях, встречах, в торговых комплексах и т.д.
Данный тип радаров нашел популярность для сбора аудиторий на проводимых тематических мероприятиях, т.к. их посещает лояльно настроенная аудитория которую в дальнейшем легко перевести в разряд своих клиентов показав интересную рекламу.
WiFi аналитика
В отчетах системы WiFi-аналитики можно посмотреть сколько клиентов каждый день проходят мимо точки продаж оснащенной wi-fi радаром, сколько клиентов находятся в его зоне заданное время (например в магазине или кафе проводят более 20 минут) и сколько клиентов проходят мимо.
Полученная статистика помогает отслеживать посещаемость клиентов и оценивать эффективность проведенных рекламных кампаний.
Конверсия клиентов по MAC-адресам
Установив несколько WiFi радаров можно определить популярные маршруты по магазину или выставке, точки интереса клиентов и строить тепловые карты.
Тепловая карта по WiFi радарам
Таргетированная реклама
Основным назначением радара WiFi является сбор MAC-адресов смартфонов для показа таргетированной рекламы.
При этом для рекламы осуществляется геотаргетинг, т.е. рекламыне объявления и баннеры показываются только тем клиентам, которые проходили мимо точки продаж, магазина или кафе, заходили внутрь, или например присутствовали на выставке/мероприятии.
Площадки для wifi таргетинга, т.е. площадки для показа баннерной и контекстной рекламы позволяют взаимодействоать с пользователем (который прошел мимо радара) показывая ему рекламу на огромном количестве сайтов рунета.
В данный момент основные площадки, поддерживающие таргетированный показ рекламы по собранным MAC-адресам смартфонов это Яндекс ( Яндекс Аудитории и Яндекс Директ) и Mail.ru ( система myTarget ).
В Яндекс реклама показывается при поиске по заданным фразам, а также в РСЯ.
Рекламная Сеть Яндекса (РСЯ) — это несколько тысяч самых популярных сайтов рунета, на которых отображаются текстовая и баннерная реклама. Среди самых популярных ресурсов, на которых клиенты увидят ваш рекламный retargeting можно выделить следующие: avito.ru, auto.ru, rabota.ru, mamba.ru и тысячи других площадок.
В состав премиальной аудиторной сети MYTARGET входят следующие площадки (данные на начало 2019 года):
vkontakte.ru одноклассники.ру am.ru banki.ru 100km.ru youla.ru Авто@Mail.Ru Ответы@Mail.Ru 7days.ru 7ya.ru Дети@Mail.Ru Здоровье@Mail.Ru Игры@Mail.Ru Кино@Mail.Ru Леди@Mail.Ru Недвижимость@Mail.Ru Новости@Mail.Ru Погода@Mail.Ru Почта@Mail.Ru Спорт@Mail.Ru adme.ru aif.ru avtovzglyad.ru baby.ru cosmo.ru disgustingmen.com dni.ru drive2.ru eadaily.com eg.ru eurosport.ru fontanka.ru gismeteo.ru glavbukh.ru goodhouse.ru graziamagazine.ru hello.ru Hi-tech@Mail.Ru inopressa.ru inosmi.ru irr.ru ixbt.com iz.ru kakprosto.ru lifehacker.ru m24.ru matchtv.ru mk.ru newsru.com novayagazeta.ru ntv.ru ohotniki.ru restate.ru rg.ru ria.ru russian.rt.com sibnet.ru sovsport.ru spbvoditel.ru spletnik.ru sport-express.ru sportbox.ru starhit.ru svpressa.ru teleprogramma.pro travelata.ru vokrug.tv wday.ru woman.ru womanhit.ru znak.com zr.ru
Список рекламных площадок постоянно увеличивается.
Преимущества таргетированной рекламы
Среди преимуществ таргетированной рекламы по MAC адресам можно выделить следующие:
Дополнительные сервисы которые дает WiFi-радар
Помимо своего основного назначения Wi-Fi радар позволяет использовать дополнительные сервисы, такие как контроль персонала и отправка рекламных PUSH-уведомлений на смартфоны клиентов.
Контроль персонала по WiFi и Bluetooth
По желанию заказчика WiFi радар может быть укомплектован сверхтонкими bluetooth метками (брелками) с протоколом iBeacon. Выдав такие метки сотрудникам магазина вы можете контролировать время прихода и ухода сотрудников, обеденное время, а также строить различные отчеты по эффективности работы и просматривать в режиме реального времени местоположение персонала.
Контроль сотрудников по wifi
PUSH-уведомления
В случае если у заказчика есть мобильное приложение, которым пользуются клиенты или заказчик планирует разработать такое мобильное приложение, то появляется возможность автоматического вывода PUSH-уведомлений при приближении клиента к радару. В PUSH-уведомлении можно выводить текст, фото и видео.
Какой WiFi радар купить
Законность WiFi analytics
Трудности в сборе MAC адресов
В некоторых современных смартфонах для конфиденциальности MAC-адрес подменяется на случайный при каждом запросе на поиск сетей.
Подмена происходит только в том случае, если в данный момент смартфон не подключен к какой-либо сети WiFi.
В результате наши разработчики создали авторский алгоритм выявления и автоматической фильтрации подменных MAC-адресов с помощью анализа производителя, видимых сетей и закономерности в периоде отправки запросов.
Этот алгоритм используется для всех наших клиентов и результаты получаются очень хорошими.
По выборке среди наших клиентов по Москве и Санкт-Петербургу (область недвижимости) за 24 часа получены следующие данные:
Правильных MAC-адресов: 71%
Случайных MAC-адресов: 29% (подменные MAC-адреса)
Из правильных MAC-адресов Яндекс нашел 67% совпадений со своей базой клиентов.
Схожесть пользователей: выше среднего. Т.е. по данной аудитории можно найти похожую аудиторию в Яндекс.
Собрано за день 11407 потенциальных клиентов по MAC-адресам.
Настройка таргетированной рекламы по MAC адресам
Для автоматической выгрузки собранных MAC-адресов в систему контекстной рекламы Яндекс.Аудитории из личного кабинета системы MY BEACON WiFi потребуется не более минуты времени.
Вам нужно зайти в раздел Выгрузка MAC, выбрать устройства и период и нажать кнопку Выгрузить
После успешной загрузки файла в Яндекс Аудиториях появится новый сегмент, который будет обрабатываться около 2 часов.
Выгрузка MAC-адресов с радара
После обработки Яндекс вы сможете посмотреть детальную информацию по сегменту, а также переименовать сегмент.
Сегмент готов. Теперь можно настраивать таргетированную рекламную кампанию.
Для этого в настройках рекламной кампании нажмите Ретаргетинг и подбор аудитории и добавьте вашу собранную по MAC-адресам аудиторию.
Рекламная компания с WiFi радара настроена и готова к запуску.
Хождение по граблям в чистом поле или как собрать MAC-адреса близлежащих Wi-Fi-устройств
Все свои публичные выступления (благо, их не так много) я начинаю с явного или неявного упоминания тезиса “Наша индустрия — сложная, проблемы могут вскрыться на любом, даже самом очевидном шаге, а оптимистично предполагать, что все будет просто и легко — наивно”. Как ни странно, эта простая мысль, полученная многолетним набиванием шишек, порой является откровением и для более опытных специалистов, хотя, казалось бы, весь оголтелый задор и вера в непогрешимость собственных идей и практик должна была выветриться уже давно. Расскажу байку на этот счет, пример простого, с первого взгляда, проекта.

В один прекрасный день товарищ скинул мне ссылку на интересный стартап. Ребята предлагали представителям малого бизнеса из сферы услуг и продаж поставить у себя точку доступа (с captive portal-ом) для своих клиентов, дабы раздавать интернет, попутно собирая MAC-адреса смартфонов людей, проходящих мимо. Цель сего действия весьма простая — большое количество рекламных сетей позволяют таргетироваться по списку адресов устройств, поэтому, направив рекламную компанию на проходящих мимо пользователей, мы с большой долей вероятности получим новых посетителей (потому что близко и “где-то это я уже видел”). Т.е. такая раздача виртуальных флаеров. Товарищ спросил, как это делается и сможем ли мы такое повторить.
Быстрый гуглеж на тему вскрыл механизм такого сбора данных. WiFi-адаптер запускался в режиме прослушивания эфира и бегал по каналам, захватывая пакеты, анализируя их и агрегируя полученные данные. Существовали и готовые открытые утилиты для этого, например, airodump-ng из состава aircrack-ng. Т.е. для повторения нам надо просто запустить эту утилиту, желательно, на отдельном компактном и носимом устройстве, и запихнуть полученные данные в БД, из которой потом уже доставать готовые списки MAC-адресов для рекламных сетей. Вроде бы задача простая, решаемая за один, максимум — два вечера неспешной работы, почти все готово же.
Разумеется, это оказалось ни разу не так.
Как известно, что позволено Юпитеру, то не разрешено быку. И когда в ход идут одноплатники, то приходится жертвовать, в первую очередь вычислительными ресурсами и памятью. Далее, за жертвой ресурсов идет жертва удобства разработки и отладки — тащить инструменты компиляции на устройство позволит не каждая система.
Первоначально мы хотели взять что-то простое и дешевое, например, коробочки Orange Pi Zero, поставить туда airodump-ng и пробросить данные, выплевываемые утилитой на сервер, где благополучно их сложить в базу. У меня был опыт работы с такими распределенными системами с выделенным центром (правда, там в роли рабочих лошадок выступали виртуальные машины, поднимаемые через API облака этим же самым центром по мере необходимости, но не суть), так что часть кода благополучно перекочевала в новый проект.
Инструментом проброса данных на сервер послужило написанное простейшее Erlang-приложение, которое, как предполагалось, будет выдергивать данные с дампера эфира (парсинг), сериализовать их (родной сериализацией Erlang-а) и передавать через web-сокет на сервер по HTTPS (не вызывая подозрений у DPI-систем и не изобретая собственных протоколов). Процессоры Allwinner H2+, которые использовались в Orange Pi, достаточно мощные, чтобы собираться и отлаживаться прямо на устройстве. Опять же, в теории все хорошо.
На практике началось.
1. как оказалось, встроенный WiFi в Orange Pi годился только на то, чтобы подцепиться к точке доступа и швырнуть данные в сервер. Ну, точнее, не сам адаптер, а поддержка его чипсета в ядре. Для большинства IoT проектов этого, наверняка, было бы достаточно. Впрочем, к этому удару мы были готовы, потому что предварительное изучение сайта aircrack-ng дало вполне четкое и неоднозначное “везде это работать не будет, если что — мы не виноваты, список проверенных чипсетов прилагаем”. В списке обнаружились почти все устройства Atheros (купленной Qualcomm) и Ralink (купленной MediaTek), что внушало некоторые перспективы в случае перехода с прожорливых китайских ARM-ов на более аскетичные MIPS-ы из чипсетов для роутеров.
Но, пока это все собирается из соплей и палок, т.е. прототипируется — надо решить проблему здесь и сейчас. Поэтому мы воспользовались такой экзотикой в наше технологичное время (когда беспроводная связь есть в любой зажигалке) как Wi-Fi USB-адаптер. Изучение списка совместимости и сопоставление его с ассортиментом ближайшего магазина выдало жертву — DLink DWA-160 в ревизии C1 (это важно, поскольку другие аппаратные ревизии использовали другой чип и вызывали неиллюзорную головную боль в плане принуждения к работе). Двухдиапазонный, не требующий плясок с драйвером, поскольку поддержка давно в ядре, этот свисток пригодился в дальнейшем и в эксплуатации в других проектах, поэтому я скупил их, наверное, все (пять штук), что оказались доступны в нашем провинциальном городе.
Убедившись в работоспособности устройства, я подключил его к одноплатнику и выключил встроенный WiFi-адаптер с расчетом, что интернет будет доступен через Ethernet-интерфейс.
Вторую свинью подложил aircrack-ng. Этот набор утилит был создан с целью взлома проверки на проникновение WiFi-сетей, т.е. был написан хакерами для хакеров. Не знаю, благодаря какой логике они предпочли использовать дампер эфира беспроводных сетей не в виде традиционного unix-way подхода выплюнуть структурированный текст для последующей обработки, а сделать полноценный term-интерфейс, на котором почти в реальном времени (и с учетом настроек терминала) отображать информацию по обнаруженным сетям и устройствам, но они сделали именно так. Да, я нашел Python API неизвестной степени готовности ко всему этому, но, опять же, паук прототипирования, обитавший в моей голове, жестко запретил тащить еще один язык, переключаться на другой (мы же помним, серверная часть уже была частично готова и написана она была далеко не на Python-е) или, упаси боже, реализовывать airodump-ng самостоятельно на базе tcpdump-а. А, следовательно, надо было искать обходные пути.
К счастью, беспроводные хакеры начали что-то подозревать, что постоянно тупить в интерфейс — такое себе занятие, поэтому реализовали периодическое выкладывание всего найденного и агрегированного в виде CSV-файлов. С задаваемым интервалом. С этим уже можно жить. Разумеется, наивный вариант — запустить утилиту и перечитывать файл по таймеру — тут же дал по рукам. Работающий на ноутбуке, при переносе на одноплатник, он начал сбоить в процессе вычитывания файла по понятным причинам — порой утилита просто не успевала выгрузить все и часть данных безвозвратно терялась.
Решением этого стал механизм inotify в ядре, уведомляющий об файловых операциях — как только мой код видел изменения файла с данными, он инициировал его чтение с небольшой задержкой (скорее, имеющей чисто психологическое значение, успокоить его автора). Проведенные опыты показали, что в этом случае сбоев при чтении и потерь данных не возникает. Ну славно, парсим CSV, укладываем во внутренние структуры и передаем на сервер. На сервере сохраняем в PostgreSQL (спасибо за jsonb) и после этого уже можно делать запросы, формировать выгрузки и т.д. Добавим простейшей авторизации по симметричному ключу, чтобы нам туда не напихали мусора и мы могли бы привязать данные к точке, где установлено устройство, и вроде бы все хорошо, можно в бой.
Ага, сейчас, как же. Тестовая сборка этой цепочки (а написание кода и отладка заняла действительно пару вечеров) вскрыла забавный факт — количество адресов, пойманных за сутки в нашем офисе, достаточно удаленном от публичных проходимых мест, колебалось в районе пары тысяч штук. Да, конечно, рядом была небольшая гостиница (это было в докарантинно-изоляционное время, не удивляйтесь), но все равно, что-то много.
Освежив знание по структуре MAC-адреса и вспомнив факт, что мобильные устройства, зачастую, для сокрытия своего истинного MAC-адреса генерируют локальные адреса, я доработал серверную часть простейшим фильтром, вычищающим все broadcast и local адреса на входе. Список сократился на порядок и уже выглядел похожим на правду. Все было готово к полевым испытаниям.
Как известно, при смене локации с теплого и уютного офиса на беспощадные боевые условия прототипы имеют свойство прекращать нормально функционировать, поэтому процесс внедрения должен сопровождаться поставкой карманного инженера, который будет исправлять все всплывшие недочеты. С другой стороны, также хорошо известно, что устройство, не требующее дополнительных плясок с бубном в начале эксплуатации, скорее всего скоро сломается, причем бесповоротно. Это, наверняка, нашло свое отражение в законах Мерфи, но, увы, автору этих строк лень проверять, в каком именно, поэтому сойдемся на термине “закон подлости”.
Первая установка вскрыла сразу кучу недостатков.
Во-первых, большинство китайских плат для прототипирования поставляется с долгосрочной памятью на MicroSD в противовес NAND/NOR flash чипам. Исключение делается только для мощных SoC, явно избыточных для данной задачи. Увы, MicroSD — это непосредственная головная боль эксплуатационщика — окисление контактных площадок, выход из строя SD-карт, зависимость контактов от температуры внутри корпуса (а она немалая, китайские чипы не являются сильно энергоэффективными, а платы, зачастую, и вовсе рассчитываются сразу исходя из пикового энергопотребления, поэтому без дополнительного радиатора ну никак). Так и оказалось, что при выдергивании питания из устройства система приходила в неработоспособное состояние — повреждались файлы с байт-кодом ERTS, после перезагрузки приложение отказывалось работать.
Второй неприятный момент — на точке установки интернет обеспечивался LTE-роутером и был, мягко говоря, посредственного качества, в отличие от офисного провода. Сеть постоянно искрила, приложение часто переподключалось, а то и вовсе умирало от скопившихся в очередях на отправку сообщений.
Конечно, обе проблемы являются преодолимыми, так, например, потеря данных устранялась бы поиском оптимальной комбинации хорошей MicroSD-карты и настроек файловой системы, а нестабильность соединения можно было бы компенсировать предварительной агрегацией данных, короткими сессиями отправки, разряженными по времени и т.п. Но вскрывшиеся проблемы — это повод задуматься, а правильный ли был выбран путь. Необходимость постоянного соединения с сервером ставила крест на событийных сборах данных, когда устройство вешается на внешнюю батарею питания и забрасывается в рюкзак, владелец которого идет на массовое мероприятие, где, понятно, стабильности соединения ожидать не приходится.
Соответственно, следующий шаг был в отказе от серверной части и локализации хранилища данных прямо на устройстве. Кроме того, во избежание долгих и весьма муторных экспериментов с SD-картами, решено было в следующей итерации использовать макетные платы с flash-чипами.
В это момент я вспомнил, что у меня в коллекции есть замечательная плата Carambola 2 от литовских товарищей 8Devices. А если зайти на их сайт, то можно обнаружить еще более компактное устройство на том же чипе под названием Centipede. Прошлые эксперименты с данным классом устройств показали, что Erlang вполне влезает в отведенные 16 МБайт flash-памяти (и еще немного остается приложению). Единственный минус (который, скорее, даже плюс) — это маломощный MIPS и необходимость кросс-компиляции, что делает сборку Erlang-приложения чуть более нетривиальной. Но это был уже известный маршрут, поэтому я заказал парочку Centipede, а сам пока портировал существующую версию, работающую с сервером, на Carambol-у.
Когда приехали компоненты, начался новый этап. Чип AR9331 успешно поддерживался aircrack-ng из коробки, данные можно забирать с Ethernet-интерфейса, последние версии OpenWRT и ERTS собраны и успешно опробованы. Приложение переписано — часть кода переехала в код устройства, данные накапливались в отдельном процессе и периодически сбрасывались в файл в виде сериализованного Erlang-терма. К этому был нарисован простейший web-интерфейс, получающий данные через websocket. Порты для inotify и erlexec благополучно собраны средствами OpenWRT.
Смущало только одно — на данные оставалось 300 килобайт. Не то, чтобы мало, если хранить только MAC-адреса клиентских устройств, но airodump-ng отдает гораздо больше интересной информации, в том числе адреса точек доступа, их ESSID-ы и прочее, которое тоже неплохо было бы запомнить. На всякий случай. Ладно, будем действовать по обстоятельствам.
Собираем, проверяем. С ходу вскрывается проблема.
OpenWRT, как мы все знаем — это такой минималистичный вариант сборки Linux, который предназначен специально для устройств с ограниченными объемами памяти. Как следствие — оттуда выкинуто то, что можно было выкинуть безболезненно, и упрощенно то, что можно было упростить, в том числе многопользовательский режим. Т.е. обычная практика, когда код стартует от root-а и работает с максимальными привилегиями, что, конечно, облегчает вопросы связанные с группами, пользователями и контроль их действий. Да-да, буква S в аббревиатуре IoT отвечает за безопасность. Беда заключается в том, что erlexec, который я использовал для запуска и управления airodump-ng, не может выполнять операции из-под root-а — для этого ему необходим дополнительный пользователь, от имени которого он будет порождать назначенные ему процессы. А при создании дополнительного пользователя с другим уровнем привилегий… правильно, не дает airodump-у достучаться до сетевого устройства. Выкрутить это ограничение из библиотеки показалось процессом небыстрым, поэтому erlexec был заменен на порты — встроенный механизм запуска сторонних процессов в Erlang. Мелочь, а неприятно.
Итак, устройства получены, перепрошиты и даже работают в тепличных условиях. Цепляем батарею, кидаем коробку в рюкзак, идем в молл. На следующий день смотрим на результат — фиаско, файл данных нулевой длины — либо не хватило места, либо передергивание питания сработало не в очень удачный момент. Правим код, чтобы сохранение происходило в два этапа — сначала создавался временный файл, потом он замещал текущий.
Проверить, впрочем, работоспособность этого варианта руки так и не дошли — в поле зрения попала очередная игрушка — Onion Omega2+ на Mediatek 7688. Как и у их собратьев, конструктора LinkIt Smart 7688, там было много всего, но самое главное — вдвое больше flash-памяти, а, значит, уже можно не переживать за нехватку места для хранения данных. Окей.
Заказываем, ждем. Месяц. Два. Терпение лопается — пишем американцам на предмет “где товар, Зин”. Тишина. Открываем спор на PayPal. Американцы просыпаются. Говорят “Ой, у нас система приема заказов сбойнула, сейчас все пришлем”. Высылают, ждем три недели. Фух, устройство на руках и даже работает.
Тут надо сделать небольшое отступление — при том, что у меня в шаговой доступности лежало несколько плат LinkIt Smart, я не рассматривал их в качестве платформы, потому как в самом начале эпопеи попытка использовать их как устройства захвата провалилась. Тогда драйвера для чипа поставлялись в виде собранных модулей под конкретные версии ядра и, видимо, это и стало причиной неработоспособности. В последних версиях OpenWRT появилась как родная поддержка 7688, так и открытый драйвер, так что это повод пересмотреть подход к данным устройствам.
Впрочем, наличие WiFi прямо на чипе было принято использовать по прямому назначению — все-таки устройству нужен хоть какой-нибудь интерфейс управления, причем и в полевых условиях тоже, хотя бы для того, чтобы понять, работоспособно оно или не очень. Посмотреть на полученные данные тоже было бы небесполезно.
Соответственно, комбинируем предыдущие подходы — используем единственный выведенный на MiniDoc USB-интерфейс под WiFi-свисток для сканирования пространства, а встроенный WiFi — для управления устройством в виде маломощной точки доступа. Собираем, проверяем, все работает.
Но аппетит приходит во время еды. Начнем с того, что файл с данными в виде Erlang-сериализации — удел настоящих маньяков, а чуть более широкому спектру специально обученных профессионалов надо что-то попроще. Опять же, помимо складывания данных от airodump-а хотелось бы еще и точное время измерения, и, желательно, хоть какая-то привязка к расположению устройства в пространстве.
Встраиваем между WiFi-свистком и устройством USB-хаб. Настройки (а они зависят от положения устройства на шине в случае OpenWRT) идут лесом, но это уже незначительные мелочи. Правим. Вытаскиваем из завалов USB-GPS приемник, благо, уже проверенный временем и с написанным кодом разбора NMEA-0183 (код, конечно же, все равно пришлось подправить). Проверяем — устройство благополучно не обнаруживается системой, явно нехватка драйверов. Собираем драйвера USB Serial и закидываем на устройство — тоже тишина. Потом вспоминаем, что в больших системах GPS-свисток обнаруживался не как ttyUSBx, а как ttyACMx, т.е. USB GSM modem. Ну отлично, второй заход на добавление драйверов, успех.
Берем код, интегрируем в приложение. Добавляем в приложение sqlite3 в качестве хранилища. Теперь не надо будет проверять наличие записи в состоянии и вообще работа с данными упрощается до небольшого количества строчек. Собираем все в кучу, учим при добавлении данных забирать показания GPS, правим JS-код на мордочке для отображения в случае неполного набора данных (может случится, когда GPS еще не поймал спутники, а данные сканирования эфира уже идут). Проверяем работу — вроде живет. Можно объявлять промежуточную победу.
За пару недель бесперебойной работы — куча данных как по станциям в эфире, так и по клиентам. Теперь борюсь с искушением предложить это устройство инфобезовцам для контроля эфира на вверенных территориях и государству для контроля за перемещением телефонов граждан. Шутка, конечно же, они и так сами все знают.
Так вот, все вышеописанные мытарства — это только pet-проект с очень низкой сложностью (почти сразу было понятно, что и как делать), отсутствием разработки аппаратной части (привет, физика) и выходом на сколько-нибудь более-менее завершенное изделие. Нет, конечно, нельзя исключить, что автор этих строк — дремучий дилетант, а настоящие гуру проходят этот путь за один вечер в промежутке между вечерним чаем и рюмкой коньяка, но пока опыт показывает только одно: ИТ это сложно и оптимизм здесь наказуем финансово, репутационно и мотивационно, а те, кто говорит “там все просто” — либо гении, либо жулики, причем второе более вероятно.









