Autor Thema: UDP Datagramme empfangen  (Gelesen 1829 mal)

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
UDP Datagramme empfangen
« am: 23 Januar 2019, 22:33:15 »
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
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline DS_Starter

  • Developer
  • Hero Member
  • ****
  • Beiträge: 4160
Antw:UDP Datagramme empfangen
« Antwort #1 am: 23 Januar 2019, 22:45:49 »
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 6.5 auf NUC6i5SYH mit FHEM auf Debian 9/64 Bit  (Stretch), DbLog/DbRep mit MariaDB auf Synology 415+
Maintainer: SSCam, DbLog/DbRep, Log2Syslog, SMAPortal, Watches
Kaffeekasse: https://www.paypal.me/HMaaz
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/DS_Starter

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #2 am: 23 Januar 2019, 23:02:55 »
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
« Letzte Änderung: 23 Januar 2019, 23:06:05 von herrmannj »
smartVisu mit fronthem, einiges an HM, RFXTRX, Oregon, CUL, Homeeasy, ganz viele LED + Diverse

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #3 am: 23 Januar 2019, 23:19:14 »
doorbird ?
smartVisu mit fronthem, einiges an HM, RFXTRX, Oregon, CUL, Homeeasy, ganz viele LED + Diverse

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19289
Antw:UDP Datagramme empfangen
« Antwort #4 am: 24 Januar 2019, 07:09:53 »
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 
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
Antw:UDP Datagramme empfangen
« Antwort #5 am: 24 Januar 2019, 11:10:54 »
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
Antw:UDP Datagramme empfangen
« Antwort #6 am: 25 Januar 2019, 21:05:51 »
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
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19289
Antw:UDP Datagramme empfangen
« Antwort #7 am: 25 Januar 2019, 21:09:19 »
select arbeitet auf filedescriptoren nicht auf filehandles.

d.h. du brauchst noch ein $hash->{FD}    = $conn->fileno();
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
Antw:UDP Datagramme empfangen
« Antwort #8 am: 26 Januar 2019, 00:09:58 »
Hallo justme

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
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19289
Antw:UDP Datagramme empfangen
« Antwort #9 am: 26 Januar 2019, 10:32:14 »
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');
   ... }
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #10 am: 26 Januar 2019, 10:48:48 »
Das geht auch ohne das cpan modul sehr einfach.
smartVisu mit fronthem, einiges an HM, RFXTRX, Oregon, CUL, Homeeasy, ganz viele LED + Diverse

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
Antw:UDP Datagramme empfangen
« Antwort #11 am: 26 Januar 2019, 19:44:28 »
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
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19289
Antw:UDP Datagramme empfangen
« Antwort #12 am: 26 Januar 2019, 19:45:41 »
du musst natürlich prüfen ob du auch tatsächlich ein socket bekommen hast.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
Antw:UDP Datagramme empfangen
« Antwort #13 am: 26 Januar 2019, 19:46:49 »
Hallo Herrmann

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
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
Antw:UDP Datagramme empfangen
« Antwort #14 am: 26 Januar 2019, 21:02:50 »
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
« Letzte Änderung: 26 Januar 2019, 21:04:21 von Sailor »
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

 

decade-submarginal