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

tcp_speed — скорость TCP по Wi-Fi

Плата подключается к точке доступа Wi-Fi и держит два TCP-порта: на 5001 ПК шлёт данные, плата принимает их и выбрасывает; с 5002 плата шлёт поток, пока ПК не закроет соединение. Скорость считают обе стороны. Клиент для ПК — tcp_speed.py в этой папке.

Имя и пароль сети — опциями CMake, в код они не попадают:

Окно терминала
cmake --preset Release -B build/Speed -DH723_WITH_LUA=OFF -DH723_WITH_SSH=OFF -DH723_WITH_TLS=OFF \
-DH723_RECIPES="tcp_speed" -DTCP_SPEED_SSID="my_wifi" -DTCP_SPEED_PASSWORD="my_password"
cmake --build build/Speed
python ../../tools/dfu_flash.py build/Speed/BoardH723.hex

Без TCP_SPEED_SSID рецепт сам не подключается и ждёт, пока Wi-Fi поднимет /SD/boot.lua (прошивка с Lua). Адрес платы — в логе (IP Address: ...), дальше на ПК:

Окно терминала
python recipes/tcp_speed/tcp_speed.py 192.168.1.50 10

ПК:

PC->board: 25.5 Mbit/s (32833536 B, 10.3 s)
board->PC: 34.8 Mbit/s (43487800 B, 10.0 s)

Плата:

tcp_speed: power save 1 -> 0
IP Address: 192.168.1.50
tcp_speed: listening, rx port 5001, tx port 5002
tcp_speed: rx 32833536 bytes in 10319 ms, 25.4 Mbit/s
tcp_speed: tx 43540480 bytes in 10013 ms, 34.7 Mbit/s

Замеры с роутером TP-Link в диапазоне 2,4 ГГц (ПК подключён к тому же роутеру на 5 ГГц):

Прошивка ПК → плата Плата → ПК
без Lua, SSH и TLS, окна рецепта, энергосбережение выключено 24–25 Мбит/с 33–35 Мбит/с
то же, окна TCP по умолчанию 12 Мбит/с 14 Мбит/с
с Lua и SSH, точка доступа и BLE работают, энергосбережение включено 14–15 Мбит/с 35–37 Мбит/с

Эфир 2,4 ГГц меняется от минуты к минуте: прогоны подряд расходятся на 10–20 %.

  • Окно TCP. Отправитель держит в пути не больше окна получателя и ждёт подтверждений, поэтому скорость не выше «окно / время ответа». В FreeRTOS+TCP окно по умолчанию — половина буфера сокета, 8 сегментов (11,7 КБ). Рецепт задаёт буферы и окна опцией FREERTOS_SO_WIN_PROPERTIES на слушающем сокете, принятые соединения её наследуют. Окно приёма — 32 сегмента: с большим ПК шлёт пачками, очередь на ESP32-C2 переполняется, и TCP на ПК после потерь сбрасывает скорость. Окно отправки — 44 сегмента (64 КБ, предел без масштабирования окна). Глобальные размеры в FreeRTOSIPConfig.h не увеличены: каждый активный сокет (SSH, Lua) занимал бы до 90 КБ кучи.
  • Подтверждения. FreeRTOS+TCP откладывает ACK на полный сегмент до 20 мс — при приёме потока это потолок около 18 Мбит/с. Сборка заменяет задержку на 2 мс (patch_source в examples/BoardH723/CMakeLists.txt), это действует на все сокеты.
  • Энергосбережение. По умолчанию радио ESP32-C2 спит между маяками точки доступа (WIFI_PS_MIN_MODEM), и приём идёт рывками. Рецепт выключает его: wifiSetPowerSaveMode(WIFI_PS_NONE) — плата потребляет больше.
  • Приём без копии. FreeRTOS_recv с флагом FREERTOS_ZERO_COPY отдаёт указатель прямо в буфер сокета, FreeRTOS_ReleaseTCPPayloadBuffer освобождает место.
  • Потолок. Кадры между STM32 и ESP32-C2 идут по SPI 62,5 МГц транзакциями по 1600 байт — около 0,2 мс на кадр, это примерно 40 Мбит/с на отправку. Приём ограничивает ESP32-C2: радио и около 25 КБ свободной памяти на буферы.
  • Прошивка ESP32-C2. Цифры выше получены с актуальной прошивкой esp32c2phy (ветка main): двойной буфер SPI, приём из эфира без копии. Как прошить ESP32-C2 — AGENTS.md, раздел «Прошивка».

Исходники рецепта: recipes/tcp_speed