Hallo,
in meinem aktuellen Projekt nutze ich die Wetterinformationen von
api.openweathermap.org. Dazu muss ich eine sichere Anfrage senden. Das
klappt auch problemlos, ich kann die Anfrage beliebig oft widerholen.
Wenn ich aber erst nach einer größeren Wartezeit (5 bis 15 Min.) die
nächste Anfrage sende funktioniert das nicht mehr. Nach einiger Zeit
wird die Anfrage abgebrochen mit der Meldung "Anfrage abgelehnt". Eine
erneute Anfrage ist dann erst nach einem Reset wieder möglich.
Dieses Verhalten ist aber nicht von openweathermap abhängig, auch mit
anderen URL's passiert das gleiche. Ich habe auch schon andere
Bibliotheken verwendet, mit gleichem Ergebnis. Woran kann das liegen?
Bin für jeden Hilfe dankbar.
Gruß Wolfgang_n940
Hier ein kompakter Code aus den Arduino IDE-Beispielen der genau diesen
Effekt zeigt (Die Anfrage starte ich durch Eingabe von "a" im seriellen
Monitor):
(Arduino IDE 2.3.3, Arduino Core ESP32 V3.0.2)
1 | #include <Arduino.h>
|
2 | #include <WiFi.h>
|
3 | #include <WiFiClientSecure.h>
|
4 | #include <HTTPClient.h>
|
5 |
|
6 | const char* ssid = "mySSID";
|
7 | const char* password = "myPassword";
|
8 |
|
9 | const char* server = "www.howsmyssl.com";
|
10 |
|
11 | WiFiClientSecure client;
|
12 |
|
13 | void setup() {
|
14 | Serial.begin(115200);
|
15 | delay(100);
|
16 |
|
17 | WiFi.begin(ssid, password);
|
18 |
|
19 | while (WiFi.status() != WL_CONNECTED) {
|
20 | Serial.print(".");
|
21 | delay(1000);
|
22 | }
|
23 |
|
24 | Serial.print("Connected to ");
|
25 | Serial.println(ssid);
|
26 | }
|
27 |
|
28 | void anfrage() {
|
29 | client.setInsecure(); // Kein Zertifikat verwenden
|
30 |
|
31 | if (!client.connect(server, 443))
|
32 | Serial.println("Connection failed!");
|
33 | else {
|
34 | Serial.println("Connected to server!");
|
35 | client.println("GET https://www.howsmyssl.com/a/check HTTP/1.0");
|
36 | client.println("Host: www.howsmyssl.com");
|
37 | client.println("Connection: close");
|
38 | client.println();
|
39 |
|
40 | while (client.connected()) {
|
41 | String line = client.readStringUntil('\n');
|
42 | if (line == "\r") {
|
43 | Serial.println("headers received");
|
44 | break;
|
45 | }
|
46 | }
|
47 | while (client.available()) {
|
48 | char c = client.read();
|
49 | Serial.write(c);
|
50 | }
|
51 | client.stop();
|
52 | }
|
53 | }
|
54 |
|
55 | void loop() {
|
56 | static char inChar[2] {0, 0};
|
57 | static char inputString[20];
|
58 |
|
59 | if (Serial.available()) {
|
60 | inChar[0] = (char)Serial.read();
|
61 | if ((inChar[0] == '\r') || (inChar[0] == '\n')) {
|
62 | if (strcmp(inputString, "a") == 0) {
|
63 | Serial.println(F("Anfrage senden"));
|
64 | anfrage();
|
65 | }
|
66 | Serial.println();
|
67 | inputString[0] = 0;
|
68 | } else {
|
69 | if (strlen(inputString) < 19) strcat(inputString, inChar);
|
70 | }
|
71 | }
|
72 | }
|
Nachtrag:
Habe gerade einen Beitrag zu diesem Thema auf github gefunden:
https://github.com/espressif/arduino-esp32/issues/6561
Offenbar wurde das Problem schon 2022 erkannt:
Sobald nach einer Anfrage der Server die Verbindung getrennt hat (kann
einige Minuten dauern) ist eine erneute Anfrage nicht mehr möglich, erst
nach einem Reset.
So wie es aussieht ist der Fehler noch nicht behoben, oder hat jemand
eine Lösung gefunden?