Представьте ситуацию: ваше умное устройство на ESP32 должно, с одной стороны, общаться с облачным сервером, отправляя показания датчиков, а с другой — быть доступным для локальной настройки через телефон, даже если интернет недоступен. Казалось бы, для этого нужны два разных Wi-Fi адаптера. Но ESP32 справляется с этим в одиночку. Как у него это получается? Давайте разберемся в магии одновременной работы в режимах точки доступа (AP) и клиента (STA).

Зачем это нужно?

Ситуаций, где требуется "двойная жизнь", множество:

  • Умный дом: Устройство подключено к вашему домашнему Wi-Fi (STA) для управления через интернет, но также создает свою сеть (AP) для быстрой настройки или прямого управления, если основной роутер недоступен .

  • Wi-Fi ретранслятор: ESP32 принимает сигнал от удаленного роутера (STA) и раздает его дальше (AP), расширяя зону покрытия .

  • IoT-шлюз: Устройство собирает данные с датчиков по локальной сети (AP) и отправляет их в облако через основное интернет-соединение (STA) .

Физика процесса: Один радиоинтерфейс на две роли

Секрет кроется не в наличии двух физических чипов, а в умелом распределении времени. У ESP32 один радиомодуль, но он работает по принципу time-division multiplexing (временного мультиплексирования) .

Представьте себе очень быстрого секретаря, который одновременно отвечает на два телефонных звонка. Физически он может говорить только с одним собеседником в конкретный момент, но он настолько быстро переключается между трубками, что создается иллюзия параллельного разговора.

Так же работает и ESP32:

  1. Микроконтроллер выделяет крошечные промежутки времени для обслуживания подключения к вашей домашней сети (режим STA): отправляет данные, слушает "маячки" от роутера.

  2. В следующие микросекунды он переключается на выполнение роли точки доступа (AP): передает свои собственные маячки, чтобы телефоны видели его сеть, и обрабатывает запросы от подключенных к нему устройств .

Это переключение происходит настолько быстро и незаметно для пользователя, что мы воспринимаем это как одновременную работу.

Техническая реализация: Волшебная строчка кода

С программной точки зрения все гениально просто. Чтобы активировать этот режим, нужно всего лишь установить соответствующий режим Wi-Fi модуля с помощью функции WiFi.mode(). Вместо WIFI_AP (только точка доступа) или WIFI_STA (только клиент), мы используем флаг WIFI_AP_STA .

Вот как выглядит базовая настройка в среде Arduino:

#include <WiFi.h>

// Данные для подключения к домашней сети (режим STA)
const char* sta_ssid = "Домашний_WiFi";
const char* sta_password = "Пароль_от_домашнего_WiFi";

// Данные для создания собственной точки доступа (режим AP)
const char* ap_ssid = "ESP32_Local_Network";
const char* ap_password = "12345678";

void setup() {
  Serial.begin(115200);
  delay(1000);

  // Включаем режим "Клиент + Точка доступа"
  WiFi.mode(WIFI_AP_STA);
  Serial.println("Режим AP+STA активирован.");

  // Запускаем собственную точку доступа
  WiFi.softAP(ap_ssid, ap_password);
  Serial.print("Точка доступа запущена. IP: ");
  Serial.println(WiFi.softAPIP());

  // Пытаемся подключиться к домашней сети
  WiFi.begin(sta_ssid, sta_password);
  Serial.print("Подключение к домашней сети...");

  // Небольшая задержка для имитации подключения
  // В реальном коде здесь должен быть асинхронный механизм подключения
  delay(5000); 

  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("\nПодключено к домашней сети!");
    Serial.print("Локальный IP: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("\nНе удалось подключиться к домашней сети.");
  }
}

void loop() {
  // Здесь код может обрабатывать веб-сервер,
  // отвечая на запросы как из локальной сети (AP), так и из интернета (STA)
  delay(10);
}

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

Важное ограничение: Один канал

У этого режима есть одна ключевая особенность. Поскольку физический радиоканал один, и AP, и STA должны работать на одной и той же частоте (канале). Это означает, что канал вашей собственной точки доступа будет принудительно изменен, чтобы соответствовать каналу роутера, к которому вы подключаетесь .

Например, если ваш домашний роутер вещает на 6-м канале, то и ваша сеть ESP32_Local_Network переключится на 6-й канале. Вы не сможете заставить ESP32 работать на 1-м канале в режиме AP, пока он подключен к роутеру на 11-м канале в режиме STA.

Пример из жизни: Умное устройство с безопасным сбросом

Вернемся к коду, который мы обсуждали. В нем как раз реализована эта логика. Устройство всегда находится в режиме WIFI_AP_STA. Точка доступа ESP32_Config работает постоянно, позволяя вам в любой момент зайти на http://192.168.4.1 и изменить настройки. Параллельно с этим STA-интерфейс пытается подключиться к вашей основной сети.

Именно благодаря режиму AP+STA устройство может:

  1. Всегда быть на связи: Вы всегда можете зайти в панель управления, даже если интернет-провайдер недоступен.

  2. Контролировать безопасность: При потере связи с основным роутером (STA отключается), код моментально сбрасывает все выходы в безопасное состояние (LOW), так как основной цикл управления данными с сервера прерывается. При этом локальный веб-интерфейс продолжает работать, сообщая вам о проблеме.

  3. Пытаться восстановить связь: STA-интерфейс, не теряя соединения с вашим телефоном через AP, будет по расписанию предпринимать попытки переподключения к роутеру .

Заключение

Возможность одновременной работы в режимах AP и STA — это не просто технический трюк, а фундаментальная фишка ESP32, которая делает его невероятно гибким инструментом для интернета вещей. Она позволяет создавать по-настоящему отказоустойчивые и удобные в настройке устройства, которые не оставят вас один на один с проблемой, а всегда предоставят локальный доступ для решения вопроса. Все это достигается за счет умного планирования времени одного радиоинтерфейса и одной простой команды WiFi.mode(WIFI_AP_STA).