zwischen UDP-Paketen unterscheiden

Hi,

Ich hätte da mal eine frage zu einem Projekt das ich starten möchte.

Es soll eine Klingel für die Firma eines Kollegen sein. Die Idee ist einen ESP8266 als Klingel zu benutzen und mindestens 3 (Tendenz zu mehr) als Empfänger. Dafür dachte ich mir das Ich dass mittels UDP mache.

Ich möchte dann Pro Empfänger einen Taster und 2 LEDs Rot und Grün. Rot dass man sieht es wurde geklingelt und Grün einer von dem Empfänger hat geantwortet bzw. der Taster wurde gedrückt und einer geht runter.

Ich habe dann 2 Pakete die ich senden muss

  1. Vom Sender: Es wurde geklingelt --> Schalte an allen Empfängern die Rote LED an
  2. Vom Empfänger der den Taster drückt an alle anderen Empfängern: ich gehe Runter --> schalte an allen Empfängern die Rote aus und grüne LED an für ca 30 Sek.

Jetzt muss ich ja bei den Empfängern zwischen den UDP-Paketen 'es wurde geklingelt' und 'ich gehe Runter' unterscheiden damit ich entweder die Rote oder Grüne LED anschalte. Wie stelle ich das an?

Danke schonmal :slight_smile:

Mfg

Indem Du passende Daten in Deine UDP-Pakete einträgst und diese Daten auswertest.
Schau Dir mal das UDP-Beispiel an.
Broadcast könnte auch ein gutes Stichwort sein.

Gruß Tommy

Jetzt muss ich ja bei den Empfängern zwischen den UDP-Paketen 'es wurde geklingelt' und 'ich gehe Runter' unterscheiden damit ich entweder die Rote oder Grüne LED anschalte. Wie stelle ich das an?

Du könntest prüfen, ob in dem Paket 'es wurde geklingelt' oder 'ich gehe Runter' drin steht!

z.B. mit strcmp()

Oder noch einfacher 1 für geklingelt und 2 für ich gehe :wink:

Gruß Tommy

Da doch sowieso alle die UDP bekommen sind es doch nur zwei Pakete

  1. alle Empfänger Rot und Klingeln.
  2. alle Empfänger Grün.

Der der runter geht muss ja auch auf Grün gesetzt werden. Die anderen brauchen ja nicht wissen wer geht sondern das jemand geht. Also beiden Paketen nur eine bestimmte Nummer (Zahlenwert) 0x11000011(195) und 10101010 (170) geben und ab dafür. Bei einem Byte hättest du noch 252 andere Befehle.
Jeder ist Server und Client nur wenn er senden soll. d.h. jemand Klingelt oder jemand bestätigt das runtergehen. Wenn du das Über Broadcast machst brauchst du keine Empfänger Adressen. Also Sender mit .255 in der Empfänger Adresse

Gruß
DerDani

Tommy56:
Broadcast könnte auch ein gutes Stichwort sein.

Würde ich dann nicht auch an alle anderen Geräte im Netzwerk das Paket senden. Kann das zu Problemen führen? Oder verstehe ich das falsch.

combie:
z.B. mit strcmp()

Müsste ich mich Mal einlesen.

volvodani:
Der der runter geht muss ja auch auf Grün gesetzt werden. Die anderen brauchen ja nicht wissen wer geht sondern das jemand geht. Also beiden Paketen nur eine bestimmte Nummer (Zahlenwert) 0x11000011(195) und 10101010 (170) geben und ab dafür. Bei einem Byte hättest du noch 252 andere Befehle.
Jeder ist Server und Client nur wenn er senden soll. d.h. jemand Klingelt oder jemand bestätigt das runtergehen. Wenn du das Über Broadcast machst brauchst du keine Empfänger Adressen. Also Sender mit .255 in der Empfänger Adresse

Tut mir leid das hab ich nicht ganz verstanden.
Ich soll zwei Zahlenwerte senden für das jeweilige Paket senden okay aber was meinst du mit jeder ist Server und Client wenn er es soll. Die Klingel ist zu keinem Zeitpunkt Client.

Mfg

Du hast Client/Server nicht verstanden.

Die Klingel ist nur Client, weil sie die anderen ESP (Server) anspricht. Der der auf grün drückt ist für diesen Fall zusätzlich Client.

Server wartet, das einer was von ihm will, Client will was. Wie beim Anwalt (Server).

Nur die Server in Deinem Netz, die UDP Broadcast lesen.

Gruß Tommy

Hi

Naja - man könnte den Klingel-Knopf auch eine Bestätigung abspielen lassen - so viel Mehr sollte der Aufwand nicht sein und der DHL-Bote bleibt vll. doch noch die Sekunde stehen.
Dann sind Alle sowohl Server wie Client.

MfG

Klingelprofi:
Würde ich dann nicht auch an alle anderen Geräte im Netzwerk das Paket senden. Kann das zu Problemen führen?

Ja du würdest an alle Geräte in dem seleben Subnetz 255.255.255.0 das Paket schicken. Aber nur die Geräte die Damit was Anfangen können also deine “Empfänger” werten diese aus. Ein PC bekommt ein Paket da steht ein Zahlenwert drin. Da aber dort kein UDP Server läuft der das erwartet ignoriert er das. Wenn es vorher nicht schon durch den Rechner/Firewall geblockt wird. Also kein Problem.

Du hast bei die

  • Die Klingelstelle nur ein reiner Client der Sendet via Broadcast z.B. 192.168.178.255 (sofern sie nicht auf irgendwas reagieren sollte) auf Port 54321
  • Die Klingelempfänger sind Server und warten auf Daten. Kommt jetzt etwas über Port:54321 was an und entspricht dem Zahlenwert/Inhalt der Aktion Klingeln so klingen die und/oder machen etwas (das was du halt programmierst). Alle Blinken solange rot bis der Zahlenwert/Inhalt kommt um die grüne Lampe an zu machen. Wird jetzt auf einem der Klingeln betätigt “ich gehe runter” so wird die eine Stelle zum Client und Sendet via Broadcast den Wert für “ich gehe runter” und macht bei den anderen auch die Grüne LED an. Ist das “ich gehe runter” Paket abfgestetz wird er wieder zum Server und wartet.

So sollte es funktionieren. Ob du dann nach dem “ich gehe runter” Paket dann irgenwas machst wie nach einer Zeit die grüne LED aus ist dir Überlassen.
Man kann jetzt noch so etwas wie rin Heartbeat mit Timeout machen den die Klingel sendet z.B. alle 3s. Sollte länger als 3s beim Epfänger nichts ankommen könnte man dies auch signalisieren wie schnell Blinken oder im Wechsel oder beide LED zusammen.
So wäre das in meiner Vorstellung.
Ist auch denke ich nicht allzu großer Aufwand auch für Anfänger stemmbar zusammen mit ein paar interessanten Beispielen Tut aus dem Netz

Gruß
DerDani