Forum: PC-Programmierung UDP-Server-Broadcast


von Marco K. (fuerst-rene)


Lesenswert?

Moin zusammen,

Ich habe einen Raspberry 4 und möchte gerne per Broadcast Daten vom ADC 
(Temperatur) versenden via WLAN.
Egal welche infos GOOGLE gibt, ich lande immer beim Multicast und es 
funktioniert nicht wie gewollt.
In Python scheint es generell nicht zu funktionieren.
Habt ihr Quellen für einen UDP-Broadcast-Server der immer sendet auch 
wenn mal kein Empänger da ist?

Viele Grüße aus dem Schwarzwald

von (prx) A. K. (prx)


Lesenswert?

UDP Broadcasts sind so ungefähr die einfachste Form der Kommunikation, 
die überhaupt per TCP/IP möglich ist. An 255.255.255.255 rausblasen und 
fertig.

: Bearbeitet durch User
von Toby R. (toby_r)


Lesenswert?

Welches Protokoll benutzt du denn für die Übertragung? Für Sensordaten 
bietet sich ja MQTT an, welches die Daten für jeden Subscriber sicher 
überträgt. Das scheint mir der sicherere Weg zu sein, auch, wenn kein 
Sub verfügbar ist.

von UDP Behr (Gast)


Lesenswert?

Marco K. schrieb:
> der immer sendet auch wenn mal kein Empänger da ist

Charakteristisch für UDP gegenüber anderen Protokollen (z.B.
TCP) ist dass es keinen Verbindungsaufbau gibt. D.h. um ein
Paket zu senden ist es nicht relevant ob der angesprochene
Empfänger wirklich präsent ist oder nicht.

von Marco K. (fuerst-rene)


Lesenswert?

Vom Prinzip her habe ich das benutzt:
https://www.elektronik-kompendium.de/sites/raspberry-pi/2002171.htm
Damit läuft der Sendemodus als AP
Und das habe ich als Grundlage zum Senden verwendet.
https://wiki.python.org/moin/UdpCommunication

Wie gesagt ohne Empfänger, der halt ab und zu mal nicht da ist, Bricht 
er ab.

von Marco K. (fuerst-rene)


Lesenswert?

UDP Behr schrieb:
> Charakteristisch für UDP gegenüber anderen Protokollen (z.B.
> TCP) ist dass es keinen Verbindungsaufbau gibt. D.h. um ein
> Paket zu senden ist es nicht relevant ob der angesprochene
> Empfänger wirklich präsent ist oder nicht.

Das habe ich verstanden, aber scheinbar mein das OS es muss Multicast 
verwenden, daher ist da schluss mit senden.

von (prx) A. K. (prx)


Lesenswert?

Marco K. schrieb:
> Wie gesagt ohne Empfänger, der halt ab und zu mal nicht da ist, Bricht
> er ab.

Reinem UDP ist es schnurzpiepegal, ob jemand zuhört. Das kann erst eine 
Rolle spielen, wenn man auf UDP ein weiteres Protokoll draufsattelt, das 
unbedingt Zuhörer braucht.

von Marco K. (fuerst-rene)


Lesenswert?

PS mit dem ESP32 und Arduino funktioniert das Super

Beitrag #6818786 wurde vom Autor gelöscht.
von UDP Behr (Gast)


Lesenswert?

Marco K. schrieb:
> Das habe ich verstanden, aber scheinbar mein das OS es muss Multicast
> verwenden, daher ist da schluss mit senden.

Nein, das Abbrechen ist Bestandteil der "User"-Implementierung,
also ein (oder mehrere) Level über UDP. Und wenn es so ist
kann "man" ja in diese Implementierung eingreifen. Was beim
UDP selbst sich etwas schwieriger gestalten würde ....

von UDP Behr (Gast)


Lesenswert?

Marco K. schrieb:
> aber scheinbar mein das OS es muss Multicast
> verwenden, daher ist da schluss mit senden.

Broadcast oder Multicast ist ja per se schon "ziel-unabhängig",
das heisst man schickt eine Nachricht hinaus ohne zu wissen
ob es einer oder mehrere Teilnehmer hören und darauf reagieren.
Daher darf man auch nicht erwarten dass überhaupt ein einziger
antwortet und muss das in seiner eigenen Implementierung
berücksichtigen.

von Sascha W. (sascha-w)


Lesenswert?

Marco K. schrieb:
> Moin zusammen,
>
> Ich habe einen Raspberry 4 und möchte gerne per Broadcast Daten vom ADC
> (Temperatur) versenden via WLAN.
> In Python scheint es generell nicht zu funktionieren.
doch so:
1
s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
3
s.sendto(data,("<broadcast>", port))
Sascha

von Marco K. (fuerst-rene)


Lesenswert?

Dnke Sascha, das probiere ich gleich aus!

von Rolf M. (rmagnus)


Lesenswert?

(prx) A. K. schrieb:
> UDP Broadcasts sind so ungefähr die einfachste Form der Kommunikation,
> die überhaupt per TCP/IP möglich ist.

UDP-Broadcasts laufen nicht über TCP/IP, sondern eben über UDP/IP.

Marco K. schrieb:
> https://wiki.python.org/moin/UdpCommunication

Hast du die IP auf die Broadcast-Adresse deines Netztes geändert?
Zeig doch mal, welchen Code du genau ausgeführt hast und wie deine 
Netzwerkkonfiguration aussieht.

von (prx) A. K. (prx)


Lesenswert?

Rolf M. schrieb:
> UDP-Broadcasts laufen nicht über TCP/IP, sondern eben über UDP/IP.

Danke für die Aufklärung, aber die Protokollfamilie heisst nun einmal 
TCP/IP, auch wenn weder UDP noch ICMP irgendwas mit TCP zu tun haben.

https://de.wikipedia.org/wiki/Transmission_Control_Protocol/Internet_Protocol

von Rolf M. (rmagnus)


Lesenswert?

(prx) A. K. schrieb:
> Danke für die Aufklärung, aber die Protokollfamilie heisst nun einmal
> TCP/IP, auch wenn weder UDP noch ICMP irgendwas mit TCP zu tun haben.

Ok, also wieder sowas, das einfach falsch in den allgemeinen 
Sprachgebrauch übergegangen ist. War mir nicht bewusst. Ich werde mich 
aber trotzdem weigern, es "TCP/IP" zu nennen, wenn TCP dabei überhaupt 
nicht vorkommt.

von (prx) A. K. (prx)


Lesenswert?

Rolf M. schrieb:
> Ok, also wieder sowas, das einfach falsch in den allgemeinen
> Sprachgebrauch übergegangen ist. War mir nicht bewusst. Ich werde mich
> aber trotzdem weigern, es "TCP/IP" zu nennen, wenn TCP dabei überhaupt
> nicht vorkommt.

Präziser ist Internet Protocol Suite, aber da erntest du vielfach nur 
fragende Gesichter.

von Einer (Gast)


Lesenswert?

Achtung, Falle:

Viele/einige WLAN-Accespoints/-Router erlauben per Default keine direkte 
Kommunikation (per Broadcast) unter den Funk-Teilnehmern. D.h. die 
Clients sind voneinander isoliert.

Kann man natürlich umschalten.

von Marco K. (fuerst-rene)


Lesenswert?

Dank Sascha habe ich durch Google die Lösung gefunden:
https://wiki.pythonde.pysv.org/UDP-Broadcasts
Zitat:
   1 import socket
   2
   3 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 
socket.IPPROTO_UDP)
   4 s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
   5 s.settimeout(5)
   6
   7 s.sendto("hello", ("<broadcast>", 5555))
   8 try:
   9     print "Response: %s" % s.recv(1024)
  10 except socket.timeout:
  11     print "No server found"
  12
  13 s.close()
Wobei "hello" durch alles ersetzt werden kann.

Vielen Dank euch allen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.