esp8266 не может сделать более одного запроса одновременно
я пытаюсь сделать запрос на получение, прочитать этот запрос и сделать еще один запрос с этим значением чтения. я не показал это в этом коде, но я хочу сделать запрос внутри запроса. можно ли сделать запрос, не завершая его, если да, то как мне это сделать?
вот код:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
#define WIFI_SSID "ssid"
#define WIFI_PASSWORD "pw"
void conn();
void getreq();
void anothergetreq();
void setup() {
conn();
getreq();
}
void loop() {
}
void getreq() {
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient http;
http.begin(*client, "https://jsonplaceholder.typicode.com/users/1");
int httpCode = http.GET();
String payaload = http.getString();
Serial.print("HTTP CODE: "); Serial.println(httpCode);
Serial.print("PAYLOAD: "); Serial.println(payaload);
// здесь я предполагаю, что получил значение из полезной нагрузки и сделал с ним еще один запрос
anothergetreq("posts/1");
http.end();
}
void anothergetreq(String p) {
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient http;
http.begin(*client, "https://jsonplaceholder.typicode.com/"+p);
int httpCode = http.GET();
String payaload = http.getString();
Serial.print("HTTP CODE: "); Serial.println(httpCode);
Serial.print("PAYLOAD: "); Serial.println(payaload);
http.end();
}
void conn() {
Serial.begin(9600);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(300);
}
Serial.println();
Serial.print("Connected with IP: ");
Serial.println(WiFi.localIP());
Serial.println();
}
вот результат:
Connected with IP: 192.168.1.100
HTTP CODE: 200
PAYLOAD: {
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "[email protected]",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
HTTP CODE: -1
PAYLOAD:
@alphaceph, 👍0
1 ответ
Лучший ответ:
https://arduino-esp8266 .readthedocs.io/en/latest/esp8266wifi/readme.html#bearssl-client-secure-and-server- secure
Защищенные клиенты и серверы требуют значительных дополнительных памяти и обработки для включения их криптографических алгоритмов. В как правило, только одно защищенное клиентское или серверное соединение за раз может быть обработано, учитывая небольшой объем оперативной памяти ESP8266
у вас одновременно есть два экземпляра BearSSL::WiFiClientSecure. просто изменить свой код, чтобы сначала освободить первый объект клиента SSL.
- HTTP GET запрос с использованием Arduino Uno и ESP8266
- Как составить URL-адрес HTTP-запроса GET с параметрами ключ/значение
- ESP8266 Ошибка неверного запроса 400
- ESP8266 отправляет веб-страницу клиенту, но html-коды отображаются в браузере вместо веб-страницы
- Проанализировать большой ответ json с помощью ESP8266
- ESP8266 не отвечает через случайные промежутки времени
- Код запроса ESP8266 GET -1
- esp32 http client response только 200 не получил данные после этого
я получил ошибку компиляции «клиент не был объявлен в этой области», если я использую только один объект клиента ssl., @alphaceph
вы можете использовать два. удалите только первый (из памяти выполнения, а не из кода) перед использованием второго. возможно, будет достаточно вызова http.end() перед выполнением второго запроса, @Juraj
я не знаю, как освободить выделенную память, не могли бы вы показать мне. мне удалось полностью запустить и получить ответ, остановив клиент с помощью
client->stop();
. Спасибо., @alphaceph