Arduino ESP8266 LED per UDP

Hallo ich habe ein problem nämlich ich möchte eine led per UDP steuern und ich habe auch ein code aber wenn ich per udp mein befehl schicke passiert nichts
Der behfehl sieht volgendermaßen aus:

echo "0" > /dev/udp/192.168.178.12/4210

und der der code für den ESP sieht so aus:

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


const char* ssid = "****";
const char* password = "*****";

WiFiUDP Udp;
unsigned int localUdpPort = 4210;  // local port to listen on
char incomingPacket[255];  // buffer for incoming packets
char  replyPacket[] = "Hi there! Got the message :-)";  // a reply string to send back
int Packet = 100;


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

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

  Udp.begin(localUdpPort);
  Serial.printf("Now listening at IP %s, UDP port %d\n", WiFi.localIP().toString().c_str(), localUdpPort);
  pinMode(D0, OUTPUT);
  digitalWrite(D0, HIGH);
}


void loop()
{
  int packetSize = Udp.parsePacket();
  if (packetSize)
  {
    // receive incoming UDP packets
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, Udp.remoteIP().toString().c_str(), Udp.remotePort());
      }
    
    int len = Udp.read(incomingPacket, 255);
    if (len > 0)
    {
      incomingPacket[len] = 0;
    }

    if (incomingPacket[255] == 1){
      digitalWrite(D0, LOW);
      Serial.printf("UDP packet contents: %s\n", incomingPacket);
      }
    if(incomingPacket[255] == 0){
      digitalWrite(D0, HIGH);
      
    
    Serial.printf("UDP packet contents: %s\n", incomingPacket);
    Serial.print(Packet);
    

    // send back a reply, to the IP address and port we got the packet from
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(replyPacket);
    Udp.endPacket();
  }
}/code]

und die befehle kommen ja an die werden mir seriel auch ausgegeben.

Vielendank für eure Hilfe :)

if (incomingPacket[255] == 1){

Du versuchst Char mit Integer zu vergleichen.

Gruß Fips

Dein Paket ist zwei Zeichen lang, die '0' und '\0'.

Warum Du dann das 256.Zeichen mit 1 vergleichst, ist unklar.

Gruß Tommy

wie kann ich den ein char mit ein int vergelichen ?

ProgNiklas:
wie kann ich den ein char mit ein int vergelichen ?

zB.:

int Schaltzustand = atoi(incomingPacket);
if (Schaltzustand == 1) {

Gruß Fips

    char incomingPacket[255];  // buffer for incoming packets

...
   int len = Udp.read(incomingPacket, 255);
   if (len > 0)
   {
     incomingPacket[len] = 0;
   }

if (incomingPacket[255] == 1){
      ....

Dein read liest bis zu 255 Zeichen (aber vermutlich weniger) und liefert dir die aktuelle Länge zurück.
Das verwendest du, um die empfangenen Zeichen in einen Text mit Endekennung zu wandeln.

Soweit so schön.
incomingPacket[255] gibt es übrigens nicht, das ist in Wirklichkeit eine andere Variable. Du greifst ausserhalb des definierten Bereichs ( 0 .. 254 )

Falls UDP genug Daten liefert ( 255 ), schreibst du die Endekennung an die falsche Stelle.
Wasif (incomingPacket[255] == 1)liefert, ist völlig ungewiss.

@Fips: Natürlich kann man eincharmit 1 vergleichen. Ob man es besser mit dem Buchstaben '1' vergleichen sollte, ist natürlich eine andere Frage.

Wenn du einen Text aus mehreren Buchstaben, wie z.B. "123" mit der Zahl 123 vergleichen willst, ist die Funktion atoi evtl. sinnvoll. Wenn du einen einzelnen Buchstaben vergleichen willst, ist
if (incomingByte[0] == '1' ) der Vergleich deiner Wahl.

Danke es geht aber wenn ich jetzt eh dabei bin wie kann ich das machen das ich z.b. an schreibe und es dann An geht weil ich ja An nicht in einen int schreiben kann

Du kannst "An" und "Aus" mit strcmp vergleichen (Zeichenketten in C).
Du kannst natürlich auch 0 für aus und 1 für an übertragen.

Vor allem musst Du Dir vorher Gedanken machen, wie Deine Übertragung aussehen soll, damit Du weißt was an welcher Stelle erwartet werden kann.
Das mennt man dann ein Übertragungsprotokoll entwerfen.

Gruß Tommy

Ja das alles ist jetzt erstaml nur test weiße um ein Protukoll mache ich mir gedenken wenn ich weiß wie es später sein soll bzw in welchen dimensionen jetzt ist das erstmal nur um zu wißen wie das im groben überhaupt geht deshalp danke an alle die mir eine antwort gegeben haben

michael_x:
@Fips: Natürlich kann man eincharmit 1 vergleichen. Ob man es besser mit dem Buchstaben '1' vergleichen sollte, ist natürlich eine andere Frage.

Es will mir gerade nicht gelingen einen char string mit 1 zu vergleichen.

char zahl[9] = "1";
if (zahl[0] == '1'){
Serial.println("geht");
}

char zahl[9] = "1";
if (zahl[0] == 1){
Serial.println("geht nicht");
}

Kannst du mir das bitte zeigen, oder habe ich dich falsch verstanden?

Gruß Fips

char zahl[9] = "1";
 if (!strcmp(zahl,"1"){
   Serial.println("gleich");
 }
else {
   Serial.println("ungleich");
}

Oder hast Du etwas anderes gemeint?

Gruß Tommy

Tommy56:
Oder hast Du etwas anderes gemeint?

Gruß Tommy

ich meinte es so wie vom TO geschrieben.
if (incomingPacket[255] == 1){

michael_x schrieb:

"Natürlich kann man ein char mit 1 vergleichen."

Das es mit "1" geht ist mir klar.

Gruß Fips

Etwas hatte es mich auch gewundert.

Michael_x hat aber auch nicht geschrieben, dass da Gleichheit als Ergebnis raus kommt. Nur, dass man vergleichen kann.

Gruß Tommy

Das es mit "1" geht ist mir klar.

Nur mal zur Klarstellung "1" , '1' und 1 sind drei verschiedene Sachen

char test[] = "1"; // das sind zwei char: ein '1' und ein Endezeichen  (0)
if (test[0] == '1') Serial.println("klar");
if (test[0] == 49) Serial.println(" so so ! ( '0' ist 48 oder 0x30 , 'A' ist 65 oder 0x41 ) "); 

if (test[0] == ('0' + 1) ) Serial.println(" Mit char kann man auch rechnen! "); 

// if (test[0] != "1") {} // Das meckert der Compiler zurecht an. Leider nur als Warnung

warning: comparison with string literal results in unspecified behaviour [-Waddress]

michael_x:
Nur mal zur Klarstellung "1" , '1' und 1 sind drei verschiedene Sachen

char test[] = "1"; // das sind zwei char: ein '1' und ein Endezeichen (0)

Das ist mir bekannt.

char zahl[9] = "1";
 if (zahl[0] == 49){
   Serial.println("geht");
 }

ASCII

Jetzt wo du es schreibst erninnere ich mich, es schon mal gelesen zu haben.

Gruß und Danke für die Auffrischung!