Обновить

Детектор WiFi излучения (WiFi дозиметр)

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели25K
Всего голосов 33: ↑32 и ↓1+44
Комментарии82

Комментарии 82

ЗакрепленныеЗакреплённые комментарии

Всё это делается на ESP32-C5. Бонусом WiFi 5GHz

О помню тоже баловался подобным, только без отдельного железа, в виде приложения для Android на телефон.

Ещё делал похожий BLE сканер, с геопозиционированием.

Но вы упираетесь в ограничения Android. Вы не можете просто так взять и поделать что угодно агрессивное в wi-fi/BT, что вам не позволит OS со своими лимитами.

По вопросу в конце темы можно посмотреть на arduino giga wifi. Насчёт gnss не уверен, зато всего остального довольно много, МК STM32H7

Вардрайвинг изобретен много лет назад. Как лаптоп решениями, так и телефонными - тот же Вигл :)

В соло, без комьюнити рисовать карту - утопия.

Нынче делать какое-то такое приложение на микроконтроллере просто глупо. 

Вам не приходила в голову мысль, что все это занятие, что описано в статье - просто бессмысленно и глупо?))

Да, бессмыссленно и безполезно. Не выгодно. Одни расходы.

Но это же жутко интересно! Искренне завидую автору, как он занимается этим бесполезным занятием, читаю с удовольствием)

Почему бесполезная, если к этому добавить проверку на открытую сеть и попытку к ней подключиться и получить какие-то данные, то можно собрать точки бесплатного интернета. Ещё как идея, можно проверять сеть на простые пароли по словарю.

идея - бесполезная.

Бесполезной она может быть для общества, желающего реализовать её с целью извлечения прибыли. Для другой части общества (включая автора идеи) она полезна в качестве обучающего проекта. Но оценка идеи появляется, только когда она становится оформленой и выложенной в общество. В остальных случаях она так и остаётся частью процесса обучения лично автора. Главное, чтобы авторы не принимали её на свой счёт и продолжали заниматься интересующим их делом.

Гугл и так все то получает, если это не запрещено в настройках Settings / Location / Google Location Sharing.

Даркнету это тоже не нужно т.к. уже лет 20 примерно есть полностью волонтерские движухи по сканированию огромных территорий, заканчивающиеся выкладкой даты в централизованную базу и предоставлением доступа через API. Это все счастье валяется в сети бесплатно. Вот так, например, выглядит вайфайная Москва на картах Wigle .

Я решил исследовать окрестности города на наличие источников WiFi излучения.

старому доброму wardriving уже более 20 лет как. помню статьи в журнале ][kep Там конечно обычно что то с внешней антенной для дальности , всякие малины, кэши и хеши.

bluetooth эфир гораздо разнообразнее

любая из многочисленных "альтернатив flipper" на esp32 тоже предоставляет много вариантов для копания с wifi. Самое забавное что даже к flipper полюбили подключать внешний модуль на esp32 для работы с wifi

Ну не знаю . У меня Москва примерно так:

Это меньше, чем в каком-нибудь Сан Франциско, но явно не ноль. Кто-то бродит там с этой программой, сканирует что-то.

В Питере, кстати, по результатам сканирования получились какие-то странные "круги на полях":

Я глянул эти вайфайные круги на обычном спутнике. Там на замле физически находится какая-то круглая фигня диаметром несколько сот метров. Раз, два.

У меня был проект WiFi на транспорте в г.Томск. Я собирал мак адреса сканируя эфир WiFi роутерами и скалдывал в БД. Позднее сделал систему отслеживания автобусов по радиоэфиру, и прикрутил к 2гис. Это не бесполезное занятие, а просто не дооценённая идея до которой еще не дошли массы. Если дело в экономике и дальше так пойдёт, то глонасс скорее всего прикажет долго жить, потребуются альтернативы, и ваши труды не пропадут даром, можете не сомневаться. Там человек выше советовал ESP32-c5, вполне дельное замечание. Если перенесёте проект на эту платформу, и дадите гитхаб ссылку, буду признателен.

Приложение для мобилки интересная тема. Надо бы собрать. Сканить эфир, собирать MAC + геотеги и отправлять на свой сервер. Займусь пожалуй на досуге, всё для этого есть.

Всё это делается на ESP32-C5. Бонусом WiFi 5GHz

Причём есть куча готовых решений. (я про код, если что).
Но пройти пусть самому, это конечно интересней.
Как по мне, идея - бесполезная. Но как пет-проект, вполне.

Почему бесполезная, если к этому добавить проверку на открытую сеть и попытку к ней подключиться и получить какие-то данные, то можно собрать точки бесплатного интернета. Ещё как идея, можно проверять сеть на простые пароли по словарю.

Кажется, вы сейчас предлагаете вторгаться в чужие сети и незаконно использовать их ресурсы.

Про незаконное использование ресурсов это вы придумали. Например, мне было бы просто интересно собраться статистику сетей just for fun без намерения их как-то использовать, лишь чисто научный интерес.

А потом продать накопленную информацию в Даркнете или гуголю для более точного A-GPS/Y-GPS. Или нет? Тогда, зачем лично вам вся эта собранная информация? Мне действительно интересно.

Гугл и так все то получает, если это не запрещено в настройках Settings / Location / Google Location Sharing.

Даркнету это тоже не нужно т.к. уже лет 20 примерно есть полностью волонтерские движухи по сканированию огромных территорий, заканчивающиеся выкладкой даты в централизованную базу и предоставлением доступа через API. Это все счастье валяется в сети бесплатно. Вот так, например, выглядит вайфайная Москва на картах Wigle .

Это все счастье валяется в сети бесплатно. Вот так, например, выглядит вайфайная Москва на картах Wigle .

Красивое! /s

зачем лично вам вся эта собранная информация?

Например, сделать анализ разных частей города или городов между собой и написать статью на хабре, если что-то интересное из этого получится.

идея - бесполезная.

Бесполезной она может быть для общества, желающего реализовать её с целью извлечения прибыли. Для другой части общества (включая автора идеи) она полезна в качестве обучающего проекта. Но оценка идеи появляется, только когда она становится оформленой и выложенной в общество. В остальных случаях она так и остаётся частью процесса обучения лично автора. Главное, чтобы авторы не принимали её на свой счёт и продолжали заниматься интересующим их делом.

Как по мне, идея - бесполезная. 

Сейчас много самокатов (автомобилей) на прокат.
Их сервера могут находить отдельные самокаты по списку WiFi SSID которые их окружаю.

Вы самокаты или автомобили сдаёте в аренду?

Я работал в яндекс.драйв (каршеригн 16k машин) и помню, что они делали навигацию по окружающим сетям.

Яндекс Локатор.

Он некоторое время даже был бесплатный.

У меня был проект WiFi на транспорте в г.Томск. Я собирал мак адреса сканируя эфир WiFi роутерами и скалдывал в БД. Позднее сделал систему отслеживания автобусов по радиоэфиру, и прикрутил к 2гис. Это не бесполезное занятие, а просто не дооценённая идея до которой еще не дошли массы. Если дело в экономике и дальше так пойдёт, то глонасс скорее всего прикажет долго жить, потребуются альтернативы, и ваши труды не пропадут даром, можете не сомневаться. Там человек выше советовал ESP32-c5, вполне дельное замечание. Если перенесёте проект на эту платформу, и дадите гитхаб ссылку, буду признателен.

Всё это делается на ESP32-C5

Или RTL8720DN, что даже лучше.

О помню тоже баловался подобным, только без отдельного железа, в виде приложения для Android на телефон.

Ещё делал похожий BLE сканер, с геопозиционированием.

Да. И это самое правильное решение.

Нынче всю электронику выгоднее проще и дешевле делать на модулях c Embedded Linux внутри с OS Android. Сейчас всё в смартфоне! Люди не хотят носить с собой ничего электронного, кроме своего смартфона.

Нынче делать какое-то такое приложение на микроконтроллере просто глупо. Вы 80% времени потратите на поиск ошибок в цепи электропитания на PCB и 20% времени останется на авральную разработку кода прошивки самого приложения. Разумнее просто взять смартфон и написать приложение для смартфона.

Реалии таковы, что умение программировать user-space приложения под Android на Kotlin или iOS на порядок эффективнее, чем умение программировать System Software для микроконтроллера на Си.

Но вы упираетесь в ограничения Android. Вы не можете просто так взять и поделать что угодно агрессивное в wi-fi/BT, что вам не позволит OS со своими лимитами.

Как будто нейросеть ответила.

Нынче делать какое-то такое приложение на микроконтроллере просто глупо. 

Вам не приходила в голову мысль, что все это занятие, что описано в статье - просто бессмысленно и глупо?))

Да, бессмыссленно и безполезно. Не выгодно. Одни расходы.

Но это же жутко интересно! Искренне завидую автору, как он занимается этим бесполезным занятием, читаю с удовольствием)

Реалии таковы, что умение программировать user-space приложения под Android на Kotlin или iOS на порядок эффективнее, чем умение программировать System Software для микроконтроллера на Си.

Ну не могу успокоится))

Я уже много лет просто мечтаю запрограммировать микроконтроллер на Си, и желательно на голом железе! Я даже купил их парочку, но все никак не найду время...

 мечтаю запрограммировать микроконтроллер на Си

Вот есть методичка по настройки окружения разработчика

Настройка ToolChain(а) для Win10+GCC+С+Makefile+ARM Cortex-Mx+GDB
https://habr.com/ru/articles/673522/

Ох, а вы автор же и есть) И разработчик на микроконтроллерах))

Я воспринял этот комментарий как критику автора в стиле "не надо заниматься этой ерундой, проще купить готовую платформу")

Вардрайвинг изобретен много лет назад. Как лаптоп решениями, так и телефонными - тот же Вигл :)

В соло, без комьюнити рисовать карту - утопия.

А почему не простенькое приложение на телефон?

Если бы я умел программировать под смартфоны, то так и сделал бы.

К стати, есть ли инструкция про то как написать консольное Andriod приложение на чистом Си? Где брать toolchain, брать SDK?

Нет. Наверно потому что под Андроид не на Си пишут.

Это из-за моды какой-то?
Компьютер это универсальный вычислитель, значит должен быть способ cross компиляции приложений из Win для Andriod.

 под Андроид на Си не пишут.

Это противоречит законам физики ?

Дорого и долго, только и всего. Готовых популярных решений нет.

По вопросу в конце темы можно посмотреть на arduino giga wifi. Насчёт gnss не уверен, зато всего остального довольно много, МК STM32H7

https://www.mylnikov.org/ заблокирован смотрю)

Как пользоваться https://www.mylnikov.org/ не ясно.

Да. https://wigle.net/ ничего не показывает про Москву

Он в России частично попадает под блокировку РКН. Сайт показывается, карта нет.

Стартануло у меня с LA и показывало тепловую карту. Стал менять масштаб, чтобы найти свой город на другом континенте - стало показывать DAILY LIMIT как на картинке выше. И даже если вернуться в LA. Ещё требует настойчиво залогиниться. Нахожусь не в РФ.

Ну не знаю . У меня Москва примерно так:

Это меньше, чем в каком-нибудь Сан Франциско, но явно не ноль. Кто-то бродит там с этой программой, сканирует что-то.

В Питере, кстати, по результатам сканирования получились какие-то странные "круги на полях":

У меня всё работает! (с)

А я вот опять открыл и вот опять, сначала показало а потом при зумауте сразу в лимит упало.

В Питере, кстати, по результатам сканирования получились какие-то странные "круги на полях":

Это работа радио электронной борьбы. Происходит подмена GPS координат на круги за пределами города. В Москве та же ситуация. GPS трэкеры рисуют круги над аэропортом Шереметьево.

Я глянул эти вайфайные круги на обычном спутнике. Там на замле физически находится какая-то круглая фигня диаметром несколько сот метров. Раз, два.

Это вытоптали роботы, следуя указаниям GPS! /s

Какая частота опроса окружения? И что самое важно как быстро вы ехали?)

Какая частота опроса окружения?

Раз в 2....4 секунды

И что самое важно как быстро вы ехали?)

Тестировал я из автобуса. Скорость была около 50 км в час.

По дороге до работы и обратно в SD карте оказалось 2k...3k точек доступа.

Это вы ещё pwnagotchi не видели

НЛО прилетело и опубликовало эту надпись здесь

Мне приходится эпизодически кататься на велосипеде

Сочувствуем.

Главное чтоб за шпиона не приняли. А то потом долго придется объяснять что это за устройство с проводочками...

Картина из далеких 90х. Нет не интернетов, не телефонов, ни даже нормальных магазинов с радиодеталями. Собрали с другом передатчик на 22.5 Мгц. Ну просто кварцевый резонатор такой был, другого не было) Мощность - милливат 100-300.

И еще собрали приемник, прямого преобразования. Схема очень простая, сигнал с антенны через фильтр подается на смеситель на двух встречно-параллельных диодах, гетеродин и УНЧ на трех транизисторах. Несмотря на простоту, чувствительность такого приемника очень высокая, доли микровольта.

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

Лет по 18 нам тогда было. На встречу идет бабушка и с интересом смотрит за нашими действиями. И спрашивает "А что это такое вы тут делаете?". Мы молчим, отмахиваемся. Бабушка не отстает "А я знаю, что вы тут делаете! Радиацию меряете!". Что мы ответили - не помню, но бабушка полностью уверовалась, что нас раскусила) И не отстает "Ну и как тут? Нормально?". Мы отвечаем - да-да, все в порядке) А потом бабушка вдруг - "Ну а вот в таком-то месте как?". Называет поселок неподалеку. А там вроде как ракетная часть стояла, ходили слухи, что и с ядерным оружием. Ну мы поддержали ее, ответив: "Да-да, там повышенная" )))

Да, Охотно верю.

Я отлаживал высокоточную навигацию gnss rtk.

Выбирал для полигона детские карусели во дворах. Прямо по методичке от ublox.

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

Вот отчёт про ту работу.

Высокоточная навигация GNSS RTK

https://share.google/gOOhTVjfO8zJj8L0U

Каждый смартфон делает всё то же самое, причем куда более эффективнее. Так как там есть богатое connectivity, чтобы сливать подготовленною карту wifi сетей в здание с пятью углами.

Имхо: esp32-* (я бы выбрал c3 на плате mini, просто потому что она прикольная, хоть и глючная), или сама по себе esp8266. Плюс любой жпс модуль с питанием от 5в. Приправить сверху esp-idf + freeRTOS., хотя в общем пойдет и ардуйня.

Питание от павербанка, запись данных - на внутреннюю флешку.

А ставить доп.контроллер, общаться с есп по юарт, писать на флешку... Слишком много лишних модулей.

Зы: курсач?

ЗЗЫ: ну и чисто красоты для - ищется что-то типа L80-R в smd исполнении, рисуется двусторонняя плата и получается девайс размером примерно 20х20х20мм с торчащим наружу usb-c

Зы: курсач?

Нет. Просто очередное устройство, чтобы тестировать кодовую базу.

Тогда я искренне не понимаю смысла использовать есп в виде uart-приставки. Или просто для фана?

Другого модуля у меня просто не было.

так модуль можно легко перешить с at прошивки на свою и избежать много лишнего

Ну да, выше уже сказали про C5, C6/C61 тоже подошло бы, там стандарты посвежее (мало ли кто гоняет точку доступа в AX only), есть BLE, не менее интересный, так как это всякие умные ТВ, холодильники, тостеры и прочее что не часто меняет свое местоположение. И еспшки это самодостаточные микроконтроллеры, зачем там STM и общение через AT команды?

Какая модуляция используется в WiFi?

OFDM, что даёт куда более интересные возможности чем просто сканить точки вокруг по RSSI:

https://www.youtube.com/watch?v=sXwDrcd1t-E

А почему тогда не ангар для SD?

В ангаре в котором стоит самолет обычно есть много свободного места.
А в гараже все въезжает впритык, как раз как при установке SD карты.

Ну, гараж разный бывает...

Это ваш?

Нет, из интернетов.

Я решил исследовать окрестности города на наличие источников WiFi излучения.

старому доброму wardriving уже более 20 лет как. помню статьи в журнале ][kep Там конечно обычно что то с внешней антенной для дальности , всякие малины, кэши и хеши.

bluetooth эфир гораздо разнообразнее

bluetooth эфир гораздо разнообразнее

Достаточно подойти к витрине МВидео, например.

любая из многочисленных "альтернатив flipper" на esp32 тоже предоставляет много вариантов для копания с wifi. Самое забавное что даже к flipper полюбили подключать внешний модуль на esp32 для работы с wifi

Что мешает Яндексу в навигаторе сделать нечто аналогичное?

Там уже давно всё это есть.

Да ладно? Такое ощущение, что наоборот, стало хуже. То в Крым из Москвы за секунду улетишь, то в Москва реке плаваешь

А вы считаете, что там оно для клиентов?

Здравствуйте! Я из Яндекса. Спасибо, что поделились идеей. Пока не могу сказать, появится ли у нас такая возможность. Обсудим её, когда будем планировать будущие обновления.

Какая же это графомания...

PS Документ со схемой недоступен в гуглдоке.

Приложение для мобилки интересная тема. Надо бы собрать. Сканить эфир, собирать MAC + геотеги и отправлять на свой сервер. Займусь пожалуй на досуге, всё для этого есть.

Держите меня в курсе.

Мой гит в профиле. Сейчас экзамены по учёбе, не шибко хорошо со временем. Летом буду всеми интересности заниматься.

Конечно! Вот отформатированный текст промта для копирования в комментарий на Habr (или любой другой форум/блог). Он готов к вставке “как есть”.

**Промт для нейросети / ТЗ на Android-приложение для вардрайвинга (Wi-Fi + GPS + отправка на PHP/MySQL)**

Коллеги, прошу помощи в генерации кода. Нужно полное Android-приложение на **Java** (API 26+) со следующим функционалом. Готов принять код от нейросети или от разработчика по этому ТЗ.

## Что должно делать приложение

1. Сканировать Wi-Fi точки доступа (MAC, SSID).
2. Одновременно получать GPS-координаты.
3. Сохранять данные в локальную SQLite.
4. Отправлять накопленное на сервер (NGINX + PHP + MySQL).
5. Работать в фоне с уведомлением (Foreground Service).
6. Иметь два экрана: первый запуск (настройка) и главный (статус + лог).
7. В настройках можно менять страну/город/адрес сервера.

## Структура БД на сервере (MySQL)

```sql
CREATE TABLE `wifi_scans` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
    `city` VARCHAR(100) NOT NULL,
    `mac` VARCHAR(17) NOT NULL,
    `latitude` DECIMAL(10,8) NOT NULL,
    `longitude` DECIMAL(11,8) NOT NULL,
    `timestamp` BIGINT UNSIGNED NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `idx_mac` (`mac`),
    INDEX `idx_city` (`city`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Экран первого запуска (FirstRunActivity)

Показывается один раз. Поля:

  • Страна (EditText)

  • Город (EditText)

  • IP или домен сервера (EditText, пример: 192.168.1.100 или myserver.com)

Кнопка «Сохранить и продолжить». После нажатия:

  • Сохранить в SharedPreferences

  • Запустить WifiScanService

  • Перейти на MainActivity

Главный экран (MainActivity)

Элементы сверху вниз:

  • Текстовое поле «Статус: сервер (адрес)»

  • Текстовое поле «Ожидает отправки: N»

  • Кнопка «Настройки» (открывает SettingsActivity)

  • Заголовок «Лог работы»

  • RecyclerView со списком логов (последние 50, обновление каждые 2 секунды)

Каждый лог: время (HH:MM:SS) + сообщение. Цвет текста:

  • INFO – чёрный

  • SUCCESS – зелёный

  • ERROR – красный

Экран настроек (SettingsActivity)

Полностью повторяет форму первого запуска (Страна, Город, Сервер). Кнопки:

  • Отмена (закрыть окно)

  • Сохранить (обновить SharedPreferences, перезапустить WifiScanService, закрыть окно)

Фоновый сервис (WifiScanService)

  • Foreground Service с уведомлением «Wi-Fi Scanner активен»

  • Интервал сканирования 10 секунд (жёстко в коде или из настроек)

  • Шаги каждые 10 секунд:

    1. Проверить разрешения (ACCESS_FINE_LOCATION)

    2. Включить Wi-Fi, если выключен

    3. wifiManager.startScan()

    4. Получить ScanResults

    5. Получить последнюю GPS-координату (LocationManager.GPS_PROVIDER)

    6. Если GPS = null — пропустить сканирование, записать в лог «Нет GPS сигнала»

    7. Для каждого ScanResult сохранить в локальную БД (таблица wifi_cache): MAC, SSID, latitude, longitude, timestamp, страна, город

    8. Записать в лог «Сохранено X сетей»

    9. Запустить UploadManager.tryUpload()

UploadManager

  • Отдельный поток (Executors)

  • Берёт из wifi_cache до 50 записей (getUnsentRecords)

  • Формирует JSON:

[{"city":"Moscow","mac":"AA:BB:CC:DD:EE:FF","latitude":55.7558,"longitude":37.6176,"timestamp":1734567890000}]
  • Отправляет POST на URL: {сервер}/api/upload_wifi.php

  • Заголовки: Content-Type: application/json, X-API-Key: your_secret_api_key_here

  • При HTTP 200 — удаляет отправленные записи из локальной БД

  • При ошибке — оставляет для следующей попытки

  • Логирует результат (успех / ошибка)

Локальная БД (DatabaseHelper)

Таблица wifi_cache

  • id (INTEGER PRIMARY KEY)

  • mac (TEXT)

  • ssid (TEXT)

  • latitude (REAL)

  • longitude (REAL)

  • timestamp (INTEGER)

  • country (TEXT)

  • city (TEXT)

Таблица logs

  • id (INTEGER PRIMARY KEY)

  • message (TEXT)

  • type (TEXT)

  • timestamp (INTEGER)

Методы

  • addWifiRecord(WifiRecord)

  • List getUnsentRecords(int limit)

  • deleteRecords(List)

  • addLog(String message, String type)

  • List getRecentLogs(int limit)

  • int getPendingCount()

Модели

WifiRecord(String mac, String ssid, double lat, double lng, long timestamp, String country, String city)
ScanLog(String message, String type, long timestamp) // + геттеры

PreferencesManager

SharedPreferences:

  • country

  • city

  • server_url

  • is_first_run (boolean)

  • scan_interval (int, секунды, опционально)

  • upload_batch_size (int, опционально)

Методы: set/get для каждого, hasAllSettings()

PHP-скрипт (сервер)

Файл: /api/upload_wifi.php

Логика:

  1. Проверить метод POST

  2. Проверить заголовок X-API-Key

  3. Прочитать JSON из php://input

  4. Подключиться к MySQL

  5. Для каждой записи выполнить INSERT IGNORE (или ON DUPLICATE KEY UPDATE)

  6. Вернуть JSON: {"success": N, "total": M, "errors": []}

Разрешения в AndroidManifest.xml

  • ACCESS_FINE_LOCATION

  • ACCESS_COARSE_LOCATION

  • ACCESS_WIFI_STATE

  • CHANGE_WIFI_STATE

  • INTERNET

  • FOREGROUND_SERVICE

  • WAKE_LOCK

  • ACCESS_BACKGROUND_LOCATION

Технические требования

  • Язык: Java (не Kotlin)

  • minSdk: 26 (Android 8.0)

  • targetSdk: 33 или 34

  • Зависимости в build.gradle: appcompat, material, recyclerview

  • Весь код должен компилироваться в Android Studio без ошибок

Желательно

  • START_STICKY для сервиса

  • Лог хранить последние 500 записей (автоочистка старых)

  • При изменении настроек — сервис перезапускается с новыми параметрами

  • Обработка отсутствия GPS (не сохранять, писать в лог)

Что нужно получить на выходе

Полный архив проекта Android Studio:

  • Все .java файлы по пакетам

  • Все .xml layouts (activity_first_run, activity_main, activity_settings, item_log)

  • AndroidManifest.xml

  • build.gradle (app level)

  • PHP-скрипт upload_wifi.php

Промт для нейросети. ЯП Java Код должен быть готов к копипасте и сборке. Спасибо!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации