ESP32 Problem mit WiFiClientSecure

OP #7785156

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

Eine eigene Frage? Dieser Thread ist über ein Jahr alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.