ESP8266 Daten übertragen im Wlan

Hallo
mein Plan ist ein Wlan mit zwei oder drei Esp8266 ein seperates Wlan ohne Internetanbindung einzurichten. ZB. einen als Access Point und zwei als Client

Wie kann am einfachsten eine Datenübertragung zb. Messwerte oder Strings zwischen dem ESPs durchgeführt werden.

Eine andere Frage noch : mit welcher Methode kann ein ESP Client mit Internetanbindung Daten von einer Webseite die ein ESP Server in das Internet sendet auslesen?

Grüße Holger

Datenaustausch z.B. mit UDP.

Geräte können keine Website ins internet "senden".
Evtl suchst du nach json und schaust ob das was ist.

Holger_mb:
mit welcher Methode kann ein ESP Client mit Internetanbindung Daten von einer Webseite die ein ESP Server in das Internet sendet auslesen?

Definiere das mal etwas genauer

Ein ESP oder Arduino als Webserver stellt eine Webseite bereit zb. zum Anzeigen eines Sensorwertes oder zum Schalten ein anderer ESP oder Arduino kann über das Internet auf die Webseite zugreifen und die Sensordaten einlesen oder einen Schaltvorgang aulösen.
Einen Webserserver habe ich laufen mit einen ESP8266 ,eine Internetseite zum Schalten und Anzeigen von Sensordaten.

Holger

Ok, und wo genau ist nun das Problem?

Falls du mit dem abrufenden Esp8266 Probleme hast, die ganze Webseite zu parsen, richte auf dem Server Esp8266 eine url ein, die was maschinenfreundliches zurück gibt und keine HTML-Seite

richte auf dem Server Esp8266 eine url ein, die was maschinenfreundliches zurück gibt und keine HTML-Seite

Richtig!
HTML ist nur für Menschen gedacht!

Eigentlich verwendet man ganz gerne XML, wenn Maschinen miteinander quatschen sollen.
Aber da das DOM zu komplex für µC ist, begnügt man sich meist mit schlanken HTTP - REST Implementierungen

Hallo

Was ist das Mittiel der Wahl für die maschinenfreundliche Unterhaltung bzw.die schlanken HTTP - REST Implementierungen? Ich habe hier keine Erfahrungen.

Das müsste dann paralell zur Internetseite laufen, da ich die Internetseite als Oberfläche für das Smartphone brauche. Also das Smartphone als Station zum Schalten und eine andere Station mit dem zweiten ESP zum Speichern , automatischen Reraktionen oder Anzeigen der Sensordaten übertragen im Internet von dem anderen ESP.

Danke Holger

Vielleicht erstmal dieses lesen:

ich bin bei meinem Projekten mit Ajax XML Requests immer ganz gut gefahren, es gibt hierzu auch viele Tutorials im inet die du in abgewandelter Form ruck zuck für deine Zwecke zum Laufen bekommst.

Ich habe es so gemacht:
Anfrage an die IP, Antwort mit Webseite in html für Browser und Smartphone
Anfrage an IP/testwerte, Antwort
30.1;28.3;25.7;30.1;29.9;28.0;8;2.92;10.0;-3;
was ich direkt mit strtok auswerten kann, ohne weiteres Gedöns. Für wichtige Daten könnte man noch eine Prüfsumme oder so mitschicken.

Keep it simple

Danke für die Antworten,

hier mein Server :

HTTP 1.1 Webserver for ESP8266 
for ESP8266 adapted Arduino IDE

--------------------------------------------------*/

#include <ESP8266WiFi.h>

const char* ssid = "FRITZ!Box Fon WLAN 7170";
const char* password = "--------------------";

unsigned long ulReqcount;
unsigned long ulReconncount;

int ADC;
int Schalter=0;

// Create an instance of the server on Port 80
WiFiServer server(80);

void setup() 
{
  // setup globals
  ulReqcount=0; 
  ulReconncount=0;
  
  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // start serial
  Serial.begin(9600);
  delay(1);
  
  // inital connect
  WiFi.mode(WIFI_STA);
  WiFiStart();
}

void WiFiStart()
{
  
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() 
{
  // check if WLAN is connected
  if (WiFi.status() != WL_CONNECTED)
  {
    WiFiStart();
  }
  
  // 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
  {
    
    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>ESP8266 Steuerung";
    sResponse += " in Markersbach";
    sResponse += "<FONT SIZE=-1> 

";
    sResponse += "Funktion 1    Schalter GPI02 
";
    sResponse += "Funktion 2    Voltmeter

";
    sResponse += "<FONT SIZE=+2>";
    sResponse += "<p>Funktion 1  <a href=\"?pin=Schalter_EIN\"><button>einschalten</button></a>&nbsp; <a href=\"?pin=Schalter_AUS\"><button>ausschalten</button></a></p>";
    sResponse += "<p>Funktion 2  <a href=\"?pin=messen\"><button>  messen  </button></a></p>";
    
    //////////////////////
    // react on parameters
    //////////////////////
    if (sCmd.length()>0)
    {
      // write received command to html page
      sResponse += "<FONT SIZE=-1>";
      
      // switch GPIO
      if(sCmd.indexOf("Schalter_EIN")>=0)
      {
        digitalWrite(2, 1);ulReqcount++;
        Schalter=1;
      }
      else if(sCmd.indexOf("Schalter_AUS")>=0)
      {
        digitalWrite(2, 0);ulReqcount++;
        Schalter=0;
      }
      else if(sCmd.indexOf("messen")>=0)
      {
        ADC = analogRead(A0);ulReqcount++;
      }
    }

    sResponse += "<FONT SIZE=+2>";
    sResponse += "
Spannung:  "; 
    sResponse += ADC;
    sResponse += " mV"; 
    sResponse += "
";
    
    sResponse += "<FONT SIZE=-2>";

    if(Schalter==1)
      {
        sResponse += "Schalter ist AN
"; 
      }
      else if(Schalter==0)
      {
        sResponse += "Schalter ist AUS
";
      } 


    sResponse += "
Aufrufz&auml;hler= "; 
    sResponse += ulReqcount;
    sResponse += " - Verbindungsz&auml;hler= "; 
    sResponse += ulReconncount;
    sResponse += "
";
    sResponse += "Holger Weiss
";
    sResponse += "Kommando:  " + sCmd + "
";
    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");
}

Noch Mal, Die Zweite !!!
Habe den Post zu schnell abgesendet

Hier noch mal mein Server:

HTTP 1.1 Webserver for ESP8266 
for ESP8266 adapted Arduino IDE

--------------------------------------------------*/

#include <ESP8266WiFi.h>

const char* ssid = "FRITZ!Box Fon WLAN 7170";
const char* password = "--------------";

unsigned long ulReqcount;
unsigned long ulReconncount;

int ADC;
int Schalter=0;

// Create an instance of the server on Port 80
WiFiServer server(80);

void setup() 
{
  // setup globals
  ulReqcount=0; 
  ulReconncount=0;
  
  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
  
  // start serial
  Serial.begin(9600);
  delay(1);
  
  // inital connect
  WiFi.mode(WIFI_STA);
  WiFiStart();
}

void WiFiStart()
{
  
  
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() 
{
  // check if WLAN is connected
  if (WiFi.status() != WL_CONNECTED)
  {
    WiFiStart();
  }
  
  // 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
  {
    
    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>ESP8266 Steuerung";
    sResponse += " in Markersbach";
    sResponse += "<FONT SIZE=-1> 

";
    sResponse += "Funktion 1    Schalter GPI02 
";
    sResponse += "Funktion 2    Voltmeter

";
    sResponse += "<FONT SIZE=+2>";
    sResponse += "<p>Funktion 1  <a href=\"?pin=Schalter_EIN\"><button>einschalten</button></a>&nbsp; <a href=\"?pin=Schalter_AUS\"><button>ausschalten</button></a></p>";
    sResponse += "<p>Funktion 2  <a href=\"?pin=messen\"><button>  messen  </button></a></p>";
    
    //////////////////////
    // react on parameters
    //////////////////////
    if (sCmd.length()>0)
    {
      // write received command to html page
      sResponse += "<FONT SIZE=-1>";
      
      // switch GPIO
      if(sCmd.indexOf("Schalter_EIN")>=0)
      {
        digitalWrite(2, 1);ulReqcount++;
        Schalter=1;
      }
      else if(sCmd.indexOf("Schalter_AUS")>=0)
      {
        digitalWrite(2, 0);ulReqcount++;
        Schalter=0;
      }
      else if(sCmd.indexOf("messen")>=0)
      {
        ADC = analogRead(A0);ulReqcount++;
      }
    }

    sResponse += "<FONT SIZE=+2>";
    sResponse += "
Spannung:  "; 
    sResponse += ADC;
    sResponse += " mV"; 
    sResponse += "
";
    
    sResponse += "<FONT SIZE=-2>";

    if(Schalter==1)
      {
        sResponse += "Schalter ist AN
"; 
      }
      else if(Schalter==0)
      {
        sResponse += "Schalter ist AUS
";
      } 


    sResponse += "
Aufrufz&auml;hler= "; 
    sResponse += ulReqcount;
    sResponse += " - Verbindungsz&auml;hler= "; 
    sResponse += ulReconncount;
    sResponse += "
";
    sResponse += "Holger Weiss
";
    sResponse += "Kommando:  " + sCmd + "
";
    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");
}

Auf den Smartphone läuft alles super. In der einen Funktion wird die Spannung auf der HTML Seite im Smartphone angezeigt. Ich möchte die Spannung und die Schaltzustände über einen anderen ESP als Client über das Internet abrufen. Ich brauche noch etwas Hilfe für folgendes:

“”" Anfrage an IP/testwerte, Antwort
30.1;28.3;25.7;30.1;29.9;28.0;8;2.92;10.0;-3;
was ich direkt mit strtok auswerten kann, ohne weiteres Gedöns. “”"

Danke Holger

Quick and dirty: Anstatt

  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";
  }

schreibst du:

  if(sPath!="/")
  {
    sHeader  = messwertVolt1;
    sHeader += ";";
    sHeader += messwertwasweissich1;
    sHeader += ";";
    sHeader  = messwertVolt2;
    sHeader += ";";
    sHeader += messwertwasweissich2;
    sHeader += ";";
    sHeader += "\r\n";
  }

dann kommt immer der String mit den Messwerten, wenn du etwas nach dem “/” schreibst, z.B. 192.168.1.150/messwerte

Hallo danke, ich werde es gleich morgen ausprobieren.

Ich muß noch mal nerven. Wenn ich so etwas wie if(sPath=="/werte") benutze, kann ich dann auch gezielte Anfragen an den Server starten.z.B. 192.168.1.150/werte

Holger

ja, aber danach mit else if weiter, damit du mehrere abfragen kannst

Hallo,
sollte, es so einfach sein? Der Teufel ist hoffentlich nicht im Deteil.
Heute habe ich es noch nicht getestet. Keine Zeit.

Danke Holger

ja, es ist so einfach, deswegen kommen die meisten ja nicht drauf