Время чтения: 15 минут | Польза: Высокая – создайте профессиональный инструмент для анализа Wi-Fi сетей
Эта статья предоставит вам полный код и подробные инструкции по созданию Wi-Fi сканера на ESP32 с удобным HTML интерфейсом. Вы сможете сканировать доступные сети, видеть их названия и уровень сигнала в реальном времени через веб-браузер.
Основные возможности проекта:

#include <WiFi.h>
#include <WebServer.h>
WebServer server(80);
// Глобальные переменные
const int scanInterval = 5000; // Интервал сканирования в миллисекундах (5 секунд)
unsigned long lastScanTime = 0;
// Настройки точки доступа
const char* apSSID = "ESP32_WiFi_Scanner";
const char* apPassword = "12345678";
// Функция для генерации HTML контента
String getHTMLContent() {
String html = "<!DOCTYPE html>";
html += "<html><head>";
html += "<meta charset='UTF-8'>";
html += "<meta http-equiv='refresh' content='5'>"; // Автоматическое обновление каждые 5 секунд
html += "<title>ESP32 Wi-Fi Scanner</title>";
html += "<style>";
html += "body { font-family: Arial, sans-serif; margin: 20px; background-color: #f5f5f5; }";
html += "h1 { color: #2c3e50; text-align: center; margin-bottom: 30px; }";
html += "table { border-collapse: collapse; width: 100%; max-width: 800px; margin: 0 auto; }";
html += "th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }";
html += "th { background-color: #3498db; color: white; font-weight: bold; }";
html += "tr:nth-child(even) { background-color: #f9f9f9; }";
html += "tr:hover { background-color: #e8f4f8; }";
html += ".strong { color: #27ae60; font-weight: bold; }";
html += ".medium { color: #f39c12; font-weight: bold; }";
html += ".weak { color: #e74c3c; font-weight: bold; }";
html += ".info { text-align: center; color: #7f8c8d; margin-bottom: 20px; }";
html += ".ap-info { background-color: #e8f4f8; padding: 15px; border-radius: 5px; margin-bottom: 20px; }";
html += "</style>";
html += "</head><body>";
html += "<h1> ESP32 Wi-Fi Scanner</h1>";
html += "<div class='ap-info'>";
html += "<p><strong>Точка доступа:</strong> " + String(apSSID) + "</p>";
html += "<p><strong>Пароль:</strong> " + String(apPassword) + "</p>";
html += "<p><strong>IP адрес ESP32:</strong> 192.168.4.1</p>";
html += "</div>";
html += "<p class='info'>Последнее обновление: " + String(millis()/1000) + " сек назад</p>";
html += "<table><tr><th>SSID</th><th>Сила сигнала (dBm)</th><th>Качество</th><th>Канал</th><th>Защита</th></tr>";
return html;
}
void setup() {
Serial.begin(115200);
// Настройка точки доступа
WiFi.softAP(apSSID, apPassword);
IPAddress IP = WiFi.softAPIP();
Serial.print("AP IP address: ");
Serial.println(IP);
// Запуск веб-сервера
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP сервер запущен");
Serial.println("Подключитесь к точке доступа: " + String(apSSID));
Serial.println("IP адрес: 192.168.4.1");
}
void loop() {
unsigned long currentTime = millis();
// Проверка времени для нового сканирования
if (currentTime - lastScanTime > scanInterval) {
lastScanTime = currentTime;
WiFi.scanNetworks(true); // Асинхронное сканирование
}
server.handleClient(); // Обработка HTTP запросов
}
void handleRoot() {
String html = getHTMLContent();
int n = WiFi.scanComplete();
if (n == -2) {
// Сканирование в процессе
html += "<tr><td colspan='5' style='text-align: center; font-style: italic;'>Сканирование в процессе...</td></tr>";
} else if (n == -1) {
// Ошибка сканирования
html += "<tr><td colspan='5' style='text-align: center; color: #e74c3c;'>Ошибка сканирования!</td></tr>";
WiFi.scanNetworks(true); // Повторное сканирование
} else {
// Вывод найденных сетей
for (int i = 0; i < n; i++) {
// Определение качества сигнала
String rssiClass = "weak";
String qualityText = "Слабый";
if (WiFi.RSSI(i) > -60) {
rssiClass = "strong";
qualityText = "Отличный";
} else if (WiFi.RSSI(i) > -75) {
rssiClass = "medium";
qualityText = "Хороший";
}
// Определение типа защиты
String securityType = "Открытая";
int encryptionType = WiFi.encryptionType(i);
if (encryptionType == WIFI_AUTH_WPA2_PSK || encryptionType == WIFI_AUTH_WPA_WPA2_PSK) {
securityType = "WPA2";
} else if (encryptionType == WIFI_AUTH_WPA_PSK) {
securityType = "WPA";
} else if (encryptionType == WIFI_AUTH_WEP) {
securityType = "WEP";
} else if (encryptionType == WIFI_AUTH_OPEN) {
securityType = "Открытая";
}
html += "<tr>";
html += "<td>" + WiFi.SSID(i) + "</td>";
html += "<td class='" + rssiClass + "'>" + String(WiFi.RSSI(i)) + "</td>";
html += "<td class='" + rssiClass + "'>" + qualityText + "</td>";
html += "<td>" + String(WiFi.channel(i)) + "</td>";
html += "<td>" + securityType + "</td>";
html += "</tr>";
}
// Очистка данных и запуск нового сканирования
WiFi.scanDelete();
WiFi.scanNetworks(true);
}
html += "</table></body></html>";
server.send(200, "text/html", html);
}
#include <WiFi.h> // Основная библиотека для работы с Wi-Fi на ESP32 #include <WebServer.h> // Библиотека для создания веб-сервера
WebServer server(80); // Веб-сервер на порту 80 (стандартный HTTP порт) const int scanInterval = 5000; // Интервал сканирования 5 секунд unsigned long lastScanTime = 0; // Хранит время последнего сканирования // Настройки точки доступа const char* apSSID = "ESP32_WiFi_Scanner"; // Имя точки доступа const char* apPassword = "12345678"; // Пароль точки доступа
setup() - настройка точки доступа.void setup() {
Serial.begin(115200);
// Настройка точки доступа
WiFi.softAP(apSSID, apPassword); // Создаем точку доступа
IPAddress IP = WiFi.softAPIP(); // Получаем IP адрес точки доступа
Serial.print("AP IP address: ");
Serial.println(IP); // Выводим IP в монитор порта
// Запуск веб-сервера
server.on("/", handleRoot);
server.begin();
Serial.println("HTTP сервер запущен");
Serial.println("Подключитесь к точке доступа: " + String(apSSID));
Serial.println("IP адрес: 192.168.4.1");
}
Ключевые моменты:
WiFi.softAP() создает точку доступа вместо подключения к роутеруWiFi.softAPIP() возвращает IP адрес точки доступа (всегда 192.168.4.1)Файл > Предпочтенияhttps://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Скетч > Подключить библиотеку > Менеджер библиотекESP32 Arduino > ESP32 Dev ModuleВ режиме точки доступа:
Ctrl+Shift+M или Инструменты > Монитор порта)AP IP address: 192.168.4.1 HTTP сервер запущен Подключитесь к точке доступа: ESP32_WiFi_Scanner IP адрес: 192.168.4.1
ESP32_WiFi_Scanner12345678http://192.168.4.1Важно: Интерфейс доступен только с устройств, подключенных к точке доступа ESP32!


Измените эти значения в начале кода:
const char* apSSID = "MyWiFiScanner"; // Новое имя точки доступа const char* apPassword = "mysecurepass"; // Новый пароль (минимум 8 символов)
Измените значение в начале кода:
const int scanInterval = 10000; // 10 секунд
Добавьте в функцию handleRoot() перед выводом сетей:
int minRSSI = -80; // Минимальный уровень сигнала для отображения
for (int i = 0; i < n; i++) {
if (WiFi.RSSI(i) > minRSSI) {
// Код вывода для этой сети
}
}

Решение:
Решение:
http://192.168.4.1Решение:

Преимущества режима точки доступа:
Применение:

Вы создали полноценный Wi-Fi сканер на ESP32, работающий в режиме точки доступа. Этот инструмент не требует подключения к внешней Wi-Fi сети и создает собственную сеть для доступа к веб-интерфейсу.
Ключевые особенности режима точки доступа:
Следующие шаги:
Дополнительные материалы:
Теперь у вас есть мощный инструмент для анализа Wi-Fi сетей, работающий в полностью автономном режиме!
Понравилась статья Создаем Wi-Fi сканер на ESP32 с удобным веб-интерфейсом? Не забудь поделиться с друзьями в соц. сетях.
А также подписаться на наш канал на VK Видео, вступить в группу Вконтакте.
Спасибо за внимание!
Технологии начинаются с простого!
Фотографии к статье
Читайте также
Мы в соц сетях
Комментарии