UDP Datagramme empfangen

Begonnen von Sailor, 23 Januar 2019, 22:33:15

Vorheriges Thema - Nächstes Thema

Sailor

Ein herzerfrischendes "Moin" vom hinternDeich vorweg

Ich versuche mich gerade in dem Thema "UDP" in Verbindung mit fhem einzulesen.

Meine Fragen: Kennt Ihr ein fhem-Modul, welches das Abwarten und Auslesen der Datagramme umgesetzt hat, ohne das fhem dadurch blokiert?
Wenn ja, welches Modul macht das, damit ich mich da einlesen, lernen und (kopieren) kann?

Die betreffende unit für das ich gerade ein Modul schreibe sendet von einer bekannten IP-Adresse multiple Boroadcasts an die Ports 6524 und 35344.
Wie kann ich diese in mein Modul bekommen ohne fhem zu blokieren?

Danke für Eure Hilfe!

Gruss
    Sailor
******************************
Man wird immer besser...

DS_Starter

Moin Sailor,

mein Log2Syslog macht so etwas. Man kann beliebige UDP Ports angeben (Standard ist syslog) und im RAW-Modus kannst du auch beliebige Datagramme empfangen und auswerten. Sonst wird nach RFC IETF bzw. BSD geparst.

Grüße
Heiko
ESXi@NUC+Debian+MariaDB, PV: SMA, Victron MPII+Pylontech+CerboGX
Maintainer: SSCam, SSChatBot, SSCal, SSFile, DbLog/DbRep, Log2Syslog, SolarForecast,Watches, Dashboard, PylonLowVoltage
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

herrmannj

#2
Moin Moin,

https://github.com/herrmannj/AirQuality/blob/master/FHEM/00_SLink.pm

Ich arbeite zwar mit multicast / die Technik des "nicht blockierend" kannst Du genauso für broadcast verwenden. (#135. #128 und #142 sind multicast spezifisch)
SLink_CreateService installiert den receiver.

vg
Joerg

herrmannj


justme1968

schau dir an wie selectlist und ReadfFn funktionieren.

im harmony modul findest du ein beispiel für udp broadcast senden und unicast empfangen.

in fakeRoku gibt es multicast empfang und unicasts antwort

im plex modul findest du gleichzeitiges senden und empfangen von multicast, broadcast und unicast 
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Sailor

******************************
Man wird immer besser...

Sailor

OK, Danke für eure Hinweise auf Module, aber bei der Masse sehe ich den Wald vor lauter Bäumen nicht.

Macht mir doch mal den Erklärbär für Dummies wie mich.

a) Mit Wireshark sehe ich in meinem Netzwerk in regelmäßigen Abständen folgende Message:
145 51.221107 192.168.178.21 239.255.255.250 UDP 1265 3702 → 3702 Len=4183

b) Meine DoorBird_Init habe ich um folgenden Code bereichert
$hash->{ReadFn}          = "DoorBird_Read";

c) Meine DoorBird_Define habe ich um folgenden Code bereichert:

my $conn = IO::Socket::INET->new(Proto=>"udp",LocalPort=>3702);
$hash->{CD} = $conn;
$selectlist{$name} = $hash;


d) Meine neue Funktion DoorBird_Read sieht wie folgt aus:

sub DoorBird_Read($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $buf;
my $data;

$hash->{CD}->recv($buf, 16);
$data = unpack('H*', $buf);

### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_FW_detailFn - UDP Client said            : " . $data;

Dispatch($hash, $buf);
}


Warum wird mein Log-File also nicht mit UDP-Datagrammen zugemüllt?
Ich bin mir sicher, dass ist wieder so eine Trivialität die ich übersehe.

Könnt Ihr mir helfen?

Gruss
    Sailor
******************************
Man wird immer besser...

justme1968

select arbeitet auf filedescriptoren nicht auf filehandles.

d.h. du brauchst noch ein $hash->{FD}    = $conn->fileno();
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Sailor

Hallo justme

Zitat von: justme1968 am 25 Januar 2019, 21:09:19
select arbeitet auf filedescriptoren nicht auf filehandles.
d.h. du brauchst noch ein $hash->{FD}    = $conn->fileno();

OK, habe ich in die Definition mit aufgenommen.


my $conn = IO::Socket::INET->new(Proto=>"udp",LocalPort=>3702);
$hash->{FD}    = $conn->fileno();
$hash->{CD} = $conn;
$selectlist{$name} = $hash;


Aber leider immer noch Funkstille.

Wie kann ich mich Stück für Stück an den Fehler rantatsten?

Meine erster Schritt wäre, zu überprüfen, ob die UDP Pakete auch wirklich am RasPi ankommen und nicht nur bei meinem Laptop mit WireShark.
Aber eigentlich sind beide am gleichen Switch verkabelt...

Gruss
    Sailor
******************************
Man wird immer besser...

justme1968

ja. schritt für schritt ist gut. direkt auf dem raspberry schauen und auch selber senden mit nc hilft beim testen.

ansonsten sehe ich gerade das es um die adresse 239.255.255.250 geht. das ist eine mulitcast adresse. d.h. du musst das listen socket etwa so auf machen: $hash->{reusePort} = AttrVal($name, 'reusePort', defined(&SO_REUSEPORT)?1:0)?1:0;
if( my $socket = IO::Socket::Multicast->new(Proto=>'udp', LocalPort=>3702, ReuseAddr=>1, ReusePort=>$hash->{reusePort} ) ) {
  $socket->mcast_add('239.255.255.250');
   ... }
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

herrmannj

Das geht auch ohne das cpan modul sehr einfach.

Sailor

Zitat von: justme1968 am 25 Januar 2019, 21:09:19
select arbeitet auf filedescriptoren nicht auf filehandles.
d.h. du brauchst noch ein $hash->{FD}    = $conn->fileno();

Dann bekomme ich aber nach einer Neu-Definition des device einen fhem - Absturz mit dem Logfile - Eintrag
Can't call method "fileno" on an undefined value at ./FHEM/73_DoorBird.pm line 176.
:(

Ein Neustart funktioniert, aber wenn man dann das Device wieder neu definiert... Aus die Maus.

Gruss
    Sailor
******************************
Man wird immer besser...

justme1968

du musst natürlich prüfen ob du auch tatsächlich ein socket bekommen hast.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Sailor

Hallo Herrmann

Zitat von: herrmannj am 26 Januar 2019, 10:48:48
Das geht auch ohne das cpan modul sehr einfach.

Immer her mit den guten Tipps... Ich bin ganz Hörgerät! ;)
Habe es immer noch nicht am Laufen.

Gruss
    Sailor
******************************
Man wird immer besser...

Sailor

#14
So,

habe mal das Datagram von einem Besitzer bekommen:

Internet Protocol Version 4, Src: 192.168.xx.xx, Dst: 255.255.255.255
User Datagram Protocol, Src Port: 3074, Dst Port: 35344


bzw.


Internet Protocol Version 4, Src: 192.168.xx.xx, Dst: 255.255.255.255
User Datagram Protocol, Src Port: 3074, Dst Port: 6524


Könnt Ihr als Experten damit was anfangen?

Gruss
    Sailor
******************************
Man wird immer besser...