- Impressum / Datenschutz / ...
- Projektprobleme
- Kommunikation
- Probleme bei der Kombination Firebase/HTTPS client
Probleme bei der Kombination Firebase/HTTPS client
- devnull69
- Autor
- Offline
- New Member
Weniger
Mehr
- Beiträge: 1
- Dank erhalten: 0
05 Nov 2020 11:18 #704
von devnull69
devnull69 erstellte das Thema 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
kommt es zu Soft WDT Resets direkt beim client.connect().
Wenn ich eine HTTPS-Client-Verbindung zu den gleichen URLs ohne vorherigen Firebase-Zugriff aufbaue, dann funktionieren diese prima!
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 ...
das führt aber zu einem panic core dump (__yield), was mich auch nicht wundert.
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:
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
WiFiClientSecure client;
client.setInsecure(); // to avoid fingerprint stuff
if(!client.connect()) {
Serial.println("connection failed");
} else {
... // hier steht dann client.print("GET ......")
}
kommt es zu Soft WDT Resets direkt beim client.connect().
Wenn ich eine HTTPS-Client-Verbindung zu den gleichen URLs ohne vorherigen Firebase-Zugriff aufbaue, dann funktionieren diese prima!
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 ...
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.
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:
#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();
}
}
}
Bitte Anmelden oder Registrieren um der Konversation beizutreten.
- Aktuelle Seite:
- Startseite
- Impressum / Datenschutz / ...
- Projektprobleme
- Kommunikation
- Probleme bei der Kombination Firebase/HTTPS client