Forum: Mikrocontroller und Digitale Elektronik ESP32 Problem mit WiFiClientSecure


von Wolfgang N. (wolfgang_n940)


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?

: Bearbeitet durch User
von Εrnst B. (ernst)


Lesenswert?

Einfach das Client-Objekt nicht aufheben, Zeile 11 zwischen Zeile 28&29 
verschieben?

von Wolfgang N. (wolfgang_n940)


Lesenswert?

Habe ich auch schon versucht. Ohne Erfolg.

von Christoph K. (backdraft007)


Lesenswert?


: Bearbeitet durch User
von Wolfgang N. (wolfgang_n940)


Lesenswert?

Das Problem scheint gelöst zu sein.

Ich habe heute Arduino Core ESP32 V3.0.7 installiert und siehe da, der 
Fehler tritt bisher nicht mehr auf. Werde weiter beobachten und 
gelegentlich berichten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.