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, Client, Loop
26.07.2016, 19:43
Beitrag #1
Question Webserver, Client, Loop
Hey Leute Wink



Es geht um diesen Code für einen Webserver:

Code:
#include <ESP8266WiFi.h>

const char* ssid = "ESP-Accesspoint";
const char* password = "12345678";

unsigned long ulReqcount;


WiFiServer server(90);

void setup()
{
  ulReqcount=0;
  
  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // start serial
  Serial.begin(9600);
  delay(1);
  
  // AP mode
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  server.begin();
}

void loop()
{
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client)
  {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  unsigned long ultimeout = millis()+250;
  while(!client.available() && (millis()<ultimeout) )
  {
    delay(1);
  }
  if(millis()>ultimeout)
  {
    Serial.println("client connection time-out!");
    return;
  }
  
  // Read the first line of the request
  String sRequest = client.readStringUntil('\r');
  //Serial.println(sRequest);
  client.flush();
  
  // stop client, if request is empty
  if(sRequest=="")
  {
    Serial.println("empty request! - stopping client");
    client.stop();
    return;
  }
  
  // get path; end of path is either space or ?
  // Syntax is e.g. GET /?pin=MOTOR1STOP HTTP/1.1
  String sPath="",sParam="", sCmd="";
  String sGetstart="GET ";
  int iStart,iEndSpace,iEndQuest;
  iStart = sRequest.indexOf(sGetstart);
  if (iStart>=0)
  {
    iStart+=+sGetstart.length();
    iEndSpace = sRequest.indexOf(" ",iStart);
    iEndQuest = sRequest.indexOf("?",iStart);
    
    // are there parameters?
    if(iEndSpace>0)
    {
      if(iEndQuest>0)
      {
        // there are parameters
        sPath  = sRequest.substring(iStart,iEndQuest);
        sParam = sRequest.substring(iEndQuest,iEndSpace);
      }
      else
      {
        // NO parameters
        sPath  = sRequest.substring(iStart,iEndSpace);
      }
    }
  }
  
  ///////////////////////////////////////////////////////////////////////////////
  // output parameters to serial, you may connect e.g. an Arduino and react on it
  ///////////////////////////////////////////////////////////////////////////////
  if(sParam.length()>0)
  {
    int iEqu=sParam.indexOf("=");
    if(iEqu>=0)
    {
      sCmd = sParam.substring(iEqu+1,sParam.length());
      Serial.println(sCmd);
    }
  }
  
  
  ///////////////////////////
  // format the html response
  ///////////////////////////
  String sResponse,sHeader;
  
  ////////////////////////////
  // 404 for non-matching path
  ////////////////////////////
  if(sPath!="/")
  {
    sResponse="<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>";
    
    sHeader  = "HTTP/1.1 404 Not found\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }
  ///////////////////////
  // format the html page
  ///////////////////////
  else
  {
    ulReqcount++;
    sResponse  = "<html><head><title>Demo f&uumlr ESP8266 Steuerung</title></head><body>";
    sResponse += "<font color=\"#000000\"><body bgcolor=\"#d0d0f0\">";
    sResponse += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
    sResponse += "<h1>Demo f&uumlr ESP8266 Access Point</h1>";
    sResponse += "Funktion 1 schaltet GPIO2 und erzeugt eine serielle Ausgabe.<BR>";
    sResponse += "Funktion 2 erzeugt nur eine serielle Ausgabe.<BR>";
    sResponse += "<FONT SIZE=+1>";
    sResponse += "<p>Funktion 1 <a href=\"?pin=FUNCTION1ON\"><button>einschalten</button></a>&nbsp;<a href=\"?pin=FUNCTION1OFF\"><button>ausschalten</button></a></p>";
    sResponse += "<p>Funktion 2 <a href=\"?pin=FUNCTION2ON\"><button>einschalten</button></a>&nbsp;<a href=\"?pin=FUNCTION2OFF\"><button>ausschalten</button></a></p>";
    
    //////////////////////
    // react on parameters
    //////////////////////
    if (sCmd.length()>0)
    {
      // write received command to html page
      sResponse += "Kommando:" + sCmd + "<BR>";
      
      // switch GPIO
      if(sCmd.indexOf("FUNCTION1ON")>=0)
      {
        digitalWrite(2, 1);
      }
      else if(sCmd.indexOf("FUNCTION1OFF")>=0)
      {
        digitalWrite(2, 0);
      }
    }
    
    sResponse += "<FONT SIZE=-2>";
    sResponse += "<BR>Aufrufz&auml;hler=";
    sResponse += ulReqcount;
    sResponse += "<BR>";
    sResponse += "<BR>";
    sResponse += "</body></html>";
    
    sHeader  = "HTTP/1.1 200 OK\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }
  
  // Send the response to the client
  client.print(sHeader);
  client.print(sResponse);
  
  // and stop the client
  client.stop();
  Serial.println("Client disonnected");
}


Der Code an sich ist ok, meine Frage dazu bezieht sich auf den ersten Teil im Loop des Codes.

Ich wollte den Code so verändern das dieser als Beispiel 3 Unterprogramme beinhaltet die dann über den Webserver ausgewählt werden und das jeweilige Unterprogramm solange läuft bis eben über den Webserver ein anderes der 3 Unterprogramme ausgewählt wird.

Code:
#include <ESP8266WiFi.h>

const char* ssid = "ESP-Accesspoint";
const char* password = "12345678";

unsigned long ulReqcount;


WiFiServer server(90);

void setup()
{
  ulReqcount=0;
  
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  Serial.begin(9600);
  delay(1);
  
  // AP mode
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid, password);
  server.begin();
}




void UP1 () {

  
}



void UP2 () {

  
}


void UP3 () {


  
}


void loop()
{
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client)
  {
    return;
  }
  
  // Wait until the client sends some data
  Serial.println("new client");
  unsigned long ultimeout = millis()+250;
  while(!client.available() && (millis()<ultimeout) )
  {
    delay(1);
  }
  if(millis()>ultimeout)
  {
    Serial.println("client connection time-out!");
    return;
  }
  
  // Read the first line of the request
  String sRequest = client.readStringUntil('\r');
  //Serial.println(sRequest);
  client.flush();
  
  // stop client, if request is empty
  if(sRequest=="")
  {
    Serial.println("empty request! - stopping client");
    client.stop();
    return;
  }
  
  // get path; end of path is either space or ?
  // Syntax is e.g. GET /?pin=MOTOR1STOP HTTP/1.1
  String sPath="",sParam="", sCmd="";
  String sGetstart="GET ";
  int iStart,iEndSpace,iEndQuest;
  iStart = sRequest.indexOf(sGetstart);
  if (iStart>=0)
  {
    iStart+=+sGetstart.length();
    iEndSpace = sRequest.indexOf(" ",iStart);
    iEndQuest = sRequest.indexOf("?",iStart);
    
    // are there parameters?
    if(iEndSpace>0)
    {
      if(iEndQuest>0)
      {
        // there are parameters
        sPath  = sRequest.substring(iStart,iEndQuest);
        sParam = sRequest.substring(iEndQuest,iEndSpace);
      }
      else
      {
        // NO parameters
        sPath  = sRequest.substring(iStart,iEndSpace);
      }
    }
  }
  
  ///////////////////////////////////////////////////////////////////////////////
  // output parameters to serial, you may connect e.g. an Arduino and react on it
  ///////////////////////////////////////////////////////////////////////////////
  if(sParam.length()>0)
  {
    int iEqu=sParam.indexOf("=");
    if(iEqu>=0)
    {
      sCmd = sParam.substring(iEqu+1,sParam.length());
      Serial.println(sCmd);
    }
  }
  
  
  ///////////////////////////
  // format the html response
  ///////////////////////////
  String sResponse,sHeader;
  
  ////////////////////////////
  // 404 for non-matching path
  ////////////////////////////
  if(sPath!="/")
  {
    sResponse="<html><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL was not found on this server.</p></body></html>";
    
    sHeader  = "HTTP/1.1 404 Not found\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }
  ///////////////////////
  // format the html page
  ///////////////////////
  else
  {
    ulReqcount++;
    sResponse  = "<html><head><title>Demo f&uumlr ESP8266 Steuerung</title></head><body>";
    sResponse += "<font color=\"#000000\"><body bgcolor=\"#d0d0f0\">";
    sResponse += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">";
    sResponse += "<h1>Demo f&uumlr ESP8266 Access Point</h1>";
    sResponse += "Funktion 1 schaltet GPIO2 und erzeugt eine serielle Ausgabe.<BR>";
    sResponse += "Funktion 2 erzeugt nur eine serielle Ausgabe.<BR>";
    sResponse += "<FONT SIZE=+1>";
    sResponse += "<p>UP 1 <a href=\"?pin=UP1\"><button>einschalten</button></a>&nbsp;<a href=\"?pin=UP1_off\"><button>ausschalten</button></a></p>";
    sResponse += "<p>UP 2 <a href=\"?pin=UP2\"><button>einschalten</button></a>&nbsp;<a href=\"?pin=UP2_off\"><button>ausschalten</button></a></p>";
    sResponse += "<p>UP 3 <a href=\"?pin=UP3\"><button>einschalten</button></a>&nbsp;<a href=\"?pin=UP3_off\"><button>ausschalten</button></a></p>";

    //////////////////////
    // react on parameters
    //////////////////////
    if (sCmd.length()>0)
    {
      // write received command to html page
      sResponse += "Kommando:" + sCmd + "<BR>";
      
      if(sCmd.indexOf("UP1")>=0)
      {

        UP1();
        
        
      }
      else if(sCmd.indexOf("UP2")>=0)
      {

        UP2();


        
      }

      else if(sCmd.indexOf("UP3")>=0)
      {
        
        UP3();

        
      }
    }
    
    sResponse += "<FONT SIZE=-2>";
    sResponse += "<BR>Aufrufz&auml;hler=";
    sResponse += ulReqcount;
    sResponse += "<BR>";
    sResponse += "<BR>";
    sResponse += "</body></html>";
    
    sHeader  = "HTTP/1.1 200 OK\r\n";
    sHeader += "Content-Length: ";
    sHeader += sResponse.length();
    sHeader += "\r\n";
    sHeader += "Content-Type: text/html\r\n";
    sHeader += "Connection: close\r\n";
    sHeader += "\r\n";
  }
  
  // Send the response to the client
  client.print(sHeader);
  client.print(sResponse);
  
  // and stop the client
  client.stop();
  Serial.println("Client disonnected");
}

Jetzt ist das Problem das ich zwar die Auswahl hinbekomme aber das jeweilige Unterprogramm nur exakt 1 x abgearbeitet wird und danach wird ja wieder auf einen neuen "Client" gewartet.

Hat jemand eine Idee oder Tipp wie ich das machen könnte?


Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.07.2016, 12:03
Beitrag #2
RE: Webserver, Client, Loop
Niemand eine Idee? Wink

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2016, 11:23
Beitrag #3
RE: Webserver, Client, Loop
(27.07.2016 12:03)Marc2014 schrieb:  Niemand eine Idee? Wink

Es ist ja bei allen Webservern so das die Verbindung nach der Datenübernahme ( der Client) wieder getrennt wird. Und dann wieder als neuer (Client) verbunden wird.

Hat niemand mal damit rumgespielt und eine Lösung für das generelle Problem gefunden?

Notfalls würde es mir schon weiterhelfen wenn ich über den Webserver zwar jedesmal als "neuer client" verbunden werde aber im Hintergrund das jeweilige Unterprogramm weiter arbeitet bis eben ein anderes ausgewählt wird.


Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2016, 19:51
Beitrag #4
RE: Webserver, Client, Loop
Grundsätzlich ist das HTTP-Protokoll zustandslos, d.h. wenn der Webserver geantwortet hat, weiß er nicht mehr, das es die Anfrage gab.

Um dennoch Informationen über mehrere Aufrufe zusammen zu halten (z.B. Einkaufswagen) baut man da eine Sessionverwaltung auf. Das halte ich auf einem Arduino für speicherkritisch, wenn die Anzahl beliebig hoch sein soll.

Hier kommt es jetzt darauf an, wie Dein Programm arbeiten soll. Gibt es nur einen einzigen Client, der darauf zu greift oder können das beliebig viele sein?

Wenn es nur einer ist, dann kannst Du einfach eine globale Variable (z.B. byte unterProgramm = 0) nehmen.

Wenn eine Auswahl kommt, schreibst Du den Wert in diese Variable und bei jedem Loop-Durchlauf führst Du das Unterprogramm aus.

Du solltest evtl. auch über eine Steuerfunktion "Aus" nachdenken, die die Variable wieder auf 0 setzt.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2016, 20:39
Beitrag #5
RE: Webserver, Client, Loop
Hey Tommy Wink

Danke für deine Antwort.

Es ist immer nur ein Client der darauf zugreifen soll.

Mein Problem ist eigentlich "nur" das wenn ich auf der Weboberfläche den Button für Unterprogramm 1 betätige das Unterprogramm genau 1x ausgeführt wird und dann wartet er wieder auf einen neuen Client.

Aber es soll ja eigentlich so ablaufen:

Wenn ein neuer Client verbunden ist soll dieser das Programm wählen dann wird das jeweilige Unterprogramm gestartet und läuft dauerschleife bis eben wieder eine neuer Client zb. ein anderes Unterprogramm startet.

Und da liegt mein Problem ich finde keine Lösung Huh

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2016, 20:45
Beitrag #6
RE: Webserver, Client, Loop
(29.07.2016 20:39)Marc2014 schrieb:  Und da liegt mein Problem ich finde keine Lösung Huh

Die Lösung mit der globalen Variable habe ich Dir doch bereits beschrieben.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.07.2016, 21:04
Beitrag #7
RE: Webserver, Client, Loop
Hey Tommy Wink

Ich DANKE dir Big Grin Shy

Jetzt geht alles wie ich es mir vorgestellt habe!

Super, nochmal vielen Dank für deine Hilfe.

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  ESP8266 ESP12-E Webserver-Frage Claus_M 8 233 14.11.2016 22:02
Letzter Beitrag: Claus_M
  Webserver + Bild als Hintergrund ?! Marc2014 8 243 11.10.2016 21:39
Letzter Beitrag: Bitklopfer
  ESP8266 Webserver Programmieren HDT 11 749 23.08.2016 13:28
Letzter Beitrag: HDT
  Hilfe gesucht. Webserver Statsiche und Dynamische HTMl Seite b3ta 11 447 22.08.2016 08:07
Letzter Beitrag: b3ta
  ESP8266 Webserver Marc2014 0 345 30.07.2016 20:15
Letzter Beitrag: Marc2014
  Wetterstation mit Vorhersage auf Webserver reimundko 8 586 05.06.2016 16:06
Letzter Beitrag: reimundko
  Webserver Textfeld jannis.f 15 1.926 15.05.2016 16:48
Letzter Beitrag: avoid
  Funktion in Loop einmalig ausführen Haustechno 4 643 09.03.2016 22:43
Letzter Beitrag: Haustechno
  html, client , NODEMCULUA, Wifi, match request , Frage Marc2014 2 360 15.02.2016 18:41
Letzter Beitrag: Marc2014
  Webserver erzeugt zwei Durchläufe. favicon.ico?!? WOHER??? BERND87 6 1.572 04.02.2016 13:56
Letzter Beitrag: Pit

Gehe zu:


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