Запрос ESP32 WiFiClient отсутствует ответ

У меня возникла проблема с ESP32. Я использую базовый пример для WiFiClient и делаю запрос на свой сервер. Проблема в том, что ответ должен быть длиной 15000 байт, но очень часто я получал только 2750 или меньше.

char buffer[15000];
while (client.available()) {
  char c = client.read();
  buffer[i++] = c;
}
Serial.println(i);

, 👍1


1 ответ


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

1

Вы предполагаете, что все 15 000 байт доступны постоянно.

Их не будет.

Вместо "пока доступно что-то читать" нужно "Пока мало прочитано, то если доступно что-то читать".

При чтении из (предполагаемого) HTTP сначала необходимо прочитать и интерпретировать заголовки (строки перед одной пустой строкой). Одним из них будет заголовок «Content-Length:», который точно скажет вам, сколько байтов содержится в теле ответа. Затем вы используете это, чтобы прочитать нужное количество байтов из тела.

Итак, последовательность такова:

  1. Прочитайте построчно заголовки, интерпретируя те, которые вам нужны, пока:
  2. Вы получаете одну пустую строку
  3. Читайте данные побайтно, пока не будет прочитано число байтов, указанное в заголовке Content-Length.

Если вы не читаете с HTTP-сервера и уверены, что длина данных составляет ровно 15 000 байт, вам нужно перейти к пункту 3 выше. Никогда не думайте, что все данные есть. Если есть данные, прочитайте их и повторяйте, пока не получите 15000 байт.

,

Спасибо, проблема, вероятно, была вызвана client. available (), при чтении ответа он обнаружил пробел, когда у клиента нет доступных данных, и поэтому чтение закончилось. Когда у меня недостаточно данных, я жду (с тайм-аутом), чтобы получить доступ к некоторым данным., @A. L. K.