Forum: Mikrocontroller und Digitale Elektronik Esp32 Async Http-Anfragen: Timeout + Reboot Probleme


von Michael W. (michi_exe)


Lesenswert?

Ich wollte meine bestehenden HTTP-Requests in meinem Projekt verbessern.

**Aktuelle Situation:**
Momentan verwende ich die Standard HTTPClient.h Library. Ich mache 8 
verschiedene HTTP-Anfragen mit einem Timout von 200ms. Wenn nicht alle 8 
Endpunkte zur Verfügung stehen dauert es insgesamt 1,6 Sekunden, um 
diese Aufgabe zu erledigen, da ja alle Anfragen nacheinander ausgeführt 
werden. Das stell ein Problem für mich dar.

**Lösungsvorschlag:**
Um die langen Warte- und Blockierzeiten zu beheben, wollte ich async 
http-Anfragen implementieren. Dazu habe ich mir die folgenden 
Bibliotheken angeschaut und ausprobiert:

https://github.com/boblemaire/asyncHTTPrequest

https://github.com/khoih-prog/AsyncHTTPSRequest_Generic

https://github.com/me-no-dev/AsyncTCP

**Probleme:**
Leider erfüllte keine dieser Bibliotheken alle meine Anforderungen. 
Diese sind:

-ein einstellbarer Timeout

-eine Request-Methode mit direkt einstellbarer Url (ohne immer eine neue 
Client-Instanz zu erzeugen)

-eine http-Code-Rückmeldung

Mit der Bibliothek "asyncHTTPrequest" hatte ich Probleme, wenn ein 
Endpunkt nicht verfügbar war, wurde der ESP nach 2 Fehlversuchen 
rebootet.

Und mit der Bibliothek "AsyncHTTPSRequest_Generic" bekomme ich keine 
Rückmeldung, wenn ich einen nicht-erreichbaren Endpunkt requeste.

Bei beiden Bibliotheken hatte das Einstellen des Timeouts gar keinen 
Wirkung.

**Frage:**
Gibt es eine einfache async http Libary, die alle meine Anforderungen 
erfüllt? Weiß jemand, warum die Einstellung eines Timeouts überhaupt 
nicht funktioniert und warum mein esp nach einigen fehlgeschlagenen 
Anfrageversuchen abstürzt? Ich möchte keinen asynchronen Webserver, ich 
möchte nur einfache asynchrone http-Anfragen ausführen.

**Beispiel-Code:**
In diesem Beispiel stürzt der ESP nicht ab, aber ich erhalte keine 
Rückmeldung über einen falschen Endpunkt. Die Anfrage wird gesendet, 
aber es gibt keinen Fehlercode oder etwas anderes.
1
#include <Arduino.h>
2
#include <WiFi.h>
3
#include <AsyncHTTPRequest_Generic.h>
4
5
const char *ssid = "MYSSID";
6
const char *password = "MYPASS";
7
8
AsyncHTTPRequest request;
9
10
void sendRequest()
11
{
12
  static bool requestOpenResult;
13
  if (request.readyState() == 0 || request.readyState() == 4)
14
  {
15
    requestOpenResult = request.open("GET", "http://300.300.300.300/INVALIDENDPOINT"); // invalid endpoint for testing resons
16
    String debugStr = String(requestOpenResult);
17
    Serial.print("Bool state: ");
18
    Serial.println(debugStr);
19
    if (requestOpenResult)
20
    {
21
      // Only send() if open() returns true, or crash
22
      request.send();
23
      Serial.println("request send");
24
    }
25
    else
26
    {
27
      Serial.println("Can't send bad request");
28
    }
29
  }
30
  else
31
  {
32
    Serial.println("Can't send request");
33
  }
34
}
35
36
void requestCB(void *optParm, AsyncHTTPRequest *request, int readyState)
37
{
38
  (void)optParm;
39
40
  if (readyState == readyStateDone)
41
  {
42
    Serial.println(request->responseText());
43
44
    request->setDebug(true);
45
  }
46
}
47
48
void setup()
49
{
50
  pinMode(15, INPUT);
51
  Serial.begin(115200);
52
  WiFi.begin(ssid, password);
53
54
  Serial.println("Connection to WiFi ");
55
  while (WiFi.status() != WL_CONNECTED)
56
  {
57
    delay(500);
58
    Serial.print(F("."));
59
  }
60
  Serial.println("connected to WiFi!");
61
62
  request.setDebug(true);
63
  request.onReadyStateChange(requestCB);
64
}
65
66
void loop()
67
{
68
  // when I press the button, it makes a HTTP request
69
  if (digitalRead(15) == LOW)
70
  {
71
    sendRequest();
72
    delay(200); // delay for button debounce
73
  }
74
}

: Verschoben durch Moderator
von hacker-tobi (Gast)


Lesenswert?

Falsches Unter forum.

Projekte & Code dient zur Präsentation nutzbarer Projekte. Bitte in 
Mikrocontroller/Elektronik anfragen oder verschieben lassen.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ich habe den Thread verschoben.

von Stefan M. (peff)


Lesenswert?

Moin,

ich sehe gerade durch Zufall das Du an ähnlichen Problemen werkelst wie 
ich.
HTTPRequrst gerne in Async.

Habe die gleiche Libs durch die Du …
Arbeite z.Z. mit der mit dem kleinen „a“.
Habe sie mittlerweile im Griff, wenn ich die zweite Abfrage in leere 
abfange^^.

Timeouts haben bei beiden keine wirkliche Funktion nur unter zwei 
Bedingungen:
- Die Anfrage geht an eine „echte“ URL, nicht IP.
- Nur beim ersten Lauf in leere greift der Timeout, danach dauert es 
immer 18Sek.
Das liegt an der AsyncTCP, auf die die anderen aufbauen.

Hast Du vielleicht das Problem anderweitig gelöst?

Gruß
Peff

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.