INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Probleme bei der Kombination Firebase/HTTPS client
05.11.2020, 09:19
Beitrag #1
Probleme bei der Kombination Firebase/HTTPS client
Ich habe einen Arduino-Sketch aufgesetzt, der über WiFi auf Firebase zugreifen soll und zusätzlich HTTPS-Requests starten soll. Ich nutze ein ESP8266-12F Modul (AZ Delivery D1 mini NodeMCU)

ESP8266 Board Version 2.7.4
FirebaseArduino Version 0.3 (von 2018, gibt es da etwas Neueres, das ich nicht finden konnte?) zusammen mit ArduinoJson Version 5.13.1
ODER FirebaseESP8266 Version 3.0.2


Für die Firebase-Zugriffe habe ich sowohl FirebaseArduino als auch FirebaseESP8266 ausprobiert, beide haben aber mit der Situation ihre Probleme:

In setup() öffne ich die WiFi-Verbindung, und in loop() greife ich auf Firebase zu, um eine Liste von 10-Zeichen-Strings zu holen. Von diesen gibt es ca. 160 in der Datenbank, die genaue Anzahl kenne ich aber vorher nicht. Bis zu diesem Punkt funktionert auch alles prima. Ich kann mir sogar in einer Schleife die gesammelten String-Keys anschauen.

Aber sobald ich dann eine HTTPS-Client-Verbindung aufbaue

Code:
WiFiClientSecure client;
client.setInsecure();    // to avoid fingerprint stuff
if(!client.connect()) {
  Serial.println("connection failed");
} else {
  ... // hier steht dann client.print("GET ......")
}

kommt es entweder zu "connection failed" oder aber zu Soft WDT Resets.

Wenn ich eine HTTPS-Client-Verbindung zu den gleichen URLs ohne vorherigen Firebase-Zugriff aufbaue, dann funktionieren diese prima!

Was möchte ich eigentlich machen? Für jeden der 10-Zeichen-Strings aus Firebase möchte ich eine HTTPS-Verbindung zu einem Server aufbauen, wobei die URL diesen String enthält. Von diesem Server hole ich mir Infos (einen weiteren String), den ich dann in Firebase bei dem String-Key speichern möchte.

Außerdem habe ich noch ein SSD1306 OLED an meinem ESP8266 angeschlossen.

Codeaufbau:

Code:
#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <WiFiClientSecureBearSSL.h>


#include <WiFiClient.h>
#include <Wire.h>
#include <SSD1306.h>

#include <FirebaseESP8266.h>

#define FIREBASE_HOST "xxxxxxxxxxxxxxxxxxxxxxx"
#define FIREBASE_AUTH "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"

#define OLED_ADDRESS                0x3C //you may need to change this, this is the OLED I2C address.  

SSD1306 display(OLED_ADDRESS, D2, D1);

ESP8266WiFiMulti WiFiMulti;

FirebaseData firebaseData;
...

void setup() {
  ...
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("aaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbbbb");

  while(WiFiMulti.run() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  ...
}

void loop() {
  WiFiClientSecure client;
  client.setInsecure();

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
  Firebase.reconnectWiFi(true);
  firebaseData.setBSSLBufferSize(3072, 512);
  firebaseData.setResponseSize(3072);
  
  if(Firebase.get(firebaseData, "/my/path")){
    Serial.print("Read object of type ");
    Serial.println(firebaseData.dataType());

    FirebaseJson& json = firebaseData.jsonObject();
    size_t len = json.iteratorBegin();
    String key, value = "";
    int type = 0;
    String buffer[len];
    for (size_t i = 0; i < len; i++)
    {
        json.iteratorGet(i, type, key, value);
        buffer[i] = key;
    }
    json.iteratorEnd();
    delay(500);

    // check single IDs
    for(size_t i = 0; i < len; i++) {

      String url = "/" + buffer[i];

      if (!client.connect(host, httpsPort)) {  // the problems happen here
        Serial.println("connection failed");
      } else {
        ...
      }
      client.stop();
    }
    
  }
}

Gibt es in dem Code ein grundlegendes Problem, das zu dieser Situation führt? Ich weiß zum Beispiel, dass ich Strings vermeiden sollte ... habe aber zu wenig Erfahrung mit hardwarenaher Programmierung eines speicherlimitierten Systems in C++ Wink

Vielleicht habt ihr Hinweise, wie ich beispielsweise die Liste der Keys nicht als String[] sondern speicherschonender ablegen und nutzen kann?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 09:56
Beitrag #2
RE: Probleme bei der Kombination Firebase/HTTPS client
Zu Deinem konkreten Problem habe ich keine Erfahrung, ich vermisse sowas wie Firebase.end() oder Ähnliches, bevor Du die https-Connection öffnest.
Ebenso könnte eine kurze Pause zwischen den https-Connections helfen.

Auf den ESP8266 ist das Problem mit String nicht so sehr ausgeprägt.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 11:06 (Dieser Beitrag wurde zuletzt bearbeitet: 05.11.2020 11:07 von devnull69.)
Beitrag #3
RE: Probleme bei der Kombination Firebase/HTTPS client
Hallo Tommy,

danke für Deine schnelle Rückmeldung.

Ich baue für die Firebase-Zugriffe keine Verbindung auf, das machen die Libraries wohl intern. Leider gibt es (in beiden Firebase-Libraries) kein Firebase.end(), Firebase.close(), Firebase.stop() oder ähnliches. Daher weiß ich einfach nicht, ob die Verbindung vorher beendet wurde...

Aber ich hatte wohl einen Fehler in meinem Code, der ab und zu falsche URLs produziert hat. Bei diesen kommt dann (natürlich) "connection failed". Bei korrekten URLs kommt es nun ausschließlich zu Soft WDT Resets.

Die eigentliche Frage lautet also: Wie kann ich korrekt den WDT Reset verhindern (Stichwort: "Watchdog füttern"). delay() und/oder yield() haben nichts gebracht. ESP.wdtDisable() auch nicht, da dann der Hardware WDT zuschlägt.

Dieser Code schaltet (angeblich) den HW WDT aus ...

Code:
void hw_wdt_disable(){
  *((volatile uint32_t*) 0x60000900) &= ~(1); // Hardware WDT OFF
}

das führt aber zu einem panic core dump (__yield), was mich auch nicht wundert.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 11:16
Beitrag #4
RE: Probleme bei der Kombination Firebase/HTTPS client
Ein delay(10) in Deiner for-Schleife nach dem client.stop() bringt nichts?
Was machst Du bei ...? Evtl. dauert das zu lange oder der https-Zugriff ist zu langsam.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 11:21
Beitrag #5
RE: Probleme bei der Kombination Firebase/HTTPS client
(05.11.2020 11:16)Tommy56 schrieb:  Ein delay(10) in Deiner for-Schleife nach dem client.stop() bringt nichts?
Was machst Du bei ...? Evtl. dauert das zu lange oder der https-Zugriff ist zu langsam.

Gruß Tommy

Das delay(10) nach dem client.stop() bringt nichts ... denn bis dahin gelangt der Code bei der Ausführung gar nicht erst (Abbruch schon bei client.connect())

Bei .... würde ich einen GET-Request absetzen, das HTML-Ergebnis parsen und einen String extrahieren. Aber wie gesagt, bis dahin kommt der Code gar nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 11:26
Beitrag #6
RE: Probleme bei der Kombination Firebase/HTTPS client
Hast Du mal den Exceptiondecoder installiert?

Ansonsten gib uns mal Links zu den Firebase-Libs.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 11:36 (Dieser Beitrag wurde zuletzt bearbeitet: 05.11.2020 11:46 von devnull69.)
Beitrag #7
RE: Probleme bei der Kombination Firebase/HTTPS client
(05.11.2020 11:26)Tommy56 schrieb:  Hast Du mal den Exceptiondecoder installiert?

Ansonsten gib uns mal Links zu den Firebase-Libs.

Gruß Tommy

Ja klar, den Dump wollte ich eh anhängen:

Code:
Decoding stack results
0x401004c1: millis() at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_wiring.cpp line 185
0x402030d9: ClientContext::_write_from_source(DataSource*) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\libraries\ESP8266WiFi\src/include/ClientContext.h line 472
0x4021438a: optimistic_yield(uint32_t) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_main.cpp line 146
0x4020436f: BearSSL::WiFiClientSecure::_run_until(unsigned int, bool) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266/PolledTimeout.h line 218
0x4023682a: br_ssl_engine_hs_reset at src/ssl/ssl_engine.c line 1320
0x40204660: BearSSL::WiFiClientSecure::_wait_for_handshake() at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\libraries\ESP8266WiFi\src\WiFiClientSecureBearSSL.cpp line 564
0x40204843: BearSSL::WiFiClientSecure::_connectSSL(char const*) at c:\users\ttheiner\appdata\local\arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\2.5.0-4-b40a506\xtensa-lx106-elf\include\c++\4.8.2\bits/shared_ptr.h line 291
0x40214320: __esp_yield() at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_main.cpp line 119
0x40214f16: __delay(unsigned long) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_wiring.cpp line 54
0x40203430: WiFiClient::connect(IPAddress, unsigned short) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\libraries\ESP8266WiFi\src/include/ClientContext.h line 144
0x40204961: BearSSL::WiFiClientSecure::connect(char const*, unsigned short) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\libraries\ESP8266WiFi\src\WiFiClientSecureBearSSL.cpp line 232
0x402016a3: loop() at D:\Project Folders\ArduinoProjects\ESP8266\WifiTest\MyProject/MyProject.ino line 122
0x40201594: loop() at D:\Project Folders\ArduinoProjects\ESP8266\WifiTest\MyProject/MyProject.ino line 101
0x40214c55: Twi::writeTo(unsigned char, unsigned char*, unsigned int, unsigned char) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_si2c.cpp line 349
0x40214dec: twi_writeTo(unsigned char, unsigned char*, unsigned int, unsigned char) at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_si2c.cpp line 984
0x4020146c: setup() at D:\Project Folders\ArduinoProjects\ESP8266\WifiTest\MyProject/MyProject.ino line 75
0x40214438: loop_wrapper() at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_main.cpp line 197
0x401000c0: app_entry() at C:\Users\ttheiner\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.​4\cores\esp8266\core_esp8266_main.cpp line 320
0x40240005: mul20 at src/ec/ec_p256_m15.c line 218
0x40240055: mul20 at src/ec/ec_p256_m15.c line 216
0x40232200: br_ecdsa_i15_sign_raw at src/ec/ecdsa_i15_sign_raw.c line 137
0x40220b22: validate_structure at /home/earle/src/esp-quick-toolchain/repo/newlib/newlib/libc/time/mktime.c line 81

Zeile 101 ist

Code:
String buffer[len]

Zeile 122 ist dann der client.connect(). Keine Ahnung, warum im Trace die beiden Zeilen aufeinanderfolgen ...


Das sind die beiden Firebase-Libraries:

firebase-arduino: https://github.com/FirebaseExtended/firebase-arduino
Firebase ESP8266 Client habe ich über den Library-Manager installiert. Der Code dazu ist zu finden unter: https://github.com/mobizt/Firebase-ESP8266
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.11.2020, 11:57
Beitrag #8
RE: Probleme bei der Kombination Firebase/HTTPS client
Da fällt mir auch nichts anderes mehr ein.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP über HTTPS Fingerabdruck/Zertifikat HeKe 1 54 Heute 09:42
Letzter Beitrag: Nichtraucher
  AES256 / SHA384 Chiffren bei HTTPS requests mit ESP32 nutzen TBMSam 0 72 Gestern 13:47
Letzter Beitrag: TBMSam
  Hilfe bei async-mqtt-client für ESP32 amshh 7 296 12.11.2020 09:19
Letzter Beitrag: amithlon
  wert an client schicken während Deepsleep mqtt & ibroker stevensen 13 788 06.11.2020 21:07
Letzter Beitrag: nbk83
  Wemos D1 mini (8266) und OTA Probleme Arduino4Fun 55 2.803 16.10.2020 21:30
Letzter Beitrag: hotsystems
  ESP8266 - MQTT Probleme mit SSL decrypt tenor 8 986 22.09.2020 19:33
Letzter Beitrag: tenor
  remoteIP() mit Client.h? miq19 6 770 11.09.2020 10:21
Letzter Beitrag: miq19
  ESP32 "ESP32 BLE Keyboard library" und Pairing Probleme Arduino4Fun 0 794 23.05.2020 18:47
Letzter Beitrag: Arduino4Fun
  Seit heute 17.05.2020 Probleme mit UDP DO3GE 14 1.944 18.05.2020 19:04
Letzter Beitrag: Fips
  Pwd Abfragen das Client beim Verbindungsversuch übergibt Fips 2 761 17.04.2020 08:28
Letzter Beitrag: Fips

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste