Hallo,
vielleicht eine verwirrende Überschrift? Aber es trifft das Thema.
Ich versuche mich gerade daran, ein paar SmartHome-Aktoren und -Sensoren mit dem ESP8266 zu basteln. Ich kann sie über ein Web-Interface und mit einem Raspberry Pi über Udp-Daten steuern. Mein Code ist wahrscheinlich nicht besonders gut, funktioniert aber für mich ausreichend. Ich arbeite mit den ESP8266WiFi-, WiFiUdp- und ESP8266WebServer-Bibliotheken.
Meine selbstgestellte Aufgabe:
Ich würde gerne einige "zentrale Funktionen" (zB. "alle Sensoren bitte melden" oder "alle Aktoren ausschalten") über einen Udp-Befehl an die Broadcast-IP auslösen. Aber halt nicht alle Befehle per Broadcast zulassen, die meisten Funktionen sollen nur bei "direkter" IP-Adressierung ausgeführt werden.
--> Wie kann ich herausfinden, an welche IP-Adresse die Pakete gesendet wurden?
Also zB. an 192.168.178.13 = direkte-IP oder an 192.168.178.255 = Broadcast-IP.
Gibts da eine Lösung? Nach welchem Stichwort muss ich suchen? Oder welche Library kann das? Ich habe schon einige Stunden auf der Suche danach verbraten - leider bisher erfolglos.
Ich versende das Paket mit dem Raspberry Pi an den ESP8266.
Entweder direkt an EINEN ESP, zB. an 192.168.178.13
ODER an die Broadcast-Adresse 192.168.178.255
Beide IP-Adressen erreichen ihr Ziel. Nun möchte ich beim Empfang auf dem ESP herausfinden, an welche Adresse das Paket gesendet wurde. VON und AN welchen Port krieg ich raus. VON welcher IP krieg ich raus.
-> Aber AN welche IP wurde das Paket ursprünglich gesendet? Pakete an beide Adressen werden von dem ESP8266 angenommen.
Mach das doch einfach von der Payload deines Päckchens abhängig :
Also wird Kommando xxx gesendet so kann das nur Broadcast sein, yyy kann nur direkt adressiert worden sein.
Da du beide Seiten programmierst weist du doch genau was wie gesendet wird !?
Oder soll das selbe Kommando mal als Broadcast und mal direkt gesendet werden und der Emfänger
dann jeweils anders drauf reagieren (wäre eine ziemlich merkwürdige Art).
Oder soll das selbe Kommando mal als Broadcast und mal direkt gesendet werden und der Emfänger
dann jeweils anders drauf reagieren (wäre eine ziemlich merkwürdige Art).
Im Prinzip genau das: Wenn das Kommando "Bitte alle mal Melden" per Broadcast kommt sollen alle Aktoren&Sensoren reagieren. Beim Kommando "Ausgang 1 Einschalten" darf ich aber nur einen Aktor ansprechen, also nicht (versehentlich) alle über den Broadcast. Natürlich hast Du Recht, da ich auch den Raspi programmiere sollte das nicht vorkommen. Sollte!
Danke an euch beide, hat mich viel weitergebracht!
Vielleicht kann mir zu den Befehlen -Wissen heisst wissen wo es steht!- noch jemand helfen: Gibt es eine Zusammenfassung der (wichtigsten) Bibliotheken und der Befehle darin?
Da ich in der Arduino-Umgebung (und auch beim Programmieren) recht unerfahren bin verwende ich oft "copy&paste", weitere Befehle suche ich mir dann in den Bibliotheken-Übersichten dazu. Bei den Arduino Standard-Libraries finde ich eine Übersicht der Standard-Bibliotheken mit den Befehlen.
Auf der Seite zu ESP8266WiFi/Udp oder auf Github fehlt eine solche Übersicht oft, bzw. sind nicht alle Befehle gelistet. (Genau der destinationIP() wird nur unter Udp -> Multicast erwähnt, steht aber in keiner Übersicht.)
Und was ich komplett vermisse sind Angaben der Variablentypen (zum Vergleichauf php.net: bool is_file ( string $filename ) ). Als python- und php-Rumprobierer stehe ich mit den Variablentypen eh auf Kriegsfuß, da habe ich noch viel nachzuholen!
:o :o :o :o :o
OKOK, ich hatte ja danach gefragt.
:o :o :o :o :o
Dank Dir Fips für die prompte Reaktion, jetzt hab ich vorerst mal genug zu tun
Das ist Lesestoff für ein paar harte Winterjahre - und die werden bei der Klimaerwärmung immer kürzer.
in den Beispielen wo der ESP ein Wemo simuliert um es dann mittels Alexa "einfach" ansprechen zu können, wird im Handshake auf eine UDP Broadcast reagiert. Vielleicht kannst du da was abkupfern.
mYPi:
Und was ich komplett vermisse sind Angaben der Variablentypen (zum Vergleichauf php.net: bool is_file ( string $filename ) ).
Jede Variable, jede Funktion und jeder Parameter hat einen Typ und der steht davor.
Jede ordentliche Lib hat eine Libname.h - Datei. Da stehen alle Funktionen drin, die von außen aufgerufen werden können mit allen Typen. Nur Lesen musst Du selbst. Im Zweifelsfall die zugehörige cpp-Datei.
Solange Du Dir nicht ein paar Grundlagen aneignest und nur probierst, wird das Verständnis nur extrem langsam wachsen.
Hallo nochmal,
ja in den Links von Dir und von Fips stehen die Variablentypen, deshalb find ich die ja so Klasse. Und die WiFIUdp.h ist auch gut kommentiert.
Bisher war ich oft bei Arduino, zB. LiquidCrystal unterwegs, die haben keine Typen drinstehen.
Mit den .h-Dateien werde ich mich noch befassen, da steht vieles drin - aber ohne Kommentare liest es sich für mich garnicht (wie in Adafruit_SSD1306).
Vor allem bleibt mir das Problem, daß ich 1.)zuerst mal ahnen muß in welcher Datei ich suche, und 2.)nach was ich suche. Das sind bei ESP8266WiFi immerhin 18 Dateien, ich hätte in der WiFi.h begonnen und dann planlos weitergesucht. "destination" klingt zwar logisch, jetzt wo ich es kenne, aber sogut ist mein Englisch nicht, daß ich von selbst auf den Begriff komme.
Wie gesagt, alles noch Neuland für mich und danke, daß Ihr mir unter die Arme greift. Beim aktuellen Problem habt ihr mir geholfen und für spätere Fragen habe ich auch schon Tipps erhalten, wie ich etwas finden kann. Das versuche ich mal autodidaktisch zu vertiefen.