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/Speedpython ../../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 -> 0IP Address: 192.168.1.50tcp_speed: listening, rx port 5001, tx port 5002tcp_speed: rx 32833536 bytes in 10319 ms, 25.4 Mbit/stcp_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
