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
Webserver sporadisch down
13.05.2019, 15:38
Beitrag #1
Webserver sporadisch down
Hallo zusammen,
speziell an FIPS...
Der Sketch zum verwalten/aufrufen des Webservers funktioniert eigentlich einwandfrei...

Folgendes passiert:
Wenn ab und zu (ca. 1 mal pro Nacht) meine Fritzbox spinnt, muss sich der ESP32 neu verbinden. Dies mache ich in einer Routineprüfung auf Connected.
Dabei zähle ich auch hoch und kann am nächsten Tag am ESP durch eine kleine Blinkroutine mitzählen, wieviele Reconnects mittlerweile geschehen sind.
Da alles ohne Delays in Form von Schrittketten verläuft, ist die Maschine ja noch fleißig am Leben, nur via IP komme ich nicht mehr drauf !!!

Frage: Muss ich den server.begin() nach jedem Reconnect auch neu starten ?
Muss ich ihn dazu vorher beenden ?

Danke für die Infos...
Shrimps
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.05.2019, 17:12
Beitrag #2
RE: Webserver sporadisch down
(13.05.2019 15:38)shrimps schrieb:  Frage: Muss ich den server.begin() nach jedem Reconnect auch neu starten ?
Muss ich ihn dazu vorher beenden ?
Zweimal Nein.

(13.05.2019 15:38)shrimps schrieb:  Folgendes passiert:
Wenn ab und zu (ca. 1 mal pro Nacht) meine Fritzbox spinnt, muss sich der ESP32 neu verbinden. Dies mache ich in einer Routineprüfung auf Connected.
Dabei zähle ich auch hoch und kann am nächsten Tag am ESP durch eine kleine Blinkroutine mitzählen, wieviele Reconnects mittlerweile geschehen sind.
Da alles ohne Delays in Form von Schrittketten verläuft, ist die Maschine ja noch fleißig am Leben, nur via IP komme ich nicht mehr drauf !!!

Wiso spinnt denn deine Fritzbox?
Ich habe nur mit einem Esp... ab und zu abbrüche, da er weit entfernt vom Router arbeitet.

Mich würde interessieren wo und wie du Zählst.
Code:
void Connect() {
  // Zählst du hier
  ESP.restart();
}

void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    // oder hier
    Connect();
  }
}

Den relevanten Code solltest du möglichst zur Verfügung stellen.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.05.2019, 18:50
Beitrag #3
RE: Webserver sporadisch down
Ich versuch mal einen relevanten Ausschnitt zu posten:
Code:
// Board: wemos-lolin32
// Testboard esp32-devmodule
#include <WebServer.h>
#include <ArduinoOTA.h>
#include <SPIFFS.h>
#define FILESYSTEM SPIFFS
// You only need to format the filesystem once
#define FORMAT_FILESYSTEM false
#define DEBUGGING             // Auskommentieren wenn keine Serielle Ausgabe erforderlich ist
#ifdef DEBUGGING
#define DEBUG(...) Serial.println(__VA_ARGS__)
#define DEBUG_F(...) Serial.printf("Funktion: %s meldet in Zeile: %d -> ", __PRETTY_FUNCTION__, __LINE__); Serial.println(__VA_ARGS__)
#else
#define DEBUG(...)
#define DEBUG_F(...)
#endif

#include "ArduinoJson.h"
#include "variablen.h"
#include "tools.h"
#include "pumpen.h"
#include "i2c_data.h"
#include "becken.h"

WebServer server(80);

#include "dateisystem.h"  // spiffs()
#include "admin.h"
#include "connect.h"
#include "lokalzeit.h"
#include "iniread.h"
#include "tageswerte.h"
#include "logfile.h"

#include "webpumpen.h"
#include "ds18b20.h"

void setup() {

  Serial.begin(115200);
  DEBUG((String)"\nSketchname: " + (__FILE__) + "\nBuild: " + (__TIMESTAMP__) + "\n" );
  spiffs();
  admin();
  INI_Read();

  while(! Connect());

   setupTime();
  // Serial.println(localTime());

  Tageswerte_schreiben();
  
  getwebpumpendata();
  putwebpumpendata();

  ArduinoOTA.onStart([]() {
    //save();                       //Einkommentieren wenn Werte vor dem Update gesichert werden sollen
  });
  ArduinoOTA.begin();
  server.begin();
  DEBUG("HTTP Server gestartet\n\n");
  Logfile("Anlage gestartet");
}

void loop() {
  byte i;
  Connect();  // Regelmässig wifi prüfen

  ds18b20();
  
  if (Timer2(10*1000)) {
    float temp1 = ds18b20();
    Serial.print("Temperature: ");
    Serial.print(temp1,1);
    Serial.println(" C");
    Logfile("Temperatur: " + String(temp1));
  }

  
  ArduinoOTA.handle();
  server.handleClient();
  if (millis() < 0x2FFF || millis() > 0xFFFFF0FF) runtime();  // Cleanup millis-overflow

  test();

  // Alle 20ms laufen lassen
  if (Task1(20)) {

    for (i=1; i<def_Anzahl_Becken; i++){
      Becken_Action(i);
    }

    for (i=1; i<def_Anzahl_Pumpen; i++){
      Pumpe_Action(i);
    }
  }



}

Im "Main" ist mit aufgefallen, das das Logwrite gestern um 17:22 aufgehört hat !
Da ich dort eine Zeitfunktion aufrufe könnte das auch schon wegen mangelndem Server zusammen hängen
Die Funktion Test läuft gnadenlos immer weiter !

Code:
void test(){

  // Die 3.er LED-Ampel
  const byte LED_R = 27;
  const byte LED_Y = 26;
  const byte LED_G = 25;
  
  boolean bInit = true;
  static int iStep = 0;
  static int iCounter = 0;

  if (bInit){
    pinMode(LED_R, OUTPUT);
    pinMode(LED_Y, OUTPUT);
    pinMode(LED_G, OUTPUT);
    bInit = false;
  }

  switch (iStep) {
  
    case 0:
      iCounter = 0;
      digitalWrite(LED_R, HIGH);
      digitalWrite(LED_Y, HIGH);
      digitalWrite(LED_G, HIGH);
      if (Takt(5000)){
        Takt(1,true);
        iStep ++;
      }
      break;

    case 1:
      digitalWrite(LED_R, LOW);
      if (Takt(1000)){
        Takt(1,true);
        iStep ++;
      }
      break;

    case 2:
      digitalWrite(LED_Y, LOW);
      if (Takt(1000)){
        iStep ++;
        Takt(1,true);
      }
      break;

    case 3:
      digitalWrite(LED_G, LOW);
      if (Takt(1000)){
        iStep ++;
        Takt(1,true);
      }
      break;

    case 4:
      digitalWrite(LED_Y, HIGH);
      if (Takt(500)){
        Takt(1,true);
        iStep ++;
        iCounter ++;
      }
      break;

    case 5:
      digitalWrite(LED_Y, LOW);
      if (Takt(500)){
        Takt(1,true);
        iStep = 4;
      }
      if (iCounter == iReconnects){
        Takt(1,true);
        iStep = 6;
      }
      break;

    case 6:
      if (Takt(5000)){
        Takt(1,true);
        iStep = 0;
      }
      break;
  }
}

Hier nun der Connect:

Code:
const char HTML1[] PROGMEM = "<!DOCTYPE HTML><html lang='de'><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
const char HTML2[] PROGMEM = "<style>button,input{padding:.5em 2em}body{background:#a9a9a9}</style><title>Login Manager</title></head><body><h2>SSID Passwort\
</h2><form action='/' method='post'><p><label>SSID:<br><input name='ssid' placeholder='Name vom Netzwerk' required></label></p><p><label>Passwort:<br><input \
name='passwort' pattern='[!-~]{8,64}' placeholder='PW vom Netzwerk' required></label></p><button>Absenden</button></form></body></html>";
const char HTML3[] PROGMEM = "</head><body style ='background: #a9a9a9'><h3> Ihre Eingaben wurden erfolgreich übertragen. Der Server wird neu gestartet. </h3>";
const char HTML4[] PROGMEM = "<title>Verbunden</title></head><body style='background: #a9a9a9'><center><h2>Erfolgreich angemeldet!</h2><p>Super</p></center>";

char ssid[33];
char password[65];

File file;

// prototype
void handleRoot();
void handleConfig();

#include <algorithm>    // string.replace um /CRLF gegen /LF zu tauschen, leider hängt windows dies beim editieren dran...

boolean Connect(boolean bNextStep = false) {

  boolean bConnected = false;

  static unsigned int iStep = 0;
  static unsigned int iStartversuche = 0;
  static byte iSekunden = 0;

  switch (iStep) {

    case 0:
      SPIFFS.begin(true);
      // File file = SPIFFS.open("/login.txt", "r");
      file = SPIFFS.open("/login.txt", "r");
      if (file) {
        file.readBytesUntil('\n', ssid, sizeof(ssid));
        file.readBytesUntil('\n', password, sizeof(password));
        file.close();
        // Falls Datei durch Windows-editor geändert wurde, ist ein CR zuviel drin...
        std::replace (ssid, ssid + sizeof(ssid), '\r', '\0');
        std::replace (password, password + sizeof(password), '\r', '\0');
        iStep = 100;
        }
      else {
        Serial.println("/login.txt nicht vorhanden");
        iStep = 10;
      }
      break;

    case 10:
      WiFi.mode(WIFI_AP);                             // Soft-Access-Point-Modus --> Access-Point Adresse http://192.168.4.1/
      Serial.println("Starte Soft AP");
      if (WiFi.softAP("AQUAConfig")) {
        Serial.printf("Verbinde dich mit dem Netzwerk \"AQUAConfig\"\nGib die IP %s im Browser ein\n\n", WiFi.softAPIP().toString().c_str());
        iStep = 20;
      }
      break;

    case 20:
      server.on("/", HTTP_GET, handleRoot);
      server.on("/", HTTP_POST, handleConfig);
      server.begin();
      DEBUG("HTTP Server gestartet\n\n");
      iStep = 30;
      break;

    case 30:
      server.handleClient();
      if (bNextStep) {    // Neues Inifile wurde geschrieben
        iStep = 100;
      }
      break;

    case 100:
      // test ob wifi klappt
      WiFi.disconnect();
      WiFi.mode(WIFI_STA);                                //Stationst-Modus --> Esp32 im Heimnetzwerk einloggen
      WiFi.begin(ssid, password);
      delay(2000);
      iStep = 110;

    case 110:
      iStep = 120;
      if (WiFi.status() == WL_CONNECTED) {
        DEBUG("\nVerbunden mit: " + WiFi.SSID());
        DEBUG("Esp32 IP: " + WiFi.localIP().toString() + "\n");
        DEBUG("Recconections: " + String(iReconnects) + "\n");
        bConnected = true;
        iReconnects ++;
        iStep = 200;
      }
      break;

    case 120:
      iStep = 110;
      iSekunden ++;
      delay(1000);
      Serial.printf(" % i sek\n", iSekunden);        
      if (iSekunden > 10) {     // Ohje, no wifi
        iSekunden = 0;
        iStartversuche ++;
        iStep = 0;
        }
      
      if (iStartversuche > 3) {
        Serial.println("WIFI no connect/data!!!");
        bConnected = false;
        iStep = 120;   // loop death
        }
      break;

    case 200: // Hauptschleife, wir sind connected, fliegen aber ab und zu raus...
      if (WiFi.status() != WL_CONNECTED) {    
        iStep = 210;
      }
      break;

    case 210: // rausgeflogen, aber erstmal neuversuch
      bConnected = false;
      WiFi.disconnect();
      WiFi.mode(WIFI_STA);                                //Stationst-Modus --> Esp32 im Heimnetzwerk einloggen
      WiFi.begin(ssid, password);
      iStep = 220;

    case 220: // rausgeflogen, aber erstmal neuversuch
      if (WiFi.status() == WL_CONNECTED) {
        bConnected = true;
        iReconnects ++;
        iStep = 200;
      }

    if (WifiTimer1(30000)) {
      // Wenn wir solange keinen reconnect hinbekommen müssen wir Alarm schlagen !
      Serial.println("Kein WIFI !!!");
      // Ausgabe auf Display !!!!
      // Nur noch RESET möglich !!!
      }
      break;                

    default:  // Ohje
      break;
  }
  return bConnected;
}  

  

void handleConfig() {
  if (server.hasArg("ssid") && server.hasArg("passwort")) {
    File file = SPIFFS.open("/login.txt", "w");
    file.printf("%s\n%s", server.arg(0).c_str(), server.arg(1).c_str());
    file.close();
    server.send(200, "text/html", (String)HTML1 + HTML3);
    // delay(500);
    Connect(true);
  }
}

void handleRoot() {                                            // Html Startseite
  if (WiFi.status() != WL_CONNECTED) {
    server.send(200, "text/html", (String)HTML1 + HTML2);      // besteht keine Verbindung zur Station wird HTML2 gesendet
  }
  else {
    if (!handleFile(server.urlDecode(server.uri()))) {         // index.html aus Spiffs senden   // ohne "spiffs.ino" Zeile auskommentieren
      server.send(200, "text/html", (String)HTML1 + HTML4);    // existiert keine index.html wird HTML4 gesendet
    }                                                                                            // ohne "spiffs.ino" Zeile auskommentieren
  }
}

void reStation() {                                             // der Funktionsaufruf "reStation();" sollte im "loop" stehen
  static unsigned long letzteMillis = 0;                       // nach Stromausfall startet der Esp.. schneller als der Router
  unsigned long aktuelleMillis = millis();
  if (aktuelleMillis - letzteMillis >= 3e5) {                  // im AP Modus aller 5 Minuten prüfen ob der Router verfügbar ist
    if (WiFi.status() != WL_CONNECTED) Connect();
    letzteMillis = aktuelleMillis;
  }
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2019, 14:59
Beitrag #4
RE: Webserver sporadisch down
Deine switch case Konstrukte sind sehr schwer durchschaubar!

Du zählst aller X Sekunden einen Reconnect. Falls dein Router länger als eine Minute nicht erreichbar ist, sind das nach deiner Zählweise schon mehrere Verbindungsabbrüche pro Minute.

Da du in den Funktionen Connect() und test() die Variable "iStep" lokal deklarierst, ist es mir momentan ein Rätsel wie du am Blinken erkennen kannst wieviele Verbindungsabbrüche du gehabt hast.

Du solltest alles aus der Funktion Connect() der Übersicht halber entfernen was nichts mit dem Verbindungsaufbau zu tun hat.

Zählen würde ich die Abbrüche im loop().
Die Connect() sollte so aufgebaut sein das du erst nach erfolgreicher neuer Verbindung wieder in den loop() kommst. So wäre gewährleistet das du wirklich nur zählst wenn die Verbindung erneut unterbrochen wurde.
Momentan zählst du nach Zeit hoch!

Code:
void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    // du musst hier zählen
    // am besten mit Zeitstempel in eine Datei schreiben.
    Connect();
  }
}

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2019, 16:06 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2019 16:07 von shrimps.)
Beitrag #5
RE: Webserver sporadisch down
Hallo Fips,
erstmal Danke dafür, das du dir diesen doch etwas größeren Code durchgesehen hast.
Ich habe das ganze System versucht auf "Echtzeit" zu halten.
D.h. fast alle Funktionen sind als Schrittketten aufgebaut, welche einen lokalen (statischen) Schrittzähler haben. Dann kann ich die Funktionen vom main aus zyklisch aufrufen.
Die Static vars behalten wähjrend der Laufzeit ihren (lokalen) Inhalt.
Dadurch funktioniert mein Test-LED Anzeige.

Beim Connect ist alles möglichst in kliene Schritte unterteilt, jedoch muss ich ja irgendwann zeitlich entscheiden, ob ein re-connrct überhaupt noch kommt.
Daher die Zeitüberwachung.
Beim Start kann ich das prima beobachen (seriell) wie er die Sekunden bis zum Connect hochzählt, manchmal sehr flott verbunden, dann wieder mehr als 10s.
Ich suche eingentlich die Stelle, wo ich am besten zyklisch ins Logfile reinschreibe, ob der server(www) noch lebt ???
Wie erkenne ich das ?

Danke
Shrimps


(14.05.2019 14:59)Fips schrieb:  Deine switch case Konstrukte sind sehr schwer durchschaubar!

Du zählst aller X Sekunden einen Reconnect. Falls dein Router länger als eine Minute nicht erreichbar ist, sind das nach deiner Zählweise schon mehrere Verbindungsabbrüche pro Minute.

Da du in den Funktionen Connect() und test() die Variable "iStep" lokal deklarierst, ist es mir momentan ein Rätsel wie du am Blinken erkennen kannst wieviele Verbindungsabbrüche du gehabt hast.

Du solltest alles aus der Funktion Connect() der Übersicht halber entfernen was nichts mit dem Verbindungsaufbau zu tun hat.

Zählen würde ich die Abbrüche im loop().
Die Connect() sollte so aufgebaut sein das du erst nach erfolgreicher neuer Verbindung wieder in den loop() kommst. So wäre gewährleistet das du wirklich nur zählst wenn die Verbindung erneut unterbrochen wurde.
Momentan zählst du nach Zeit hoch!

Code:
void loop() {
  if (WiFi.status() != WL_CONNECTED) {
    // du musst hier zählen
    // am besten mit Zeitstempel in eine Datei schreiben.
    Connect();
  }
}

Gruß Fips
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2019, 16:18
Beitrag #6
RE: Webserver sporadisch down
(14.05.2019 16:06)shrimps schrieb:  Ich suche eingentlich die Stelle, wo ich am besten zyklisch ins Logfile reinschreibe, ob der server(www) noch lebt ???
Du hast eigentlich 2 Fälle:

1. Die Verbindung zum WLAN ist weg (das halte ich für unwahrscheinlich). Meine Tests mit dem ESP8266 haben ergeben, dass der extrem schwer aus dem WLAN zu bekommen ist und wenn, sich dann ganz schnell von selbst wieder reconnected.
Das bekommst Du durch Auswertung von WiFi.status() raus.

2. Du hängst noch am WLAN, aber Dein Webserver hat sich verabschiedet. Das kannst Du nur von Außen feststellen, indem Du den Webserver aufrufst.

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
14.05.2019, 16:23 (Dieser Beitrag wurde zuletzt bearbeitet: 14.05.2019 16:29 von Fips.)
Beitrag #7
RE: Webserver sporadisch down
(14.05.2019 16:06)shrimps schrieb:  Die Static vars behalten wähjrend der Laufzeit ihren (lokalen) Inhalt.
Dadurch funktioniert mein Test-LED Anzeige.

Das kann ich noch nicht verstehen!

Wie kommt denn die Anzahl der Abbrüche aus der Funktion "boolean Connect(boolean bNextStep = false)" in die Funktion "void test()" ?

Gruß Fips

(14.05.2019 16:18)Tommy56 schrieb:  2. Du hängst noch am WLAN, aber Dein Webserver hat sich verabschiedet. Das kannst Du nur von Außen feststellen, indem Du den Webserver aufrufst.

Ich habe einen Esp8266 als Webserver weit entfernt vom Router aufgestellt, der ist ab und an nicht erreichbar gewesen. Taucht aber noch in der Liste im Router auf.
Dieser Esp.. sendet als Client auch an einen anderen Server. Neu verbinden/starten kann man dann auch wenn nach Zeit x keine Antwort mehr kommt.

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.05.2019, 16:35
Beitrag #8
RE: Webserver sporadisch down
(14.05.2019 16:23)Fips schrieb:  Dieser Esp.. sendet als Client auch an einen anderen Server. Neu verbinden/starten kann man dann auch wenn nach Zeit x keine Antwort mehr kommt.
Was hat das erfolgreiche/-lose Arbeiten des Clients mit der Funktion des lokalen Webservers zu tun?
Da könnte z.B. auch der andere Webserver down sein und deshalb keine Antwort kommen.
Ob er aus dem WLAN raus ist, hatte ich ja schon mit status() angerissen.

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
  Webserver: Warten auf Eingabe und gleichzeitiger Countdown schnipsel82 11 539 Heute 14:30
Letzter Beitrag: Fips
  ESP8266 als reiner Access Point Verbindung nur sporadisch TobiH 5 450 04.08.2019 18:56
Letzter Beitrag: Tommy56
  ESP32 Webserver download mehrerer Dateien Eisvogel 1 376 11.06.2019 10:42
Letzter Beitrag: Tommy56
  Async Webserver Button mit Inhalt shrimps 9 2.134 27.04.2019 07:37
Letzter Beitrag: Fips
  NodeMCU12E mit UDP Client & UDP Server & Webserver rkuehle 6 3.844 10.02.2019 20:52
Letzter Beitrag: Tommy56
  ESP8266 als SPIFFS/Webserver soll Daten verarbeiten TiRe 23 4.595 23.01.2019 08:03
Letzter Beitrag: Fips
  Via Webserver GPIO schalten arguido 1 2.113 05.05.2018 11:19
Letzter Beitrag: Tommy56
  Einfacher Webserver Nodemcu Esp8266 Onboard Led (Pin) schalten Fips 31 14.495 06.01.2018 20:41
Letzter Beitrag: Tommy56
Lightbulb Sonoff WiFi Wireless Switch per Webserver vom Tablet oder Smartphone aus schalten Fips 1 6.229 12.09.2017 20:45
Letzter Beitrag: Fips
  [Vorstellung] ESP8266 Webserver mit AJAX Tommy56 19 11.562 03.07.2017 12:09
Letzter Beitrag: Tommy56

Gehe zu:


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