POST запрос работает на ESP32 и не работает на ESP8266. Помогите разобраться
- Войдите на сайт для отправки комментариев
Один и тот же код заливаю и на ESP 8266 он не работает. По ощущениям не ждет ответа сервера или вообще запрос туда не шлет. Разница в #include <HTTPClient.h> и #include <ESP8266HTTPClient.h> Как портировать код?
/*#include <WiFi.h> //Первые две строки для ESP32 #include <HTTPClient.h> */ #include <ESP8266WiFi.h> // Эти две строки для ESP8266 #include <ESP8266HTTPClient.h> const char* ssid = "xxx"; const char* password = "xxx"; #include <ArduinoJson.h> //https://github.com/bblanchon/ArduinoJson #define debug true // вывод отладочных сообщений void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(100); } New_users(); } void New_users() { HTTPClient http; http.begin("https://api.telegram.org/botXXXXXXXXXXXXXXXX/"); http.addHeader("Content-Type", "application/json"); StaticJsonDocument<1000> doc; // Создаем и наполняем json для последующей отправки на сервер doc["method"]="getUpdates"; http.POST(doc.as<String>());// Json запрос на сервер String ans=http.getString(); Serial.println(ans); http.end(); } void loop() { }
Неожиданно все слиплось в первом сообщении(
Попробуй перед функцией setup() вставить такое:
StaticJsonDocument<1000>
А чего не 1000000-то?
И почему бы тебе вместо ощущений не проверить наверняка?
Докладываю:
ESP8266 и ESP32 по разному обращаются к httpS + ESP8266 требует пару строк инициализации
(#include <WiFiClient.h>, WiFiClient client;)
и в строке запроса необходимо добавить слово client.
(http.begin(client, "http://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5"))
Но это не все. До httpS не достучатся т.к. проверка сертификата 8266 не проходит .
http.begin(client, "https://api.privatbank.ua/p24api/pubinfo?json&exchange&coursid=5")// это не работает
Ответ нашелся тут https://buger.dread.cz/simple-esp8266-https-client-without-verification-of-certificate-fingerprint.html Сразу приведу от туда пример по курсу биткоина через https с игнорированием SSL сертификатов
В esp32 AES256 - аппаратный (условно), в 8266 100% программный, тормоз, жесть. ESP32 - два ядра, поэтому на одном крутится сетевые дела, а остальную бурду, которую ты пишешь выполняют на втором ядре, 8266 - одно ядро, поэтому в код для 8266 нужно пихать например delay(0) , с таким расчетом, что бы код не загружал ядро дольше какого то периода, какого я уже не помню, ищи в даташитах.
Повторил этот код. Все работает, но!!!!
Слишком большой по длине ответ в payload. В результате в ряде случаев крах системы.
String payload = https.getString(); - вот здесь возникает крах.
Как этот самый payload забирать не весь сразу а порциями?
Как этот самый payload забирать не весь сразу а порциями?
не использовать String
Пример приведите, тогда будет понятно.
Я тогда много ковырял post запросы. Что помню: как вариант использовать масив char[]. Но это не вариант. Для post обмена данными есть замечательный формат json.
Вот тут (20я строка) с ним разбирался:
http://arduino.ru/forum/proekty/meteostantsiya-dlya-narodnogo-monitoring...
Ещё, очень часто в post запросе можно просить конкретную короткую инфу, к примеру курс валют не за год а за день или час. Тогда ответ короткий. Как это делать, нужно смотреть API сайта на который запрос уходит. Обычно в хэлпе сайта есть описание запросов (api).
Удачи.
почему не вариант?
Берете массив char подходящей длины, например 200 символов.
Читаете из ответа сервера первые 200 символов, парсите... снова читаете 200 символов в ТОТ же массив...
В итоге вы можете прочитать ответ сервера хоть 10 мегабайт, имея один буфер 200 символов
почему не вариант?
Берете массив char подходящей длины, например 200 символов.
Читаете из ответа сервера первые 200 символов, парсите... снова читаете 200 символов в ТОТ же массив...
В итоге вы можете прочитать ответ сервера хоть 10 мегабайт, имея один буфер 200 символов
Ну так пример приведите. Я его тут же и проверю. Или... никак.
json, конечно, замечательно. Но!!!
Я запрашиваю обычный новостной сайт. Не отвечает он джисонами, ответ приходит в HTTP.
Во кусок из проекта, думаю суть будет понятна:
Ну так пример приведите. Я его тут же и проверю. Или... никак.
ну никак... значит никак. Это ж не мне нужно.
А для тех, кто все-таки хочет решить задачку - посоветую использовать функцию
А к обьекту типа Stream уже можно обращаться, как. например, к Сериал - читать его побайтно и блоками любой длины, а не пытаться запихнуть весь ответ сервера в одну строку, на которую у вас не хвтает памяти
Ну так пример приведите. Я его тут же и проверю. Или... никак.
ну никак... значит никак. Это ж не мне нужно.
А для тех, кто все-таки хочет решить задачку - посоветую использовать функцию
А к обьекту типа Stream уже можно обращаться, как. например, к Сериал - читать его побайтно и блоками любой длины, а не пытаться запихнуть весь ответ сервера в одну строку, на которую у вас не хвтает памяти
"Берете массив char подходящей длины, например 200 символов.
Читаете из ответа сервера первые 200 символов, парсите... снова читаете 200 символов в ТОТ же массив...
В итоге вы можете прочитать ответ сервера хоть 10 мегабайт, имея один буфер 200 символов" - вот Ваши слова.
Не.... Задний ход не нужно включать. Пример приведите, как Вы будете читать 200 символов, потом снова 200 и т.д., теорию мы знаем. Тут теоретиков хоть отбавляй.
А 10 мегабайт где хранятся?
Ну так пример приведите. Я его тут же и проверю. Или... никак.
ну никак... значит никак. Это ж не мне нужно.
А для тех, кто все-таки хочет решить задачку - посоветую использовать функцию
А к обьекту типа Stream уже можно обращаться, как. например, к Сериал - читать его побайтно и блоками любой длины, а не пытаться запихнуть весь ответ сервера в одну строку, на которую у вас не хвтает памяти
"Берете массив char подходящей длины, например 200 символов.
Читаете из ответа сервера первые 200 символов, парсите... снова читаете 200 символов в ТОТ же массив...
В итоге вы можете прочитать ответ сервера хоть 10 мегабайт, имея один буфер 200 символов" - вот Ваши слова.
Не.... Задний ход не нужно включать. Пример приведите, как Вы будете читать 200 символов, потом снова 200 и т.д., теорию мы знаем. Тут теоретиков хоть отбавляй.
А 10 мегабайт где хранятся?
А зачем нам хранить 10 М? Если у нас есть ведро 10 литров с краником и крушка 200 гр. Что делаем когда крушка уже полна?
Не.... Задний ход не нужно включать. Пример приведите, как Вы будете читать 200 символов
о господи...
вы даже не можете понять, что то что вы процитировали и мой ответ - это одно и то же :)
и да, кстати - чтоб вы потом не возникали - я ничего этого сам не выдумывал, в гугле примеров чтения ответов сервера по частям - полно, это абсолютно банальный и очевидный метод решения вашей задачи
Не.... Задний ход не нужно включать. Пример приведите, как Вы будете читать 200 символов
это абсолютно банальный и очевидный метод решения вашей задачи
Если такой умный чего ты слона ел не по частям?
Ссылка запроса секретная? Можно посмотреть какой ответ приходит?
да вряд ли вы от него ответ получите... этот товарищ уверен, что ему все вокруг должны, а сам он - никому... и даже когда он не по-детски тупит - виноват кто-то другой.
вот, ради интереса почитайте, с чего началось его общение на форуме (читать с 14 сообщения)
http://arduino.ru/forum/obshchii/oshibka-pri-zagruzke-sketcha-0
Делал перерыв. Сейчас начну проверять. За ответы, конечно, спасибо!
На самом деле необязательно и 200 читать. Буфера должно хватать на одну самый длинный токен/лексему, а читать следует по байту. Токен распознал - буфер начал заполнять заново.
Код не работает.
ну это понятно, сколько надо - столько и читай
Serial.println( https.getString().length()); - убрал это из кода и... началось чтение...
Дальше попробую сам.
Всем спасибо за решение проблемы!
Serial.println( https.getString().length()); - убрал это из кода и... началось чтение...
конечно, ведь для того чтобы подсчитать длину строки - https.getString().length() - надо опять же сначала всю строку в память запихнуть
Немного не понимаю.
Где хранится весь ответ с сайта после https.GET().? Все равно в памяти или пока сохраняется соединение - на сайте. А как долго оно сохраняется и успеет ли прочитать программа весь поток до разрыва соединения?
Все равно в памяти или ...где?
в буфере приемного модуля - сколько помещается. А как буфер заполнится - ЕСП дает команду удаленному серверу больше не слать. Когда вы начинаете выбирать данные - буфер постепенно освобождается и ЕСП запрашивает с сервера новые порции
А если вы используете строчку http.getString() - то вы даете команду приемнику получить сразу все. А оно не входит..
примерно так. Если где ошибся - Садман поправит.
как долго оно сохраняется и успеет ли прочитать программа весь поток до разрыва соединения?
есть такое понятие - таймаут. Если перерыв в приеме данных будет больше этой величины - сервер разорвет соединение. Конкретное значение зависит от настроек сервера и клиента.
Но в любом случае серевр не будет ждать часами :) Поэтому обрабатывать входящий поток надо быстро.
Спасибо! Теперь немного въехал. Я в этом деле новичок, получение информации с сайта HTTPS делаю впервые, поэтому столько вопросов.