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: 

, 👍0


1 ответ


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

1

https://arduino-esp8266 .readthedocs.io/en/latest/esp8266wifi/readme.html#bearssl-client-secure-and-server- secure

Защищенные клиенты и серверы требуют значительных дополнительных памяти и обработки для включения их криптографических алгоритмов. В как правило, только одно защищенное клиентское или серверное соединение за раз может быть обработано, учитывая небольшой объем оперативной памяти ESP8266

у вас одновременно есть два экземпляра BearSSL::WiFiClientSecure. просто изменить свой код, чтобы сначала освободить первый объект клиента SSL.

,

я получил ошибку компиляции «клиент не был объявлен в этой области», если я использую только один объект клиента ssl., @alphaceph

вы можете использовать два. удалите только первый (из памяти выполнения, а не из кода) перед использованием второго. возможно, будет достаточно вызова http.end() перед выполнением второго запроса, @Juraj

я не знаю, как освободить выделенную память, не могли бы вы показать мне. мне удалось полностью запустить и получить ответ, остановив клиент с помощью client->stop();. Спасибо., @alphaceph