Autor Thema: UDP Datagramme empfangen  (Gelesen 1831 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.

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #15 am: 26 Januar 2019, 21:46:10 »
klar:)

Aber das ist eine andere als oben ?  Brauchst Du jetzt Multicast oder Broadcast ? https://aseith.com/display/KB/Unterschiede+zwischen+Unicast%2C+Broadcast%2C+Multicast+und+Anycast
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 #16 am: 27 Januar 2019, 19:46:59 »
Hallo Hermann
klar:)

Mein letzter Post hat den richtigen Auszug von wireshark von genau dem Gerät, was ich in dem Modul versuche abzuhören.

Für mich gibt es nur zwei Möglichkeiten
a) entweder lese ich mich jetzt ganz langwierig in das Thema UDP bzw Multicast datagramme ein
oder
b) ich hoffe auf einen Experten in dieser Runde, der mir die entsprechenden Code Zeilen korrigiert.

Wie gesagt, ich habe von diesem Thema 0 Schimmer.

Danke dir!

Gruss
   Sailor
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21694
Antw:UDP Datagramme empfangen
« Antwort #17 am: 28 Januar 2019, 08:04:17 »
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

Sieht ganz anders aus.
192.168. ist die IP Deines DoorBird? Und der Port ist auch immer der selbe. Kann man da nicht einfach eine UDP Clientverbindung zu dem Teil auf machen?

my $socket = new IO::Socket::INET   (   PeerHost => $host,
                                            PeerPort => $port,
                                            Proto => 'udp',
                                            Timeout => $timeout
                                        )
        or return Log3 $name, 4, " ($name) Couldn't connect to $host:$port";      # open Socket
       
    $hash->{FD}    = $socket->fileno();
    $hash->{CD}    = $socket;         # sysread / close won't work on fileno
    $selectlist{$name} = $hash;
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://paypal.me/pools/c/8gULisr9BT
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline Sailor

  • Developer
  • Hero Member
  • ****
  • Beiträge: 1461
  • und es werden immer mehr...
Antw:UDP Datagramme empfangen
« Antwort #18 am: 28 Januar 2019, 11:16:00 »
Hallo CoolTux

Sieht ganz anders aus.
192.168. ist die IP Deines DoorBird? Und der Port ist auch immer der selbe. Kann man da nicht einfach eine UDP Clientverbindung zu dem Teil auf machen?

Can't call method "fileno" on an undefined value at ./FHEM/73_DoorBird.pm line 176.
OK, werde ich versuchen, aber wie vermeide ich bei einer Neu-Definition des Device nach einem Neustart (das funktioniert wohl noch), dass mein fhem - System mit der Fehlermeldung oben abschmiert?
Der Fehler ist auf anderen Systemen reproduzierbar...

Gruss
    Sailor
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 21694
Antw:UDP Datagramme empfangen
« Antwort #19 am: 28 Januar 2019, 11:23:43 »
Genau so wie ich es geschrieben habe.

or return Log3 $name, 4, " ($name) Couldn't connect to $host:$port";
Wenn Du nur schreibst
my $conn = IO::Socket::INET->new(Proto=>"udp",LocalPort=>3702);Aber nicht prüfst ob das erstellen des Objektes auch wirklich geklappt hat dann wird das nichts.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://paypal.me/pools/c/8gULisr9BT
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #20 am: 28 Januar 2019, 11:39:55 »
ich vermute mal das reuse port fehlt, kann das aber nur raten.

Ganz um das einlesen wirst Du nicht herumkommen, wie willst Du sonst bugs in Deinem code finden wenn Du nicht verstehst was er tut? (Genau das ist was gerade passiert... Glaub ich..)

Sowohl Andre als auch ich haben funktionierenden code zum abtippen in die Runde geworfen. Aber minimale Abweichungen davon können zu Fehlern, vmtl trivialen, führen - das ist aber auch normal.

Stell doch Deinen code mal komplett ein. Ich kann Dir den udp Teil sonst schon schreiben, aber was hilft Dir das dann?
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 #21 am: 01 Februar 2019, 07:32:37 »
Moin zusammen

ich vermute mal das reuse port fehlt, kann das aber nur raten.

Der folgende Code wird in der DoorBird_Define() aufgerufen bzw in der DoorBird_Init() definiert / verwiesen:
sub DoorBird_Initialize($)
{
...
    $hash->{ReadFn}          = "DoorBird_Read";
...
}

sub DoorBird_OpenSocketConn($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $conn;


### Check if json can be parsed into hash
eval
{
$conn = new IO::Socket::INET (
PeerAddr  => '255.255.255.255',
PeerPort  =>  6524
Proto     => 'udp',
Broadcast => 1
);
1;
}
or do
{
### Log Entry for debugging purposes
Log3 $name, 3, $name. " : DoorBird_OpenSocketConn - Socket Connection cannot be established";

return
};

### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_OpenSocketConn - Socket Connection has been established";
Log3 $name, 5, $name. " : DoorBird_OpenSocketConn - SocketConnection        : " . $conn;

$hash->{FD}    = $conn->fileno();
$hash->{CD} = $conn;
$selectlist{$name} = $hash;

return
}

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_Read - UDP Client said                   : " . $data;

Dispatch($hash, $buf);
}

führt zwar zu einem Anlegen einer Verbindung
DoorBird_OpenSocketConn - Socket Connection has been established
DoorBird_OpenSocketConn - SocketConnection        : IO::Socket::INET=GLOB(0x725d0d0)

aber das DoorBird_Read kommt dennoch nicht zum Zuge, sobald im LAN folgende Messages auftauchen:
Internet Protocol Version 4, Src: 192.168.xx.xx, Dst: 255.255.255.255
User Datagram Protocol, Src Port: 3074, Dst Port: 6524

Ich habe mich jetzt ein wenig in Broadcast, Unicast und Multicast eingelesen und habe mir von den jeweiligen Testern und Besitzern bestätigen lassen, dass der DoorBird ohne irgendwelche weiteren Router/Firewall am gleichen Switch hängen.

Eigentlich müsste doch was kommen...

Die von Dir und André in die Runde geworfenen Code-Snippets zielen, sofern ich das richtig verstanden habe, auf Unicast bzw. Multicast ab und ist wohl nicht mit dem o.g. Broadcast kompatibel.

Habt Ihr da noch eine andere Idee?

Danke

Gruß
    Sailor
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #22 am: 01 Februar 2019, 14:19:43 »
Moin Sailor,

Wenn Du den socket via IO::Socket::INET (https://perldoc.perl.org/IO/Socket/INET.html) erstellen möchtest:

PeerAddr, PeerPort, Broadcast  sind dafür nicht erforderlich.

Stattdessen musst Du LocalPort auf den Port setzen welcher empfängt (6524), "UDP" bleibt natürlich.

Reuse port kann vmtl in diesem Szenario entfallen. Ich würde den usern empfehlen den FHEM Server komplett neu zu starten wenn Du das angepasst hast bevor sie testen.
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 #23 am: 01 Februar 2019, 20:45:12 »
Hallo Herrmann

Wenn Du den socket via IO::Socket::INET (https://perldoc.perl.org/IO/Socket/INET.html) erstellen möchtest:
PeerAddr, PeerPort, Broadcast  sind dafür nicht erforderlich.
Stattdessen musst Du LocalPort auf den Port setzen welcher empfängt (6524), "UDP" bleibt natürlich.
Reuse port kann vmtl in diesem Szenario entfallen. Ich würde den usern empfehlen den FHEM Server komplett neu zu starten wenn Du das angepasst hast bevor sie testen.

Mit dem Code

$conn = new IO::Socket::INET (
Listen    => 5,
LocalAddr => 'localhost',
LocalPort => 6524,
Proto     => 'udp'
);

sowie

$conn = new IO::Socket::INET (
Listen    => 5,
LocalAddr => '192.168.178.vomfhemServer',
LocalPort => 6524,
Proto     => 'udp'
);

bzw.

$conn = new IO::Socket::INET (
LocalPort => 6524,
Proto     => 'udp'
);

lassen sich keine Socket - Verbindungen aufbauen.

Das Beispiel
$conn = new IO::Socket::INET (
PeerAddr => 'www.perl.org',
PeerPort => 'http(80)',
Proto    => 'tcp'
);
lässt sich aufbauen und es kommt über DoorBird_Read rein:

Unknown code , help me!
DoorBird_Read - UDP Client said buf               :
DoorBird_Read - UDP Client said data              :
dispatch

Es ist zum Mäusemelken...

Gruss
    Sailor
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #24 am: 01 Februar 2019, 21:23:39 »
Was heist denn "lassen sich keine Socket - Verbindungen aufbauen." ?

UDP ist ein verbindungsloses Protokoll.

Ein Beispiel:
package main;

use strict;
use warnings;
use utf8;

use IO::Socket::INET;
use Data::Dumper;

my $conn = new IO::Socket::INET (
LocalPort => 6524,
Proto     => 'udp'
) or die("failed...");

print Dumper $conn;

1;
Ausgabe:
$VAR1 = bless( \*Symbol::GEN0, 'IO::Socket::INET' );Funktioniert.


Nachtrag: ergänzt, ein receive
package main;

use strict;
use warnings;
use utf8;

use IO::Socket::INET;
use Data::Dumper;

my $conn = new IO::Socket::INET (
LocalPort => 6524,
Proto     => 'udp'
) or die("failed...");

print Dumper $conn;

my ($data,$flags);
$conn->recv($data, 1024, $flags);
print "Received datagram from ", $conn->peerhost,", flags ", $flags || "none", ": $data\n";

1;
« Letzte Änderung: 01 Februar 2019, 21:29:29 von herrmannj »
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 #25 am: 01 Februar 2019, 21:34:22 »
ich weiss nicht ob dein code oben noch aktuell ist, aber da fehlt ein , hinter 6524 deshalb geht das eval schief.

übrigens: du brauchst du kein eval. einfach $conn auswerten reicht.

wenn du PeerAddr und PeerPort verwendest baust du eine verbindung zu einem ziel auf das auf eine verbindung wartet.

wenn du beides weg lässt wartest du das dir jemand daten schickt.

wenn du auf reagieren willst wenn dir jemand was sendet braucht du letzteres und du kannst beide fälle nicht vergleichen.

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 #26 am: 01 Februar 2019, 22:38:23 »
Was heist denn "lassen sich keine Socket - Verbindungen aufbauen." ?

UDP ist ein verbindungsloses Protokoll.

Ein Beispiel:
package main;

use strict;
use warnings;
use utf8;

use IO::Socket::INET;
use Data::Dumper;

my $conn = new IO::Socket::INET (
LocalPort => 6524,
Proto     => 'udp'
) or die("failed...");

Genau an dieser Stelle steht dann ein
failed... at ./FHEM/73_DoorBird.pm line 627.
im fhem-Log und fhem ist abgestürzt...
Daher hatte ich das im eval.

Nehmen wir mal an, ich würde im Wireshark laufend folgende Meldungen zum Testen nehmen wollen:

192.168.178.21 239.255.255.250 UDP 1265 3702 → 3702 Len=4183

Mir ist bewusst, dass die "239.255.255.250" keine Broadcast - Adresse im eigentlichen Sinne ist, aber das dürfte bei dem Code unten eigentlich keine Rolle spielen, da er ja scheinbar auf alles reagiert was als Protokol "udp" gekennzeichnet und auf Port 3702 liegt.

Oder irre ich mich da?

###START###### Open UDP socket connection #####################################################################START####
sub DoorBird_OpenSocketConn($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $conn;
my $port = $hash->{helper}{UdpPort};
my $url  = $hash->{helper}{URL};
   $url  =~ s/:.*//;

### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_OpenSocketConn - url                     : " . $url;
Log3 $name, 5, $name. " : DoorBird_OpenSocketConn - port                    : " . $port;

## Check if connection can be opened
eval
{
$conn = new IO::Socket::INET (
LocalPort => 3702,
Proto     => 'udp'
);
1;
}
or do
{
### Log Entry for debugging purposes
Log3 $name, 3, $name. " : DoorBird_OpenSocketConn - IO::Socket::INET Error  : " . $@;

return
};


Log3 $name, 5, $name. " : DoorBird_OpenSocketConn - SocketConnection        : " . Dumper($conn);


if (defined($conn)) {
$hash->{FD}    = $conn->fileno();
$hash->{CD} = $conn;
$selectlist{$name} = $hash;

### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_OpenSocketConn - Socket Connection has been established";
}
else {
### Log Entry for debugging purposes
Log3 $name, 5, $name. " : DoorBird_OpenSocketConn - Socket Connection has NOT been established";
}
return
}
####END####### Open UDP socket connection ######################################################################END#####

###START###### After return of UDP message ####################################################################START####
sub DoorBird_Read($) {
my ($hash) = @_;
my $name = $hash->{NAME};
my $buf;
my $flags;
my $data;

my $PeerHost = $hash->{CD}->peerhost;

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

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

Dispatch($hash, $buf);
}
####END####### After return of UDP message #####################################################################END#####

a) Einen Neustart per "sudo reboot" erzwungen,
b) das DoorBird Device neu definiert,
und folgendes im Log entdeckt:

DoorBird_OpenSocketConn - url                     : 192.168.178.21
DoorBird_OpenSocketConn - port                    : 3702
DoorBird_OpenSocketConn - SocketConnection        : $VAR1 = undef;

DoorBird_OpenSocketConn - Socket Connection has NOT been established


## Check if connection can be opened
$conn = eval { ...
kommt zum gleichen Ergebnis.

Zumindest kommt es nicht zum fhem Absturz...

Warum klappt das bei Herrmann seiner perl-Routine und nicht innerhalb von einem fhem - Modul.

Habe ich irgendwas am RasPi nicht richtig installiert (Debian Pakete, Perl libs, ethernet card) oder lässt fhem irgendetwas nicht zu?
Rätsel über Rätsel... :-[

Vielleicht ist dies ein guter Zeitpunkt die Basics abzuklopfen.

Gruss
    Sailor
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19289
Antw:UDP Datagramme empfangen
« Antwort #27 am: 01 Februar 2019, 22:44:01 »
du darfst niemals die verwenden. damit beendest du dein programm.

einfach if( $conn ) ...

ja du irrst dich. wenn du ein socken auf machst lauschst du nur auf bestimmten adressen. das ist ohne angabe von LocalAddr normalerweise nur localhost und alle ip adressen die deine interfaces haben. da sind ohne das du dafür sorgst keine multicast adressen dabei. 239.255.255.250 ist eine multicast adresse.
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 #28 am: 01 Februar 2019, 22:55:25 »
Sailor,

nimm doch das script das ich oben gepostet habe und lass es einfach mal ohne fhem laufen. Dann kannst Du Dich Stück für Stück rantasten. Das "die" hat natürlich nichts in einem fhem Modul zu suchen.

Du postest immer im Wechsel Broadcast und Multicast Adressen. Was ist es denn nun ?  ;)

Noch als Idee: kann es sein dass der Port 6524 bei Dir schon geöffnet ist ?


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 #29 am: 01 Februar 2019, 23:01:10 »
Hi justme
ja du irrst dich. wenn du ein socken auf machst lauschst du nur auf bestimmten adressen. das ist ohne angabe von LocalAddr normalerweise nur localhost und alle ip adressen die deine interfaces haben. da sind ohne das du dafür sorgst keine multicast adressen dabei. 239.255.255.250 ist eine multicast adresse.

Ok, war ein Versuch Wert, dann bleibt nur der Versuch ein Broadcast zu senden.
Zum Beispiel vom RasPi mittels socat - udp-sendto:255.255.255.255:6524,broadcast.
Zumindest taucht das im tshark als 192.168.178.RasPi → 255.255.255.255 UDP 43 45181 → 6524 Len=1 auf

Auch ohne "die" und ohne "eval" bleibt das Problem, dass die Socket-Verbindung $conn undefiniert bleibt.

DoorBird_OpenSocketConn - SocketConnection        : $VAR1 = undef;
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19289
Antw:UDP Datagramme empfangen
« Antwort #30 am: 01 Februar 2019, 23:02:57 »
bau mal das reuse port von oben mit ein. sonst kann jeder port nur ein mal geöffnet werden und vielleicht hat jemand anders den schon offen.

das solle auch mit netstat zu sehen sein.
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 #31 am: 01 Februar 2019, 23:13:06 »
Hallo Herrmann

Du postest immer im Wechsel Broadcast und Multicast Adressen. Was ist es denn nun ?  ;)
Ja, Ja, du hast ja Recht.
Ich versuche mir hier nur eine Krücke zu bauen um wenigstens irgendetwas als Antwort im DoorBird_Read zu bekommen.

Noch als Idee: kann es sein dass der Port 6524 bei Dir schon geöffnet ist ?

Ach Herrje... wie war das nochmal herauszufinden..
Nun, mit sudo tshark -f "udp port 6524" in einem SSH-Fenster und socat - udp-sendto:255.255.255.255:6524,broadcast
im Anderen, kann ich sehen wie sie dort ankommen:
192.168.178.Raspi → 255.255.255.255 UDP 43 34278 → 6524 Len=1
Was will man mehr.

Innerhalb von fhem und anderen Konfigurationen auf dem fhem-RasPi verwende ich kein Port 6524.

Gruss
    Sailor
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19289
Antw:UDP Datagramme empfangen
« Antwort #32 am: 01 Februar 2019, 23:19:45 »
nicht schauen ob jemand etwas an den port sendet sondern mit netstat schauen ob etwas anderes den port schon offen hat.
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 #33 am: 01 Februar 2019, 23:22:18 »
Hallo justme

bau mal das reuse port von oben mit ein. sonst kann jeder port nur ein mal geöffnet werden und vielleicht hat jemand anders den schon offen.

Habe die Zeile

$hash->{reusePort} = AttrVal($name, 'reusePort', defined(&SO_REUSEPORT)?1:0)?1:0;im DoorBird_Define eingebaut
ferner

### Check if connection can be opened
$conn = new IO::Socket::INET (
ReusePort => $hash->{reusePort},
LocalPort => $port,
Proto     => 'udp'
);
im fraglichen Teil.
Ich hoffe das ist so in deinem Sinne.  ;)

nicht schauen ob jemand etwas an den port sendet sondern mit netstat schauen ob etwas anderes den port schon offen hat.

Jede Menge Ports aber kein einziger mit Port auf 6425.

Gruss
    Sailor


******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.

Offline herrmannj

  • Global Moderator
  • Hero Member
  • ****
  • Beiträge: 5056
Antw:UDP Datagramme empfangen
« Antwort #34 am: 01 Februar 2019, 23:24:30 »
Neustart machen :) Hast Du ein test modul installiert wo Du schon irgendwas mit dem Port machst ?
Zitat
Ich versuche mir hier nur eine Krücke zu bauen um wenigstens irgendetwas als Antwort im DoorBird_Read zu bekommen.
:o Irgendwas ?  ;) Broadcast und Multicast erfordern unterschiedliches Setup. Entscheide Dich erst einmal für eins. Beides geht in Deiner Architektur so nicht, das kann man später aber gerade ziehen. Und ja, die basics … sie helfen. Da mussten alle mal durch ;)
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 #35 am: 01 Februar 2019, 23:26:08 »
Nebenbei mal an Euch beide: DANKE für Eure Unterstüzung!

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 #36 am: 01 Februar 2019, 23:37:37 »
OK, da tut sich was!!!

Jedesmal wenn ich einen "socat - udp-sendto:255.255.255.255:6524,broadcast" abfeure, erscheint im Log
myDoorBirdNetbus: Unknown code , help me!
DoorBird_Read - UDP Client said PeerHost          : 192.168.178.7
DoorBird_Read - UDP Client said buf               :
DoorBird_Read - UDP Client said flags             :
DoorBird_Read - UDP Client said data              : 0a


Ein echo "Moin Dumpfbacke!"|socat - udp-sendto:255.255.255.255:6524,broadcast ergibt im Log

DoorBird_Read - UDP Client said PeerHost          : 192.168.178.7
DoorBird_Read - UDP Client said buf               : Moin Dumpfbacke!

DoorBird_Read - UDP Client said flags             :
DoorBird_Read - UDP Client said data              : 4d6f696e2044756d70666261636b65210a
dispatch Moin Dumpfbacke!\n
Unknown code Moin Dumpfbacke!
, help me!

Na, wenn das kein Erfolg ist!!!

DANKE!!!!

 ;D ;D ;D

Gruss
    Sailor
« Letzte Änderung: 01 Februar 2019, 23:40:38 von Sailor »
******************************
Aufgrund eines Rohrbruchs nur eingeschränkte Antwort möglich.
Gefällt mir Gefällt mir x 1 Liste anzeigen

 

decade-submarginal