ESP32 Problem mit WiFiClientSecure

OP #7785156
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren