Запрос ESP32 WiFiClient отсутствует ответ
У меня возникла проблема с ESP32. Я использую базовый пример для WiFiClient и делаю запрос на свой сервер. Проблема в том, что ответ должен быть длиной 15000 байт, но очень часто я получал только 2750 или меньше.
char buffer[15000];
while (client.available()) {
char c = client.read();
buffer[i++] = c;
}
Serial.println(i);
@A. L. K., 👍1
1 ответ
Лучший ответ:
Вы предполагаете, что все 15 000 байт доступны постоянно.
Их не будет.
Вместо "пока доступно что-то читать" нужно "Пока мало прочитано, то если доступно что-то читать".
При чтении из (предполагаемого) HTTP сначала необходимо прочитать и интерпретировать заголовки (строки перед одной пустой строкой). Одним из них будет заголовок «Content-Length:», который точно скажет вам, сколько байтов содержится в теле ответа. Затем вы используете это, чтобы прочитать нужное количество байтов из тела.
Итак, последовательность такова:
- Прочитайте построчно заголовки, интерпретируя те, которые вам нужны, пока:
- Вы получаете одну пустую строку
- Читайте данные побайтно, пока не будет прочитано число байтов, указанное в заголовке Content-Length.
Если вы не читаете с HTTP-сервера и уверены, что длина данных составляет ровно 15 000 байт, вам нужно перейти к пункту 3 выше. Никогда не думайте, что все данные есть. Если есть данные, прочитайте их и повторяйте, пока не получите 15000 байт.
- ESP32 - "Детектор Браунаута был активирован" при запуске Wi-Fi
- Контакты RX и TX на esp32
- Почему OTA не работает с платой ESP32-CAM Ai-Thinker?
- ESP32 открывает "captive portal" при подключении
- Аналоговое чтение не работает при использовании WiFi
- Автоматическая веб-страница ESP32 AP
- Чтение данных из Google Таблиц с помощью Nodemcu
- WiFiClient::connected() не работает
Спасибо, проблема, вероятно, была вызвана client. available (), при чтении ответа он обнаружил пробел, когда у клиента нет доступных данных, и поэтому чтение закончилось. Когда у меня недостаточно данных, я жду (с тайм-аутом), чтобы получить доступ к некоторым данным., @A. L. K.