ESP32 - UDP Broadcast - TCP

Hallo,

ich habe zwei ESP32 und möchte das diese miteinander über UDP und TCP kommunizieren.

Ziel der Aktion:
Beide Geräte befinden sich im WLAN, haben aber keine Information zu dem jeweilig anderem Gerät.
Gerät A soll per UDP Broadcast eine Kennung verschicken z.B Test. Gerät B liest die UDP Nacrhrichtf und prüft auf die richtige Kennung. Ist die Kennung gleich wird die IP-Adresse von A gespeichert. Nun hat B die IP von A und kann zu A eine TCP Verbindung aufbauen, um seine IP Adresse mitzuteilen. Am Ende hat A die IP-Adresse von B, B die von A erhalten.

Im Setup-Teil findet die Verbindung zum WLAN statt über WIFI.h.
Als UDP-Dienst nehme ich AsyncUDP.h
Implementierung von A:

#include "WiFi.h"
#include "AsyncUDP.h"
AsyncUDP udp;

void setup()
{
  //Wifi Connection
}

void loop()
{
  delay(1000);
  udp.broadcastTo("Test", 2255);
}

Es wird die Kennung Test an den Port 2255 gesendet. Mit einem Python Script prüfe ich das.
Das klappt. Nur wird als Port (49153) ein anderer angezeigt.

Implementierung von B:

#include "WiFi.h"
#include "AsyncUDP.h"
AsyncUDP udp;

void setup()
{
  //Wifi Connection
}

void loop()
{
  Serial.println(udp.listen(2255)); // True
  if(udp.listen(2255)) {
      udp.onPacket([](AsyncUDPPacket packet) {

        Serial.println("Remote: " + packet.remoteIP());
        Serial.write(packet.data(), packet.length());
       });
    }
}

Obwohl der Port abgehört wird bekomme ich keine Daten. Selbst wenn ich den Port auf 49153 setze. Nicht mal einen Fehler. (A sendet broadcast in der Zeit)
Habe mich an den Beispielen von Async.hUDP orientiert.

Jemand ne Idee warem es nicht funktionert?

Und als nächstes käme TCP dran.
Hat da jemand Tipps oder Empfehlung die man mir geben kann? Damit das ganze besser funktioniert als bei UDP?

Danke.
mfg werdas34

was passiert wenn du die Beispiele EXAKT nachbaust? Geht es dann?

Output von Server File:

18:46:46.347 -> UDP Packet Type: Broadcast, From: 192.168.178.123:49153, To: 255.255.255.255:1234, Length: 12, Data: Anyone here?
18:46:48.305 -> UDP Packet Type: Broadcast, From: 192.168.178.123:49153, To: 255.255.255.255:1234, Length: 12, Data: Anyone here?
18:46:49.305 -> UDP Packet Type: Broadcast, From: 192.168.178.123:49153, To: 255.255.255.255:1234, Length: 12, Data: Anyone here?
18:46:51.384 -> UDP Packet Type: Broadcast, From: 192.168.178.123:49153, To: 255.255.255.255:1234, Length: 12, Data: Anyone here?

Output von Client File:

18:48:29.144 -> ets Jun  8 2016 00:22:57
18:48:29.144 -> 
18:48:29.144 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
18:48:29.144 -> configsip: 0, SPIWP:0xee
18:48:29.144 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
18:48:29.144 -> mode:DIO, clock div:1
18:48:29.144 -> load:0x3fff0018,len:4
18:48:29.144 -> load:0x3fff001c,len:1216
18:48:29.144 -> ho 0 tail 12 room 4
18:48:29.144 -> load:0x40078000,len:9720
18:48:29.144 -> ho 0 tail 12 room 4
18:48:29.144 -> load:0x40080400,len:6352
18:48:29.144 -> entry 0x400806b8
18:48:31.114 -> UDP connected

Ok. Es scheint als könne die Bib UDP versenden aber nicht lesen. Deshalb funktioniert das Python Script aber nicht das Lesen über den ESP32...

Gibt es ne andere funktioniernde Bib/Möglichkeit mit dem ESP32 UDP Broadcast zu versenden und zu lesen?

ist doch gut.
Der Server hat die Message vom Client empfangen. Jetzt machst eine Antwort dann kennen sich die zwei.

Der Server versendet "Anyone here?" Er empfängt gar nichts.

Oder was meinst du konkret?

Die Beispiele sind ... eigenartig - aber vieleicht verstehe ich sie noch nicht ganz.

Egal: bei mir klappt es:

Am Server (249):

UDP Packet Type: Unicast, From: 172.18.67.249:1234, To: 172.18.67.212:49153, Length: 20, Data: Got 20 bytes of data
UDP Packet Type: Unicast, From: 172.18.67.249:1234, To: 172.18.67.212:49153, Length: 20, Data: Got 20 bytes of data
UDP Packet Type: Unicast, From: 0.0.0.0:1234, To: 0.0.0.0:49153, Length: 20, Data: Got 20 bytes of data

Am "Client 212" mit ausgebesserter Ziel IP 249:

UDP Packet Type: Unicast, From: 172.18.67.212:49153, To: 172.18.67.249:1234, Length: 20, Data: Got 20 bytes of data
UDP Packet Type: Unicast, From: 172.18.67.212:49153, To: 172.18.67.249:1234, Length: 20, Data: Got 20 bytes of data
UDP Packet Type: Broadcast, From: 172.18.67.212:49153, To: 255.255.255.255:1234, Length: 12, Data: Anyone here?

die sekündlichen Broadcast Meldungen gehen halt bei den ganzen Unicast in der Menge unter, aber da sind sie.

Was ich auf alle Fälle tun würde: in beiden Sketche im Setup die eigene IP, damit es da überhaupt keine Zweifel gibt wer welche IP hat.

  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

und im Client Sketch die Ziel-IP des Server. Ich weis dass ist nicht das was du aktuell willst, aber nur mal Testweise dass du auf beiden Sketche die Broadcasts vice versa siehst.

Gibts irgend einen speziellen Grund, warum du den asyncUDP nimmst?

Schau es dir auch mal im Wireshark an, imho sieht man da sauber die sekündlichen Broadcasts (von beiden Seiten!).

Das ist sehr interesannt. Warum funktioniert es bei dir und bei mir nicht? Nicht mal Unicast habe ich erhalten?
Bei mir hat der Client nach "UDP connected" einfach minutenlang gar nichts ausgegeben. Kein Unicast, Broadcast, ect. Nur blankes.
Die lokalen IPs werden angezeigt, habs nur eben den Code nicht dazu veröffentlicht.
Ich werde das Beispiel nochmal probieren und im CLient die IP vom Server packen.

Zu Async.h:
Es gibt keinen speziellen Grund. War das erste was ich unter "esp32 udp broadcast" gefunden habe und vielversprechned aussah.
Wenn du da was besseres weiß, dann immer gerne. Aber im moment reicht es mir wenn das was ich brauche funktioniert.

Bei mir hat der Client nach "UDP connected" einfach

hast du im Client die Server IP gesetzt?

Noch nicht. Bin gerade dabei das zu testen.
Hab da am Anfang nicht dran gedacht, weil Broadcast und da war kein Kommentar.

Habe momentan ein anderes Problem. Grad Wireshark installiert. Nun wenn ich den seriellen Monitor am Arduino öffne bekomme ich ein nach links gedrehtes Fragezeichen "⸮". Weiß nicht warum. Ging ja davor noch.

Deinstalliere gerade Wireshark.

Baudraten stimmen nicht überein?

Gruß Tommy

Doch sie stimmen überein. Habe mehrfach das Skript hochgeladen. Nun ein anderes hochgeladen und wieder dieses Symbol.
Reboote mal das System. Mal schauen

Edit:
Habe aus Versehen, die CPU Frequenz auf XTAL gestellt.

Was dann letztendlich auch auf nicht passende Baudraten hinaus läuft. :wink:

Gruß Tommy

Ja ok. Kann man auch so sehen.

Nach mehrmüntiger Suche habe ich nun im seriellen Monitor eine Broadcast Meldung gefunden.
Scheint zu klappen.
Bin grad dabei Wireshark entsprechend einzurichten.

Und dann wäre die Frage, wie bekomme ich meinen Use Case hin?
Habe im ersten Beitrag den Code geschrieben.

ich häng momentan noch an einem anderen ESP32 Vorhaben, daher geht's nur so nebenbei.

Was dein Usecase nicht beschreibst wer schlussendlich an wen Payload übertragen soll, A zu B oder B zu A.

So?

A --> UDP --> alle ... Broadcast ins Netz
B --> TCP od UDP (?) --> A ... hab dich gesehen, ich bin B und du weist nun meine IP
A --> TCP --> B ... payload