Mehrere Variablenwerte von Client an Server schicken

Es sieht danach aus, dass sich der Thread in eine Richtung bewegt, in der ich mich endgültig nicht mehr auskenne. Ich bin aus diesem Thread also erstmal weg.

Gruß

Gregor

Hier mal ein Beispiel wie man es machen kann.

Client

#include <ESP8266WiFi.h>

const char* ssid = "........";          //Zugangsdaten deines Routers einfügen
const char* password = "........";
const char* host = "192.168.179.21";            // IP des Server
unsigned long previousMillis = 0;

void setup() {
  Serial.begin(250000);
  delay(10);

  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");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
float Temp = 17.8;
byte Schaltstellung = 0;

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= 5000) {
    previousMillis = currentMillis;
    Schaltstellung = !Schaltstellung;
    Temp = Temp + 0.1;
    Serial.print("connecting to ");
    Serial.println(host);

    // Use WiFiClient class to create TCP connections
    WiFiClient client;
    const int httpPort = 80;
    if (!client.connect(host, httpPort)) {
      Serial.println("connection failed");
      return;
    }

    // We now create a URI for the request
    String url = "/ClientSend?Temperatur=";
    url += Temp;
    url += "&Schalter=";
    url += Schaltstellung;

    Serial.print("Requesting URL: ");
    Serial.println(url);

    // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 5000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
      }
    }

    // Read all the lines of the reply from server and print them to Serial
    while (client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
    Serial.println("closing connection");
  }
}

Server

#include <ESP8266WebServer.h>

const char* ssid = "........";          //Zugangsdaten deines Routers einfügen
const char* password = "........";

String Content;

ESP8266WebServer server(80);

void handleRoot() {
  server.send(200, "text/plain", Content);
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void) {
  Serial.begin(250000);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.on("/ClientSend", []() {
    String Temperatur = server.arg("Temperatur");
    String Schaltstellung = server.arg("Schalter");
    Serial.print("Temperatur: "); Serial.println(Temperatur);
    Serial.print("Schalter: "); Serial.println(Schaltstellung);
    Content = "Temperatur: " + Temperatur + " C - Schalter: " + Schaltstellung;
    server.send(204);
  });

  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
}

void loop(void) {
  server.handleClient();
 }

Oder doch lieber UDP?

Gruß Fips

Der Overhead ist bei UDP wesentlich geringer, als mit HTTP.

Gruß Tommy

Tommy56:
Der Overhead ist bei UDP wesentlich geringer, als mit HTTP.

Gruß Tommy

Ist vollkommen klar.
Ich musste das mal bauen, weil ich es bis jetzt auch noch nie gemacht habe.
Und wenn es schon mal funktioniert, zeige ich das als weitere Möglichkeit zur Kommunikation.

Gruß Fips

Das war auch keinesfalls gegen Deinen Beitrag gerichtet. Sorry, wenn das so rüber kam.

Gruß Tommy

Tommy56:
Das war auch keinesfalls gegen Deinen Beitrag gerichtet. Sorry, wenn das so rüber kam.

Gruß Tommy

Ja Nee ist schon klar.
Abwohl das den TO egal sein dürfte, Hauptsache es kommt was an.

Wahrscheinlich hat er es ja schon selbst hinbekommen.

Gruß fips

Wahrscheinlich hat er es ja schon selbst hinbekommen.

Dank eurer Hilfe hab ich es fast geschafft. Ich hab den Datenaustausch per HTTP gemacht, das funktioniert erstmal. Das Projekt von Tommy per UDP muß ich mir noch näher anschauen, aber mir fehlen einfach noch paar Basics. Den vom Client gesendeten String hab ich auch erfolgreich wieder im Serversketch zerlegen können. Den Schaltzustand, also 0 oder 1, habe ich genau wie die Temperatur, nach dem zerlegen jeweils als char. Jetzt will ich einen Ausgang schalten, wenn der Schaltzustand =1 ist.
Folgendes habe ich geschrieben:

//Variable schaltzustand wurde aus dem Client-String extrahiert und ist vom Typ char

int relais = 12;

void setup() {
pinMode(relais, OUTPUT);
}

{void loop(){
const char* vergleich =1;

if (schaltzustand == vergleich){
digitalWrite(relais = HIGH);
}
else
{
digitalWrite(relais = LOW);
}

Serial.println(schaltzustand);
Serial.println(vergleich);
}

Ist schaltzustand 1, sollte doch der Ausgang relais auf High gehen, macht er aber nicht. Das kann doch nur was ganz simples sein. Im SM wird mir für schaltzustand und vergleich eine 1 angezeigt.

computerpap:
Dank eurer Hilfe hab ich es fast geschafft. Ich hab den Datenaustausch per HTTP gemacht, das funktioniert erstmal. Das Projekt von Tommy per UDP muß ich mir noch näher anschauen, aber mir fehlen einfach noch paar Basics. Den vom Client gesendeten String hab ich auch erfolgreich wieder im Serversketch zerlegen können. Den Schaltzustand, also 0 oder 1, habe ich genau wie die Temperatur, nach dem zerlegen jeweils als char. Jetzt will ich einen Ausgang schalten, wenn der Schaltzustand =1 ist.
Folgendes habe ich geschrieben:

Ist schaltzustand 1, sollte doch der Ausgang relais auf High gehen, macht er aber nicht. Das kann doch nur was ganz simples sein. Im SM wird mir für schaltzustand und vergleich eine 1 angezeigt.

Wiso von String nach char??

 server.on("/ClientSend", []() {
    String Temperatur = server.arg("Temperatur");
    String Schaltstellung = server.arg("Schalter");
    Serial.print("Temperatur: "); Serial.println(Temperatur);
    Serial.print("Schalter: "); Serial.println(Schaltstellung);
    if (Schaltstellung == "0") {
      digitalWrite(relais, HIGH);
      Serial.println("Relais aus");
    }
    else {
      digitalWrite(relais, LOW);
      Serial.println("Relais an");
    }
    server.send

Ich habe es mit so nen billigen blauen Relais getestet.
Macht bei mir immer schön klick klack.

Gruß Fips

UDP mal ganz einfach

Client

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "........";          //Zugangsdaten deines Routers einfügen
const char* password = "........";
const char* addr = "192.168.176.26";            // IP vom Server
unsigned int port = 4097;                       // Udp Port vom Server
WiFiUDP Udp;
unsigned long previousMillis = 0;
float Temp = 16.8;
byte Schaltstellung = 0;

void setup()
{
  Serial.begin(250000);
  Serial.println();

  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println(" connected");
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= 5000) {
    previousMillis = currentMillis;
    Schaltstellung = !Schaltstellung;
    Temp = Temp + 0.1;
    Udp.beginPacket(addr, port);
    Udp.print(Schaltstellung);
    Udp.print(" ");
    Udp.print(Temp);
    Udp.endPacket();
  }
}

Server

#include <ESP8266WebServer.h>
#include <WiFiUdp.h>

const char* ssid = "FRITZ!Box 7580 CY";
const char* password = "28042987665003400230";
char incomingPacket[10];                // Puffer für eingehende Pakete
unsigned int localUdpPort = 4097;       // Lokaler Port für UDP-Pakete
int Relais = 12;
String Content;

ESP8266WebServer server(80);
WiFiUDP Udp;
void handleRoot() {
  server.send(200, "text/plain", Content);
}

void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}

void setup(void) {
  pinMode(Relais, OUTPUT);
  digitalWrite(Relais, HIGH);
  Serial.begin(250000);
  WiFi.begin(ssid, password);
  Serial.println("");

  // Wait for connection
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/", handleRoot);
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");
  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
}

void loop(void) {
  server.handleClient();
  UdpPacket();
}

void UdpPacket() {
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
    int len = Udp.read(incomingPacket, 10);
     if (len > 0)  incomingPacket[len] = 0;
    Serial.printf("UDP packet contents: %s\n", incomingPacket, 10);

    char Temperatur[7];
    strcpy(Temperatur, incomingPacket + 2);
    Serial.println(Temperatur);
    Content = Temperatur;
    int Schaltzustand = atoi(incomingPacket );
    if (Schaltzustand == 0) {
      digitalWrite(Relais, HIGH);
      Serial.println("Relais aus");
      Content += " C Relais aus";
    }
    else {
      digitalWrite(Relais, LOW);
      Serial.println("Relais an");
      Content += " C Relais an";
    }
  }
}

und auch das Relais ist mit drin

Gruß Fips

Für was hast Du den HTTP-server noch mit drin? Der wird doch nicht gebraucht und verwirrt nur.

Gruß Tommy

Tommy56:
Für was hast Du den HTTP-server noch mit drin? Der wird doch nicht gebraucht und verwirrt nur.

Gruß Tommy

Im Eingangspost war von einen Server die Rede. Von Udp stand da noch nix.
Für mich ist das so, wenn wir schonmal online sind, bietet es sich doch an die Werte auch gleich noch im Browser anzeigen zu können.

OK,
davon hat er nichts geschrieben. Aber auch nicht was er mit der Temperatur vor hat(LCD, Browser oder gar nichts.

Gruß Fips

Ja, die Infos sind etwas mager. Nur wenn Du das als

UDP mal ganz einfach

titulierst, sollte auch nur UDP drin sein, sonst könnte noch jemand denken, den HTTP-Server braucht man dazu.

Gruß Tommy

OK
habs geändert.

Gruß Fips

computerpap:
Dank eurer Hilfe hab ich es fast geschafft.

Das sind ja mal gute Neuigkeiten. Ich nehme an, dass inzwischen auch das funktioniert, was das „fast geschafft“ zum „geschafft“ macht.

computerpap:
Ich hab den Datenaustausch per HTTP gemacht, das funktioniert erstmal.

Dann würde ich das mit UDP bleiben lassen. Mag sein, dass das die Übertragung noch ein Byte oder zwei schlanker macht, aber wenn es per HTTP funktioniert, funktioniert es (was IMO die Hauptsache ist).

Gruß

Gregor

Aber auch nicht was er mit der Temperatur vor hat(LCD, Browser oder gar nichts.

Temperatur soll nur auf einen Display angezeigt werden.

Dann würde ich das mit UDP bleiben lassen. Mag sein, dass das die Übertragung noch ein Byte oder zwei schlanker macht, aber wenn es per HTTP funktioniert, funktioniert es (was IMO die Hauptsache ist).

Klar bin ich erstmal froh, dass alles soweit läuft, aber UDP ist für meine Zwecke definitiv eine Alternative. Ich hatte mich für HTTP entschieden, weil ich im Netz da die meisten Beispiele gefunden habe.
Nochmals vielen Dank an alle die mir hier wirklich sehr konstruktiv geholfen haben.

MfG
conputerpap

@Derfips, bei deinen Server_UDP-Sketch hagelt es nur Fehlermeldungen, mit denen ich nichts so richtig anfangen kann. Daraufhin hab ich die Arduino-IDE komplett deinstalliert, sämtliche Ordner und Dateien die bei der Deinstallation übrig geblieben sind gelöscht. Die IDE neuinstalliert und nur über den Boardverwalter die ESP-Module hinzugefügt, alles ist praktisch jungfräulig. Die Fehlermeldungen sind aber geblieben.

Arduino: 1.8.3 (Windows 10), Board: "NodeMCU 1.0 (ESP-12E Module), 80 MHz, 115200, 4M (3M SPIFFS)"

In file included from C:\Users\Andreas\Documents\Arduino\ESP_Server_UDP\ESP_Server_UDP.ino:1:0:

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:64:30: error: expected ')' before 'addr'

   ESP8266WebServer(IPAddress addr, int port = 80);

                              ^

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:88:3: error: 'WiFiClient' does not name a type

   WiFiClient client() { return _currentClient; }

   ^

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:135:22: error: 'WiFiClient' has not been declared

   bool _parseRequest(WiFiClient& client);

                      ^

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:138:19: error: 'WiFiClient' has not been declared

   bool _parseForm(WiFiClient& client, String boundary, uint32_t len);

                   ^

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:141:27: error: 'WiFiClient' has not been declared

   uint8_t _uploadReadByte(WiFiClient& client);

                           ^

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:151:3: error: 'WiFiServer' does not name a type

   WiFiServer  _server;

   ^

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:153:3: error: 'WiFiClient' does not name a type

   WiFiClient  _currentClient;

   ^

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h: In member function 'size_t ESP8266WebServer::streamFile(T&, const String&)':

C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WebServer\src/ESP8266WebServer.h:129:10: error: '_currentClient' was not declared in this scope

   return _currentClient.write(file, HTTP_DOWNLOAD_UNIT_SIZE);

          ^

C:\Users\Andreas\Documents\Arduino\ESP_Server_UDP\ESP_Server_UDP.ino: In function 'void setup()':

ESP_Server_UDP:36: error: 'WiFi' was not declared in this scope

   WiFi.begin(ssid, password);

   ^

ESP_Server_UDP:40: error: 'WL_CONNECTED' was not declared in this scope

   while (WiFi.status() != WL_CONNECTED) {

                           ^

Mehrere Bibliotheken wurden für "WiFiUdp.h" gefunden
 Benutzt: C:\Users\Andreas\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.2.0\libraries\ESP8266WiFi
 Nicht benutzt: D:\Programme\Arduino\libraries\WiFi
 Nicht benutzt: D:\Programme\Arduino\libraries\WiFi
 Nicht benutzt: D:\Programme\Arduino\libraries\WiFi
 Nicht benutzt: D:\Programme\Arduino\libraries\WiFi
exit status 1
'WiFi' was not declared in this scope

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Angemeckert wird die Zeile "WiFi.begin(ssid, password);

Derfips:
OK
habs geändert.

Gruß Fips

Wo denn? Der HTTP-Server ist noch drin.

Gruß Tommy

Welche ESP8266 - Lib hast Du installiert?

In Deinen Fehlermeldungen sind Zeilen, die sind nicht im Beispiel von "DerFips".

Gruß Tommy

esp8266 by ESP8266 Community

Version 2.2.0

Das klingt ok, obwohl die 2.3.0 aktuell ist. Das sollte es nicht sein.

Fehlermeldungen immer von oben anfangen zu bearbeiten.

Dort steht:

ESP8266WebServer(IPAddress addr, int port = 80);

Diese Zeile gibt es im Code von Fips nicht. Du hast also nicht seinen Sketch.

Gruß Tommy