• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу