Перейти к содержимому

ESP32 WiFi в симуляторе

Платы ESP32 в Velxio поставляются с рабочим WiFi. Эмулируемое радио сканирует, подключается, получает IP-адрес по DHCP и выходит в интернет через NAT-шлюз эмулятора. Это реальный стек WiFi из SDK производителя, работающий на эмулируемом радио, а не заглушка: тот же скетч, без изменений, работает на физическом чипе.

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

  1. Откройте пример из галереи Connect to WiFi (/example/esp32-wifi-connect) или перетащите любую плату ESP32 на холст и вставьте приведенный ниже скетч.
  2. Нажмите Run (Запуск). Первая компиляция сеанса занимает больше времени; последующие кэшируются.
  3. Откройте монитор Serial (Последовательный порт) на панели инструментов под холстом.
  4. Наблюдайте за подключением: собственные сообщения SDK при загрузке, затем аренда DHCP.
#include <WiFi.h>
const char* WIFI_SSID = "Velxio-GUEST"; // встроенная, открытая сеть
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.printf("\nConnected. IP: %s\n", WiFi.localIP().toString().c_str());
Serial.printf("Gateway: %s\n", WiFi.gatewayIP().toString().c_str());
Serial.printf("RSSI: %d dBm\n", WiFi.RSSI());
}
void loop() {}

Монитор последовательного порта показывает подключение и адрес, выданный эмулируемым DHCP-сервером:

Монитор последовательного порта: Connecting to Espressif, затем Connected with IP 10.13.37.42, MAC-адрес и уровень сигнала

Всех удивляет одна вещь в первый раз: в журнале написано Connecting to Espressif, хотя в скетче указано Velxio-GUEST. Это работает перезапись SSID, и следующий раздел объясняет это.

IP-адрес реален внутри симуляции: сокеты, HTTP-клиенты и MQTT библиотеки работают, начиная с этого момента. Смотрите MQTT и HTTP для полных проектов.

Без части точки доступа на холсте радио передает сигналы четырех демонстрационных сетей. Станция подключается ровно к одной из них:

SSID Канал Сигнал Аутентификация
Velxio-GUEST 6 -20 dBm Открытая
PICSimLabWifi 1 -25 dBm WPA2-PSK
Espressif 5 -30 dBm WPA2-PSK
MasseyWifi 10 -40 dBm WPA2-PSK

Пока в проекте нет части точки доступа, имя сети, которое вы пишете, — это не та сеть, к которой подключается плата. На пути к эмулятору компилятор перезаписывает каждый литерал SSID на Espressif и обнуляет каждый литерал пароля, будь то переменная, массив, #define или поле структуры:

const char* ssid = "MyHomeNetwork"; // компилируется как "Espressif"
#define WIFI_PASS "hunter2" // компилируется как ""

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

Стоит знать два следствия:

  • Добавление части точки доступа отключает перезапись. С этого момента проект определяет собственное воздушное пространство, поэтому то, что вы вводите, существует, и SSID должен соответствовать части.
  • Прошивка, которая поступает уже собранной, никогда не проходит через перезапись. Она ищет SSID, встроенный в двоичный файл, поэтому в остальном рабочий .bin может находиться в состоянии сбоя подключения. Либо пересоберите его, указав одну из четырех сетей выше, либо транслируйте ожидаемый SSID с помощью части точки доступа.
import network
import time
WIFI_SSID = "Velxio-GUEST"
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.connect(WIFI_SSID)
while not sta.isconnected():
time.sleep(0.25)
print("Connected. ifconfig:", sta.ifconfig())

sta.scan() возвращает те же сети, которые видит API Arduino, в виде кортежей (ssid, bssid, channel, rssi, authmode, hidden).

С планом Maker вы не ограничены демонстрационными сетями. Часть WiFi Access Point (Точка доступа WiFi) заставляет эмулируемое радио транслировать ваш SSID.

  1. Нажмите Add Component (Добавить компонент) на панели инструментов холста.
  2. Найдите WiFi Access Point и разместите его. Ему не требуется подключение: у него нет контактов, это воздушное пространство.
  3. Выберите часть и установите ssid на нужную сеть, например HomeNet.
  4. Укажите это имя в скетче и нажмите Run.
WiFi.begin("HomeNet"); // SSID на вашей части Access Point

Часть WiFi Access Point на холсте рядом с платой ESP32, транслирующая HomeNet на канале 6

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

Свойство По умолчанию Что делает
ssid MyNetwork Имя сети, к которой подключается ваш скетч.
password пусто Сохраняется и отображается на карточке. Сеть по-прежнему транслирует открытую аутентификацию, пока не появится WPA2, поэтому скетчи, передающие пароль, все равно подключаются.
channel 6 Канал WiFi, от 1 до 13. Сообщается при сканировании.
rssi -50 Уровень сигнала в дБм, как его видит плата, от -90 до -20. Повторные сканирования дают небольшие колебания в несколько дБ, как в реальных условиях.
internet вкл Выкл. делает сеть изолированной: плата подключается и получает IP, но ничто не маршрутизируется наружу.
bssid пусто MAC-адрес точки доступа. Пустое значение означает стабильный адрес, сгенерированный из SSID.

Попробуйте в один клик: Connect to your own WiFi network (/example/esp32-custom-wifi-ap) открывается с уже размещенной частью. Запуск сканирует, находит ровно вашу сеть и подключается к ней:

Монитор последовательного порта: сканирование показывает только HomeNet, затем плата подключается и получает IP

Добавьте по одной части на сеть, чтобы протестировать выборщик или политику «самый сильный первым». Каждая часть имеет свой канал и сигнал, поэтому сканирование возвращается упорядоченным так же, как в реальности:

int n = WiFi.scanNetworks();
for (int i = 0; i < n; i++) {
Serial.printf("%2d: %-16s ch %2d %d dBm\n",
i + 1, WiFi.SSID(i).c_str(), WiFi.channel(i), WiFi.RSSI(i));
}

Scan several WiFi networks (/example/esp32-wifi-scan-multi) поставляется с тремя частями: HomeNet на -40 дБм, Office_5G на -62 дБм и CoffeeShop на -78 дБм.

Выключите internet на части, и сеть станет изолированной. Плата подключается и получает аренду DHCP, но ни один трафик не выходит наружу. Это сценарий подготовки: устройство запускается, не находит выхода и обслуживает свою собственную страницу конфигурации.

Captive portal on an isolated network (/example/esp32-wifi-captive-portal) настраивает это с точкой доступа с именем SetupAP.

Значок WiFi появляется на панели инструментов холста когда вы нажимаете Run, и исчезает при остановке: он принадлежит запущенной симуляции, поэтому его нечего открывать до ее запуска. Он серый, пока стек загружается, и зеленый, как только плата получает адрес.

Значок — это разделенная кнопка. Иконка сохраняет свое действие в один клик: при наличии IP-адреса она открывает веб-сервер платы через IoT-шлюз. Каретка рядом с ней открывает WiFi panel (панель WiFi):

Панель WiFi, показывающая сети в эфире для этого проекта, Download PCAP и раздел локального шлюза

Панель показывает:

  • Networks on the air (Сети в эфире), с каналом и сигналом. Заголовок говорит this project (этот проект), когда части точки доступа определяют их, и built-in (встроенные), когда четыре демонстрационные сети в эфире:

    Панель WiFi со списком четырех встроенных сетей с их каналами и уровнями сигнала

  • состояние подключения платы и ее IP-адрес после завершения DHCP;

  • Download PCAP (Скачать PCAP), трафик 802.11 за сеанс в виде файла захвата;

  • раздел local network gateway (локальный сетевой шлюз). По плану Maker в нем есть поле сопряжения; по бесплатному плану объясняется, что делает шлюз, и даются ссылки на планы.

  1. Нажмите Run и дайте скетчу выполнить свою сетевую работу.
  2. Откройте панель WiFi и нажмите Download PCAP.
  3. Откройте файл в Wireshark.

Захват содержит управляющие кадры, DHCP, DNS и TCP с метками симулированного времени, поэтому dhcp или dns в качестве фильтра отображения изолирует квитирование, которое вы отлаживаете. Файл создается в вашем браузере: ничего не загружается.

Сети, описанные выше, маршрутизируются в публичный интернет. Чтобы получить доступ к MQTT-брокеру, Home Assistant или серверу разработки, работающему на вашем компьютере, запустите локальный шлюз: смотрите Local network gateway. Скетчи затем обращаются к вашему компьютеру как host.velxio.internal.

Пример Что показывает
Connect to WiFi Минимальное подключение к встроенной сети
Scan WiFi networks scanNetworks() против встроенного набора
Connect to your own WiFi network Одна часть точки доступа, сканирование и подключение
Scan several WiFi networks Три сети с разными каналами и сигналом
Captive portal on an isolated network internet выкл., процесс подготовки
NTP clock over your WiFi UDP-запросы к реальному серверу времени
Fetch JSON from a web API HTTPClient против реального REST API
Reach a service on your own network host.velxio.internal через локальный шлюз
MQTT Публикация и подписка на публичном брокере
Симптом Причина Исправление
Загруженная прошивка никогда не подключается Ее SSID встроен, поэтому компилятор не смог его переписать Укажите встроенную сеть или добавьте часть точки доступа с этим SSID
Сканирование возвращает только ваши сети Работает как задумано: одна часть точки доступа отключает встроенный набор Удалите части, чтобы вернуть демонстрационные сети
Подключается и получает IP, но ничто не маршрутизируется наружу На части выключен internet Включите его, если только вы не тестируете captive-портал
Пароль не отклоняется Эмуляция WPA2 еще не реализована, сеть транслирует открытую аутентификацию Пока ожидаемо; пароль сохраняется на части
host.velxio.internal не разрешается Нет сопряженного локального шлюза Смотрите Local network gateway

WiFi доступен во всем симулированном семействе ESP32: классические платы ESP32, ESP32-S3, ESP32-C3, ESP32-C6 и ESP32-C5, а также их варианты XIAO, Nano и M5Stack. Raspberry Pi Pico W имеет собственную эмуляцию CYW43. Состояние рекламы Bluetooth также сообщается для скетчей, которые инициализируют BLE.