WiFiClient.readBytes всегда возвращает 0

Semen Junior

New member
Вынужден обратиться за помощью.
Использую Visual Studio + Visual Micro для кода ESP8266. А так же "esp8266 core for Arduino".
В какой то момент эта функция перестала работать правильно:

Код:
void simple_WIFI_download(void) {
    WiFiClient client;
    HTTPClient http;  // must be declared after WiFiClient for correct destruction order, because used by http.begin(client,...)

    debug.print("[HTTP] begin...\n");

    // configure server and url
    http.begin(client, "http://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png");//"http://homeblinker.000webhostapp.com/files/esp-config/esp-config");
    // http.begin(client, "jigsaw.w3.org", 80, "/HTTP/connection.html");

    debug.print("[HTTP] GET...\n");
    // start connection and send HTTP header
    int httpCode = http.GET();
    if (httpCode > 0) {
        // HTTP header has been send and Server response header has been handled
        debug.printf("[HTTP] GET... code: %d\n", httpCode);

        // file found at server
        if (httpCode == HTTP_CODE_OK) {

            // get length of document (is -1 when Server sends no Content-Length header)
            int len = http.getSize();

            // create buffer for read
            uint8_t buff[64] = { 0 };

            // or "by hand"

            // get tcp stream
            WiFiClient* stream = &client;

            // read all data from server
            while (http.connected() && (len > 0 || len == -1)) {
                // read up to 128 byte
                int c = stream->readBytes(buff, std::min((size_t)len, sizeof(buff)));
                debug.printf("readBytes: %d\n", c);
                if (!c) {
                   
                    debug.println("read timeout");
                    //debug.println(http.getString());
                }

                // write it to debug
                //debug.write(buff, c);

                if (len > 0) { len -= c; }
            }

            debug.println();
            debug.print("[HTTP] connection closed or file end.\n");
        }
    }
    else {
        debug.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }

    http.end();

delay(60000);
}
Вывод:
Код:
[HTTP] begin...
[HTTP] GET...
[HTTP] GET... code: 200
readBytes: 0
read timeout
readBytes: 0
read timeout
readBytes: 0
read timeout
readBytes: 0
read timeout
Зависает на получении байт. Проверял ссылки и сайты, из браузера или даже через мобильную сеть с этого же ESP скачивается нормально, и даже как строку "http.getString()" можно правильно прочитать, просто мне нужно будет скачивать большие файлы!
Буду рад любой идее как вернуть работоспособность этому примеру.
 

CodeNameHawk

Moderator
Команда форума
google перекидывает на https, пробуйте на другом сервисе, который поддерживает http
 

Semen Junior

New member
google перекидывает на https, пробуйте на другом сервисе, который поддерживает http
Спасибо но нет, ничего не помогает, разные сайты пробовал. Я склонен полагать что проблема в самой ESP, подчеркну что файл приходит без проблем по мобильной сети и даже в браузере. Все заголовки приходят правильные.
 

Semen Junior

New member
Дайте адрес, с какого пробовали.
Например вот этот

Но я работал с современным хостингом и HTTPS, никаких сертификатов я не проверял.
Все еще настаиваю что проблема не с обьектом WifiClient, а с унаследованным методом от 'stream'.
 

CodeNameHawk

Moderator
Команда форума

CodeNameHawk

Moderator
Команда форума
Я бы сильно удивился если бы он не скачивался.

[HTTP] begin...
[HTTP] GET...
[HTTP] GET... code: 200
readBytes: 64
readBytes: 64
readBytes: 60

[HTTP] connection closed or file end.
Попробуйте версию платы 2,7,4 и в настройках V2 Higher bandwith.
 

Semen Junior

New member
Я бы сильно удивился если бы он не скачивался.
Так вот у меня не скачивается ничего. Вернее приходят заголовки, приходит заголовок ответа "200 ок" но зависает на приеме.
Не могу понять что изменилось. Во первых я пересел на другой ПК, во вторых если не изменяет память обновилась Arduino IDE.
Вобще то я использую Visual Studio + Visual Micro плагин (для ардуино)


Попробуйте версию платы 2,7,4 и в настройках V2 Higher bandwith.
Это как, это где? Моя Arduino IDE имеет версию 2.2.1
 

CodeNameHawk

Moderator
Команда форума
Ищите в менеджере плат.
Напишите в гоогле ардуиноиде менеджер плат esp8266
 
Последнее редактирование:

CodeNameHawk

Moderator
Команда форума
Последнее редактирование:

Semen Junior

New member
https://forum.arduino.cc/t/reading-http-class-stream-fails-to-receive-data/683622/3
Похоже, на новой версии плат, пока работать не будет.
Переписку не понял, но да, вы правы, версия "Arduino core for ESP8266" имеет значение.
На данный момент доступна 3.1.2
Однако мой код срабатывает только на 3.0.0 - 3.0.1 (выше - возникает проблема описанная в этой теме).
Ну а если ниже то один из моих макросов ломается.


Да, лицензия есть.


Есть VS Code и arduino plugin microsoft.
Спасибо , попробую.
Ну и в целом большое спасибо за внимание!!!
 

CodeNameHawk

Moderator
Команда форума
Да, лицензия есть.
Пробовал ее еще когда была бесплатная, неплохо работала.
Но теперь есть VSC, недавно добавили профили, вообщем вещь.
Однако мой код срабатывает только на 3.0.0 - 3.0.1
Похоже был у них большой переход с 2.7.4 на версию выше.
Мой скетч так очень хитро "ломается" при переходе на новую версию.
Отладка возле роутера, с ручной подачей данных на сом порт, работает нормально, но в живую, довольно далеко от роутера, сразу начинаются тормоза плюс съедание свободной памяти.
 

CodeNameHawk

Moderator
Команда форума
Для разных языков программирования и или настроек.
Свои настройки и разные плагины для разных профилей.
 

enjoynering

Well-known member
Ага понятно, а я уже думал наконец как в Arduino IDE можно плату через меню настроить, чтоб бы не лазить в интернете выискивая ключи для platformio.ini
 

enjoynering

Well-known member
Спасибо. Сегодня пробую. Только это останавливало. А как с плагинами для заливки папки data на littleFS? Подходят от Arduino IDE?
 
Сверху Снизу