DevIo.p für UDP Socket benutzen?

Begonnen von macmattes, 08 November 2013, 22:22:20

Vorheriges Thema - Nächstes Thema

macmattes

Hallo
versuche nun vergeblich einen UDP Socket sinnvoll zu öffnen, um Sensordaten nach Fhem zu schicken.
Hab DevIO erweitert und auch ein Modul umgebaut, dass die Socket dann mit DevIo öffnet.
Mein Problem: Wenn die Socket auf ist, hängt Fhem und wartet auf dem Socket auf Daten, die auch angezeigt werden sobald sie hereinkommen. Besteht die Möglichkeit entsprechendes umzusetzen ohne Fhem lahmzulegen?

Anbei meine Änderung in DevIo und das Modul

define SYSLOG SYSLOG 127.0.0.1:u5514

elsif($dev =~ m/^(.+):([Uu][0-9]+)$/) {       # host:uport

    # This part is called every time the timeout (5sec) is expired _OR_
    # somebody is communicating over another UDP connection. As the connect
    # for non-existent devices has a delay of 3 sec, we are sitting all the
    # time in this connect. NEXT_OPEN tries to avoid this problem.
    if($hash->{NEXT_OPEN} && time() < $hash->{NEXT_OPEN}) {
      return;
    }
   my ($ip,$lport) = split(':',$dev);
   my $port = substr($lport,1,5);
    my $timeout = $hash->{TIMEOUT} ? $hash->{TIMEOUT} : 3;
    my $conn = IO::Socket::INET->new(Proto => 'udp', LocalPort => $port, Timeout => $timeout);
    if($conn) {
      delete($hash->{NEXT_OPEN})

    } else {
      Log3 $name, 3, "Can't connect to $dev: $!" if(!$reopen);
      $readyfnlist{"$name.$dev"} = $hash;
      $hash->{STATE} = "disconnected";
      $hash->{NEXT_OPEN} = time()+60;
      return "";
    }

    $hash->{TCPDev} = $conn;
    $hash->{FD} = $conn->fileno();
    delete($readyfnlist{"$name.$dev"});
    $selectlist{"$name.$dev"} = $hash;

rudolfkoenig

Ich sehe noch nicht das Problem, und wuerde an deine Stelle debuggen (mit "attr global verbose 5" und evtl. zusetzliche Log Zeilen):
- kommt es an select vorbei
- wird im select das FD als lesbar markiert
- wird ReadFn aufgerufen
- wo genau haengt es
usw.

Eigentlich ist eine TCP-IP Verbindung aehnlich, und davon kann FHEM mehrere behandeln.