Esp32 Async Http-Anfragen: Timeout + Reboot Probleme

OP #7162938
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
}
#7299610
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.