• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP32 - Не совместим с WiFi модулями смартфонов на Android? (Внутри тесты IPerf)

Evgeniy932

New member
Добрый день.
Столкнулся с проблемами с передачей данных между ESP32-D0W и Android.
ESP32 в режиме точки доступа.
По TCP - потери пакетов, задержки при доставке пакетов до нескольких секунд, по WireShark - TCP Retransmits.
Пропускная способность - в 5-10 раз меньше, чем если подключиться к ESP32 с ноутбука.
Пробовал WebSockets, но видимо ошибки на низком уровне, даже WebSockets нестабильно работает.

Обмен данными между ESP32 и Android построен так:
Android (3 байта запрос, пока не получен ответ следующий запрос не будет отправлен) -> TCP / WEBSockets -> ESP32
ESP32 (1136 байт ответ) -> TCP/WebSockets -> Android

При этом на ноутбуке с windows пропускная способность достаточная: 20 мбит/с, пакеты не теряются

Вопрос: как можно решить эту проблему? Подходит даже вариант - выбрать другой WiFi SOC.

IDF v4.4
Привожу тесты IPERF:

Код:
============================
TEST1
Xiaomi Mi A2 Lite  (Android)  +  ESP32
============================

ESP32
Interval Bandwidth
   0-   3 sec       3.79 Mbits/sec
   3-   6 sec       3.94 Mbits/sec
   6-   9 sec       3.88 Mbits/sec
   9-  12 sec       3.67 Mbits/sec
  12-  15 sec       3.96 Mbits/sec
  15-  18 sec       3.90 Mbits/sec
  18-  21 sec       3.98 Mbits/sec
  21-  24 sec       3.20 Mbits/sec
  24-  27 sec       3.70 Mbits/sec
  27-  30 sec       3.54 Mbits/sec
   0-  30 sec       3.76 Mbits/sec

XIAOMI MI A 2 lite:  Client connecting to 192.168.4.1, TCP port 5001
TCP window size:  512 KByte (default)
------------------------------------------------------------
[  3] local 192.168.4.2 port 47965 connected with 192.168.4.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0- 1.0 sec   640 KBytes  5.24 Mbits/sec
[  3]  1.0- 2.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  2.0- 3.0 sec   384 KBytes  3.15 Mbits/sec
[  3]  3.0- 4.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  4.0- 5.0 sec   384 KBytes  3.15 Mbits/sec
[  3]  5.0- 6.0 sec   384 KBytes  3.15 Mbits/sec
[  3]  6.0- 7.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  7.0- 8.0 sec   384 KBytes  3.15 Mbits/sec
[  3]  8.0- 9.0 sec   640 KBytes  5.24 Mbits/
[  3]  9.0-10.0 sec   384 KBytes  3.15 Mbits/sec
[  3] 10.0-11.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 11.0-12.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 12.0-13.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 13.0-14.0 sec   384 KBytes  3.15 Mbits/sec
[  3] 14.0-15.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 15.0-16.0 sec   256 KBytes  2.10 Mbits/sec
[  3] 16.0-17.0 sec   640 KBytes  5.24 Mbits/sec
[  3] 17.0-18.0 sec   384 KBytes  3.15 Mbits/sec
[  3] 18.0-19.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 19.0-20.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 20.0-21.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 21.0-22.0 sec   384 KBytes  3.15 Mbits/sec
[  3] 22.0-23.0 sec   640 KBytes  5.24 Mbits/sec
[  3] 23.0-24.0 sec   384 KBytes  3.15 Mbits/sec
[  3] 24.0-25.0 sec   384 KBytes  3.15 Mbits/sec
[  3] 25.0-26.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 26.0-27.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 27.0-28.0 sec   512 KBytes  4.19 Mbits/sec
[  3] 28.0-29.0 sec   384 KBytes  3.15 Mbits/sec

============================
TEST2
Thinkpad X1 Carbon (Windows 10)  +  ESP32
============================
ESP32
   0-   3 sec       20.52 Mbits/sec
   3-   6 sec       20.62 Mbits/sec
   6-   9 sec       20.41 Mbits/sec
   9-  12 sec       20.40 Mbits/sec
  12-  15 sec       20.33 Mbits/sec
  15-  18 sec       20.33 Mbits/sec
  18-  21 sec       19.67 Mbits/sec
  21-  24 sec       19.73 Mbits/sec
  24-  27 sec       20.32 Mbits/sec
  27-  30 sec       19.83 Mbits/sec
   0-  30 sec       20.22 Mbits/sec

Thinkpad   X1  Carbon:
[ ID] Interval       Transfer     Bandwidth
[320]  0.0- 3.0 sec  7.38 MBytes  20.6 Mbits/sec
[320]  3.0- 6.0 sec  7.38 MBytes  20.6 Mbits/sec
[320]  6.0- 9.0 sec  7.25 MBytes  20.3 Mbits/sec
[320]  9.0-12.0 sec  7.38 MBytes  20.6 Mbits/sec
[320] 12.0-15.0 sec  7.25 MBytes  20.3 Mbits/sec
[320] 15.0-18.0 sec  7.25 MBytes  20.3 Mbits/sec
[320] 18.0-21.0 sec  7.00 MBytes  19.6 Mbits/sec
[320] 21.0-24.0 sec  7.13 MBytes  19.9 Mbits/sec
[320] 24.0-27.0 sec  7.25 MBytes  20.3 Mbits/sec
[320] 27.0-30.0 sec  7.13 MBytes  19.9 Mbits/sec
write failed: Software caused connection abort
[320]  0.0-31.5 sec  72.4 MBytes  19.3 Mbits/sec
 

Evgeniy932

New member
Пробовал отключать WiFi Power Saving на ESP32 - это не помогло.
На Android WiFi Lock и WakeLock - тоже не помогает.
Проверял разные режимы WiFI: b/g/n и комбинации bg, bgn - режимы переключаются, но пакеты по-прежнему теряются.

Пробовал патчить сервер: https://github.com/espressif/esp-idf/issues/3851#issuecomment-649563377
Но мою проблему это не решило.
 

pvvx

Активный участник сообщества
По TCP - потери пакетов, задержки при доставке пакетов до нескольких секунд, по WireShark - TCP Retransmits.
Какая сторона теряет пакеты (TCP Retransmits) ?

Данных для диагностики недостаточно (не те).

Если каждый раз производите TCP соединение, то ошибки неизбежны из-за дико урезанного TCP в ESP.
В секунду можно открыть и закрыть к тысяче TCP соединений. TIME_WAIT выставляется на IP:port<->IP:port на 120 секунд.
У вас всего 65535 портов и через x секунд они все будут заблокированы. Аналог DDoS...
Но это всё гадание на кофейной гуще - необходимых для анализа ситуации данных вы не дали. Iperf имеет малое значение в этом деле, т.к. всегда можно переполнить канал WiFi и он будет отбрасывать пакеты. Ставьте указание максимального потока в Iperf ...
В UDP это иногда нагляднее - кидаем по сети 10Гбит пакетики в полную 10Гбит из Iperf на роутер, а WiFi всего десяток Мбит и показания iperf меньше, чем при потоке в 10-ку мбит.
 

pvvx

Активный участник сообщества
Аналогично все малые SoC имеют буфера в RF дровах, и если они не успевают, то отбрасывают пакеты...
 

pvvx

Активный участник сообщества
У ESP ограниченное кол-во одновременно открытых соединений. Сильно ограниченное - не хватает для любого сеанса Chrome... На одну страницу эксплорер открывает в среднем 5 одновременных TCP соединений. Детский лепет в SDK/IDF к ESP, особенно в Arduino не может быть использован для нормальной и бесперебойной работы в TCP, не говоря уже о HTTP. Это неизлечимо. Проблемы в малой памяти и отсутствию MMU.
 

Evgeniy932

New member
Если каждый раз производите TCP соединение, то ошибки неизбежны из-за дико урезанного TCP в ESP.
Только один раз после подачи питания и до ближайшего сбоя.

Какая сторона теряет пакеты (TCP Retransmits) ?
Данных для диагностики недостаточно (не те).
Всегда теряет пакеты ESP32 и особенно это заметно на xiaomi mi a2 lite:
Здесь 192.168.4.1 - это ESP32.
1647923818183.png

Прикладываю код отправки в сокет, оба варианта с write и send работают одинаково.
Код:
int towrite = total;
                while (towrite > 0) {
                    //int written = write(sock, &uart_to_so_buff[total - towrite], towrite);
                    int written = send(sock, &uart_to_so_buff[total - towrite], towrite, 0);
                    if (written < 0) {
                        ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
                        shutdown(sock, 0);
                        close(sock);
                        sock = -1;
                        break;
                    }
                    towrite -= written;
                }
                total = 0;
Для отключения Power Saving на всякий случай разместил вызовы esp_wifi_set_ps(WIFI_PS_NONE); до и после инийциализации, но все равно не помогает:

Код:
esp_wifi_set_ps(WIFI_PS_NONE);
ESP_ERROR_CHECK( err );
ESP_ERROR_CHECK(esp_netif_init());
...
esp_wifi_set_ps(WIFI_PS_NONE);
esp_netif_create_default_wifi_ap();

esp_wifi_set_ps(WIFI_PS_NONE);
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
 

Evgeniy932

New member
Проблема была во внезапном out of memory.
Проблем не совместимости со смартфоном не обнаружил.
 

Evgeniy932

New member
С IPERF тоже?
Запустите какой тест, к примеру apache-jmeter на своё TCP соединение, или что там у вас в ESP?
То, что пропуснкая способность несколько меньше на этом смартфоне заметно даже без IPerf, но не мешает.
С этим смартфоном чаще происходит ситуация, когда происходит аггрегация отправленных со смартфона данных, за один вызов read считываются.
Задержки бывают случайные, около 500 мс.
 

Evgeniy932

New member
Новости по проблеме: после отключения WiFi AMPDU TX и RX через menuconfig пропускная способность несколько возросла и стала более равномерной в тесте IPerf:
Фризы заметны на определенном смартфоне, но стало лучше.

0- 3 sec 3.72 Mbits/sec
3- 6 sec 0.22 Mbits/sec
6- 9 sec 3.08 Mbits/sec

9- 12 sec 14.20 Mbits/sec
12- 15 sec 11.39 Mbits/sec
15- 18 sec 10.52 Mbits/sec
18- 21 sec 13.35 Mbits/sec
21- 24 sec 12.25 Mbits/sec
24- 27 sec 13.39 Mbits/sec
27- 30 sec 16.23 Mbits/sec


А подробнее? Заранее спасибо.
Там не было ничего интересного
 

pvvx

Активный участник сообщества
модуль BW16:
Код:
ATWT=-c,192.168.2.2,-t,100,-p,5002
[ATWT]: _AT_WLAN_TCP_TEST_
TCP: Start TCP client!
tcp_client_func: Server IP=192.168.2.2, port=5002
tcp_client_func: Create socket fd = 0
tcp_client_func: Connect to server successfully
ATWT=stop
[ATWT]: _AT_WLAN_TCP_TEST_
tcp_client_func: [END] Totally send 88968 KBytes in 38847 ms, 18761 Kbits/sec
tcp_client_func: Close client socket
TCP: TCP client stopped!
Код:
>iperf.exe -s -i 1 -p 5002
------------------------------------------------------------
Server listening on TCP port 5002
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
[388] local 192.168.2.2 port 5002 connected with 192.168.2.73 port 57592
[ ID] Interval       Transfer     Bandwidth
[388]  0.0- 1.0 sec  2.14 MBytes  17.9 Mbits/sec
[388]  1.0- 2.0 sec  2.23 MBytes  18.7 Mbits/sec
[388]  2.0- 3.0 sec  2.23 MBytes  18.7 Mbits/sec
[388]  3.0- 4.0 sec  2.21 MBytes  18.5 Mbits/sec
[388]  4.0- 5.0 sec  2.24 MBytes  18.8 Mbits/sec
[388]  5.0- 6.0 sec  2.23 MBytes  18.7 Mbits/sec
[388]  6.0- 7.0 sec  2.23 MBytes  18.7 Mbits/sec
[388]  7.0- 8.0 sec  2.20 MBytes  18.4 Mbits/sec
[388]  8.0- 9.0 sec  2.21 MBytes  18.5 Mbits/sec
[388]  9.0-10.0 sec  2.24 MBytes  18.8 Mbits/sec
[388] 10.0-11.0 sec  2.18 MBytes  18.3 Mbits/sec
[388] 11.0-12.0 sec  2.23 MBytes  18.7 Mbits/sec
[388] 12.0-13.0 sec  2.22 MBytes  18.6 Mbits/sec
[388] 13.0-14.0 sec  2.23 MBytes  18.7 Mbits/sec
[388] 14.0-15.0 sec  2.20 MBytes  18.5 Mbits/sec
[388] 15.0-16.0 sec  2.19 MBytes  18.4 Mbits/sec
[388] 16.0-17.0 sec  2.21 MBytes  18.6 Mbits/sec
[388] 17.0-18.0 sec  2.22 MBytes  18.7 Mbits/sec
[388] 18.0-19.0 sec  2.21 MBytes  18.6 Mbits/sec
[388] 19.0-20.0 sec  2.21 MBytes  18.5 Mbits/sec
[ ID] Interval       Transfer     Bandwidth
[388] 20.0-21.0 sec  2.22 MBytes  18.6 Mbits/sec
[388] 21.0-22.0 sec  2.24 MBytes  18.8 Mbits/sec
[388] 22.0-23.0 sec  2.23 MBytes  18.7 Mbits/sec
[388] 23.0-24.0 sec  2.23 MBytes  18.7 Mbits/sec
[388] 24.0-25.0 sec  2.21 MBytes  18.6 Mbits/sec
[388] 25.0-26.0 sec  2.27 MBytes  19.1 Mbits/sec
[388] 26.0-27.0 sec  2.21 MBytes  18.6 Mbits/sec
[388] 27.0-28.0 sec  2.23 MBytes  18.7 Mbits/sec
[388] 28.0-29.0 sec  2.21 MBytes  18.5 Mbits/sec
[388] 29.0-30.0 sec  2.23 MBytes  18.7 Mbits/sec
[388] 30.0-31.0 sec  2.19 MBytes  18.4 Mbits/sec
[388] 31.0-32.0 sec  2.22 MBytes  18.6 Mbits/sec
[388] 32.0-33.0 sec  2.22 MBytes  18.6 Mbits/sec
[388] 33.0-34.0 sec  2.23 MBytes  18.7 Mbits/sec
[388] 34.0-35.0 sec  2.24 MBytes  18.8 Mbits/sec
[388] 35.0-36.0 sec  2.22 MBytes  18.6 Mbits/sec
[388] 36.0-37.0 sec  2.22 MBytes  18.7 Mbits/sec
[388] 37.0-38.0 sec  2.22 MBytes  18.7 Mbits/sec
[388] 38.0-39.0 sec  2.21 MBytes  18.5 Mbits/sec
[388]  0.0-39.2 sec  86.9 MBytes  18.6 Mbits/sec
 
Сверху Снизу