WiFi-сканнер на ESP8266: ищем сети, анализируем сигнал
WiFi-сканнер на ESP8266 у меня появился после того, как роутер в квартире стал странно тормозить вечером. Купил NodeMCU за 350 ₽, залил скетч сканнера из примеров — и узнал, что в радиусе 30 метров от меня 14 сетей, и 11 из них на 6-м канале. Перевёл свой роутер на 1-й канал — и тормоза ушли. Это и есть «wifi skanner esp8266»: 30 строк кода, два вызова scanNetworks, и понимание, какие сети вокруг и где сигнал сильнее. Без приложений на телефоне, без анализа в настройках роутера — просто плата, которая видит эфир.
Ниже — три варианта сканнера на ESP8266: вывод в Serial (для отладки и анализа за 5 минут), вывод на OLED 0.96" (для портативного сканера в руке), и веб-страница на порту 80 (для просмотра с телефона). Все три — один скелет: WiFi.scanNetworks(), цикл по SSID/RSSI/шифрованию/каналу. Грабли: анонимные сети, скрытые SSID, разница между 2.4 ГГц и 5 ГГц (NodeMCU видит только 2.4).
Зачем сканер WiFi на ESP8266
Телефон показывает список сетей и их силу, но без деталей: канал, шифрование, BSSID. Программы на ПК (inSSIDer, Acrylic WiFi) показывают всё, но требуют установки и часто платные. NodeMCU за 350 ₽ с 30-строчным скетчем закрывает базовые вопросы: какие сети вокруг, на каких каналах, где сигнал сильнее. Применения: выбор канала для роутера, поиск «мёртвых зон» в квартире, отладка своего ESP8266-проекта (видно, находит ли плата сеть), просто любопытство. Сканнер не ловит пакеты и не взламывает — он только слушает beacon-фреймы, как каждое WiFi-устройство.
- NodeMCU V3: 350 ₽, ESP8266, 2.4 ГГц, 14 каналов (1-13 в РФ/EU, 1-11 в US).
- Wemos D1 mini: 300 ₽, тот же чип, компактнее, для портативного сканера.
- OLED 0.96" I2C: 100-150 ₽, для вывода списка сетей в руке.
- Питание: USB-БП 5V/1A, или Li-ion 18650 с повышающим модулем для автономии 4-6 часов.
- Антенна: PCB-антенна на плате, дальность 30-50 м. Внешняя антенна (если есть разъём) — до 200 м.
Сканер в Serial: 30 строк кода
Минимум сканнера — пять вызовов: WiFi.mode(WIFI_STA), WiFi.disconnect(), WiFi.scanNetworks(). Дальше цикл по scanNetworks: для каждого SSID читаем WiFi.SSID(i), WiFi.RSSI(i), WiFi.encryptionType(i), WiFi.channel(i). Вывод в Serial, монитор порта на 115200. Скетч из примеров ESP8266 в Arduino IDE: Файл → Примеры → ESP8266WiFi → WiFiScan. Доработка: сортировка по RSSI (от сильного к слабому), фильтр по каналу, повтор сканирования раз в 30 секунд.
#include <ESP8266WiFi.h> void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100);} void loop() { Serial.println(); Serial.println("=== Scan start ==="); int n = WiFi.scanNetworks(); if (n == 0) { Serial.println("No networks found"); } else { for (int i = 0; i < n; i++) { Serial.print(i + 1); Serial.print(": "); Serial.print(WiFi.SSID(i)); Serial.print(" ("); Serial.print(WiFi.RSSI(i)); Serial.print(" dBm) "); switch (WiFi.encryptionType(i)) { case ENC_TYPE_NONE: Serial.print("OPEN "); break; case ENC_TYPE_WEP: Serial.print("WEP "); break; case ENC_TYPE_TKIP: Serial.print("WPA "); break; case ENC_TYPE_CCMP: Serial.print("WPA2 "); break; case ENC_TYPE_AUTO: Serial.print("WPA* "); break; } Serial.print("ch="); Serial.println(WiFi.channel(i)); delay(10); } } Serial.println("=== Scan done ==="); delay(30000);}Заливаете скетч, открываете монитор порта на 115200 — раз в 30 секунд печатается список сетей: SSID, RSSI в dBm, тип шифрования, канал. RSSI ниже -40 dBm — отлично, -50 до -60 — хорошо, -70 — удовлетворительно, -85 — на грани обрыва. Шифрование OPEN — сеть без пароля, WPA2 — современная защита. Каналы 1-13 в РФ/EU, 1-11 в US — в России разрешены все 13. Подробно про RSSI — в уроке про диагностику сигнала.
Сканер на OLED: портативный вариант
NodeMCU + OLED 0.96" I2C на D1/D2 (SDA/SCL), питание 3V3. Скетч: после сканирования выводим 5 самых сильных сетей на OLED, по 1 строке на каждую. Прокрутка кнопкой на D5 — следующие 5. Корпус 3D-печать или готовый от Xiaomi-термометра (5x5x3 см, 100 ₽). Питание от Li-ion 18650 с повышающим модулем MT3608 — 4-6 часов автономии. Этот вариант в кармане на balcony или в кафе: видишь, какие сети вокруг, и где сигнал сильнее — для выбора точки перезагрузки роутера.
Веб-сканер: список сетей на странице
ESP8266 поднимает веб-сервер на порту 80, при обращении к корню — сканирует и отдаёт HTML-таблицу. Минус: сканирование 5-10 секунд, и страница висит, пока не отдаст результат. Решение: AJAX — JavaScript в странице опрашивает /scan.json раз в 30 секунд и обновляет таблицу без перезагрузки. Скетч на 80 строк, библиотека ESP8266WebServer и ArduinoJson. Подробно про веб-сервер — в уроке про веб-сервер на ESP32; для NodeMCU API идентичен.
Что показывает RSSI и как его интерпретировать
RSSI (Received Signal Strength Indicator) — уровень сигнала в dBm, отрицательные числа от 0 до -100. Чем ближе к 0, тем сильнее: 0 dBm — невозможно, -30 dBm — плата вплотную к роутеру, -50 dBm — комната рядом, -70 dBm — через стену, -85 dBm — на грани обрыва. Зависимость нелинейная: -50 на 30% сильнее -60, но -60 на 50% сильнее -70. Перевод в «проценты» на телефоне — условный, для расчётов используют dBm. Подробно — в уроке про RSSI и диагностику сигнала.
Грабли сканнера WiFi, на которые я наступал
- Скрытые SSID: WiFi.SSID(i) возвращает пустую строку, но сеть в списке. BSSID (MAC) виден, имя нет.
- 5 ГГц сети: NodeMCU видит только 2.4 ГГц, 5 ГГц невидимы. ESP32 (не C3/C6) тоже только 2.4.
- Сканирование 5-10 секунд: в loop() — delay, плата не отвечает на другое. Решение — неблокирующее сканирование через async API.
- Кэш результатов: WiFi.scanNetworks() кэширует до вызова WiFi.scanDelete(), и повторный скан возвращает тот же список. После каждого скана — scanDelete().
- Двойные сети: один роутер с 2.4 и 5 ГГц — два SSID в списке, но NodeMCU видит только 2.4 ГГц-сеть.