Wifi радар для сбора mac своими руками

WiFi Радар
своими руками

Технологии WiFi Радар позволяют фильтровать рандомизированные MAC-адреса и увеличивать сбор «чистых» MAC. Механизмы дерандомизации являются коммерческой тайной.

Радаром может являться любой Wi-Fi роутер. Все что требуется это установить специальное ПО WiFi Радар. Для унификации компания сосредоточилась на наиболее распространенных моделях.

В соответствии со стандартом 802.11 (Wi-Fi) любое мобильное устройство периодически рассылает запросы (probe request) для поиска точек доступа. Ответом на такие запросы является сообщение от точки доступа (probe response) с указанием ее характеристик и параметров подключения.

Можно обобщить наиболее распространенные случаи когда происходит рассылка probe request:

· Включение Wi-Fi модуля.
· Запуск (ручной) сканирования ближайших точек доступа.
· Пробуждение устройства из режима сна через нажатие кнопки.
· Пробуждение устройства по команде от приложения или операционной системы.
· Периодическая рассылка для актуализации списка точек доступа

Данный механизм является вспомогательным, так как информацию о точках доступа пользовательские устройства получают путем прослушивания эфира на наличие маяков (beacon) в которых также указывается информация о точке доступа и ее параметрах.

Помимо широковещательного probe request пользовательское устройство может отправлять персональный запрос выбранной точке доступа для того чтобы удостовериться в ее работоспособности. Периодически пользовательские устройства производят рассылку для всех сохраненных Wi-Fi сетей методом простого перебора, пытаясь найти хотя бы одну точку поблизости.

ПО WIFI Radar v.2 является новой технологией компании WiFi Радар, реализующей активный трекинг (отслеживание) MAC адресов мобильных устройств. Отличие активного трекинга от пассивного заключается в том, что помимо прослушивания радар производит функцию дерандомизации тех устройств, которые пытаются скрыть настоящий MAC адрес. В итоге, при помощи ряда определенных методик, WIFI Radar узнает реальный MAC адрес и обнаруживает устройство. При этом, мобильное устройство может быть не подключено ни к одной Wi-Fi сети.

Поскольку, с iOS версии 12.0, Android версии 8.0, а так же на многих устройствах по инициативе производителя функциональность рандомизации по умолчанию включена, все больше мобильных устройств становятся недоступными для пассивных радаров прошлого поколения. Так же, начиная с Android версии 9.0 и с IOS версии 12.0 рандомизация осуществляется в режиме «per SSID», то есть для каждого имени точки доступа устройство генерирует и хранит индивидуальный MAC адрес.

Наш прогноз заключается в том, что к 2022 году каждое мобильное устройство будет по умолчанию скрывать свой MAC адрес. По многочисленным тестам в реальных условиях, уже сегодня активный радар дает ощутимое преимущество и позволяет собрать от 80% до 100% MAC адресов, в то время как пассивный радар, относящийся к предыдущему поколению, позволяет собрать лишь 60% и менее.

Момент рассылки широковещательных запросов определяется пользовательским устройством и зависит от операционной системы, версии ПО, модели беспроводного чипа и других факторов.

Рандомизация MAC адресов

Поскольку, рассылка широковещательных probe request делается достаточно часто, это позволяет отследить конкретное устройство и даже восстановить путь его перемещения. Это позволяет злоумышленникам или спецслужбам производить слежку, а также совершать атаки на заранее выбранное устройство. Для избежания подобных рисков были разработаны методики рандомизации MAC адреса.

Основной метод заключается в том, что при отправке широковещательных и персональных probe request вместо реального MAC адреса, устройством производится подстановка случайного MAC адреса, не являющегося каким-либо образом связанным с данным устройством. Такой MAC адрес назначается единовременно ради проведения сканирования и время его жизни равно от нескольких секунд до нескольких минут. Далее MAC адрес заменяется на новый, случайный и больше никогда не используется. Таким образом, устройства могут генерировать запросы без раскрытия своего MAC адреса.

Дерандомизация MAC адресов

Если на probe request с рандомизированным MAC адресом пользовательское устройство получает ответ, то оно инициирует подключение к точке доступа, так как считает что она находится поблизости. По стандарту пользовательское устройство должно использовать свой реальный MAC адрес для подключения. На практике устройства либо пытаются инициировать подключение и в случае неудачи отправляют probe request с реальным MAC адресом. Либо после получения probe response сразу же отправляют еще один probe request уже с реальным MAC адресом. Либо с использованием своего реального MAC адреса пытаются подключить к сети.

Источник

Wi-Fi радар для сбора MAC-адресов

Сегодня для отслеживания и анализа целевой аудитории, интернет-маркетологи используют не только данные из счетчиков посетителей, но и более продвинутые методы, например сбор MAC-адресов при помощи Wi-Fi сенсора.

Такое устройство можно разместить в кафе, гостинице, кинотеатре, чтобы собрать информацию о посетителях. Статистика показывает, что более 50% пользователей не отключают функцию Wi-Fi на своих смартфонах, что позволяет их отслеживать в режиме реального времени.

Зачем компании собирают MAC-адреса своих клиентов?

Сбор MAC-адресов мобильных устройств активно используется в маркетинге для формирования портрета клиента. Маркетолог выгружает список MAC-адресов в сервис Яндекс.Аудитории, и тем самым, создает сегмент обезличенных пользователей.

После добавления собранных MAC-адресов, сервис подбирает всю известную информацию о владельце устройства (интересы, геолокации, поведение) и формирует список анонимных ID для настройки рекламных кампаний в агрегаторах Яндекса (Директ, Дисплей). В дальнейшем этот сегмент используется для таргетирования рекламных предложений.

Мониторинг MAC-адресов в беспроводных сетях может быть незаконным, особенно в сетях, которыми вы не владеете. Пожалуйста, ознакомьтесь с законами вашей страны. Материал опубликован в ознакомительных целях.

Запуск Wi-Fi радара

Скрипт, который будет работать на базе нашего сенсора, вычисляет количество людей поблизости, используя смартфоны в качестве прокси. Телефоны находящиеся в зоне покрытия определяются на основе фрейм-запросов, так называемых probe request.

Возможное использование howmanypeoplearearound включает в себя: мониторинг окружения и пешеходного движения, сбор MAC-адресов. Вероятно, он был разработан для использования на миниатюрных устройствах, например Raspberry Pi etc.

Подготовка рабочей среды

Для запуска скрипта нам потребуется:

  • Устройство с предустановленным Linux (например, Ubuntu);
  • Python ⩾ 2.7;
  • tshark.

Любая антенна с поддержкой Monitor Mode (режима мониторинга):

  • Чип RT3070;
  • Panda PAU5;
  • Alfa AWUSO36NH;
  • Sabrent NT-WGHU;
  • и др.
Читайте также:  Как отрегулировать карбюратор ваз 21213 своими руками

Установка Python 3

Python и установщик пакетов pip, должен быть установлен на вашем компьютере. Я использую Ubuntu 18.04, в которой Python уже предустановлен и не хватает только установщика pip:

Установка pip для Python 2.7

Установка pip для Python 3

Установка tshark

Если на компьютере не установлен Wireshark, выполните:

Если установлен, выполните команду для установки tshark:

Затем обновите его для запуска без получения полномочий root:

Установка скрипта

В новых версиях Ubuntu при установке pip могут возникнуть проблемы, как решить проблему Unable to locate package, читайте по ссылке.

Мониторинг устройств

Подключаем антенну к компьютеру и выполняем команду:

Выбираем адаптер для сканирования, кладем рядом с собой устройство, а лучше несколько, с включенной функцией Wi-Fi:

Дожидаемся окончания операции:

Скрипт определил поблизости 6 мобильных устройств. Но, где найти или как вывести MAC-адреса?

Чтобы выгрузить их, воспользуемся флагами из справки, например:

После окончания сканирования, находим в домашней директории файл test.json

Результат сбора MAC-адресов

Точность сканирования

Точность сканирования устройств зависит от того, как часто смартфон проверяет связь с сетью Wi-Fi (что происходит каждые 1–10 минут, если Wi-Fi не отключен).

Ошибки при запуске

Если не работают команды или встречается ошибка «command not found», выполните:

Источник

Хождение по граблям в чистом поле или как собрать 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-проект с очень низкой сложностью (почти сразу было понятно, что и как делать), отсутствием разработки аппаратной части (привет, физика) и выходом на сколько-нибудь более-менее завершенное изделие. Нет, конечно, нельзя исключить, что автор этих строк — дремучий дилетант, а настоящие гуру проходят этот путь за один вечер в промежутке между вечерним чаем и рюмкой коньяка, но пока опыт показывает только одно: ИТ это сложно и оптимизм здесь наказуем финансово, репутационно и мотивационно, а те, кто говорит “там все просто” — либо гении, либо жулики, причем второе более вероятно.

Источник

Оцените статью