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

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.