Телефон Android не может получить страницу ESP8266WebServer, если Content-Length > 1460

Я загрузил следующий скетч в свой ESP8266:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);
String toServe;

void serveShortString() {
    server.send(200, "text/plain", "short string!");
}

void serveLongString() {
    server.send(200, "text/plain", toServe);
}

void setup() {
    WiFi.softAP("test");

    // заполните строку для обслуживания:
    toServe.reserve(3000);
    for(int i=0; i<150; i++) toServe += "1234567890123456789\n";

    server.on("/long", serveLongString);
    server.on("/short", serveShortString);
    server.begin();
}

void loop() {
    server.handleClient();
}

Он отправляет короткое сообщение на /short и длинное сообщение (3000 символов) на /long.

Страница /short работает везде: Windows, Desktop Linux (Fedora) и Android. С другой стороны, страница /long работает только на Windows и большую часть времени на настольном Linux. Она никогда не работает на Android. Я пробовал два телефона.

Я захватил сетевой трафик на моем телефоне Android с помощью tPacketCapture. Вот результат:

При попытке получить /short все работает нормально. При попытке получить /long проходит только заголовок, но содержимое не приходит. Как я уже сказал, все работает нормально в Windows и (большую часть времени) в Desktop Linux. Есть идеи, что не так?

, 👍0


1 ответ


Лучший ответ:

1

Решение заключается в добавлении следующей строки в platformio.ini:

build_flags = -D PIO_FRAMEWORK_ARDUINO_LWIP2_LOW_MEMORY

Я заметил, что тот же скетч работает без проблем при сборке с помощью Arduino IDE, поэтому я проверил различия при сборке с помощью platformio и Arduino IDE.

Оказывается, существенное различие заключается в том, что Arduino IDE по умолчанию использует lwIP 2, тогда как platformio использует 1.4, в котором, похоже, есть эта ошибка (та же ошибка возникает при использовании Arduino IDE с lwIP 1.4).

Приведенный выше флаг сборки сообщает platformio о необходимости использования lwIP v2.

,