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 | }
|