Ankündigung

Einklappen
Keine Ankündigung bisher.

Socat debuggen

Einklappen
Dieses Thema ist geschlossen.
X
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [wiregate] Socat debuggen

    Moin allerseits,

    ich versuche seit ein paar Tagen einen CAN-USB-Adapter in einem Plugin einzubinden. Der Adapter taucht als /dev/ttyACMx auf - soweit, so gut. Ich habe einen bidirektionalen Socat eingestellt mit Optionen (Socket 1) = "raw,b115200,cs8,icanon=1,eol=13,echo" und Socket 2, udp-datagram "localhost:50050" und Optionen "bind=:50051,reuseaddr".
    Ich habe es auch schonmal geschafft, dass Daten im Plugin angekommen sind, aber irgendwie klappt das nicht verlässlich.

    Gibt es eine Möglichkeit sich per Kommandozeile o.ä. in die Verbindung zwischen Plugin und dem Adapter zu hängen, um die ausgetauschten Daten zu beobachten?

    Cheers und danke vorab
    Christian

    #2
    Variante 1: den socat im Webif deaktivieren und manuell auf der Konsole starten (so wie er in der Liste darunter im Webif steht) +
    -vv -A -X

    (-A = ASCII, -X = Hex)

    Variante 2, so mach ich das gewöhnlich: Entwickeln mit sep. Tools; moserial z.B. unter Linux, oder im socat statt "localhost" den eigenen Rechner/IP und Alfreds (HS-) UDP-Tools (in den Downloads hier) für Windows.

    Makki
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    Kommentar


      #3
      Ich muss mich hier mal reinhängen ... ich versuche jetzt schon den zweiten Abend irgendwie Daten ins Plugin zu bekommen.

      socat -x - /dev/ttyUSB0,raw,b2400,cs8
      Direkt auf der Konsole mit Monitor und Tastatur bringt mir ein paar Daten aber auch ein paar kryptische Zeichen. Auch ein Beep ist ab und zu dabei bis der Monitor ganz wild aussieht ;-)

      socat -x - /dev/ttyUSB0,raw,b2400,cs8 > ebus.log
      Auch wieder direkt auf der Konsole macht genau das was es soll. Der Inhalt wird in die Datei ebus.log geschrieben. Den Inhalt bekomme ich dann mit Perl s/(.)/sprintf("0x%x ",ord($1))/eg ordentlich zu hex gewandelt.

      socat - /dev/ttyUSB0,raw,b2400,cs8 > ebus.log
      Verhält sich wie der Befehl davor, allerdings ohne Ausgabe am Monitor.
      Ich frag mich was ich falsch mache dass mir im Plugin nichts angezeigt wird.
      Es reagiert auf jeden Fall auf eingehende Telegramme, aber es werden keine Daten im Log ausgegeben. Logeinträge gibt es aber durchaus mehrere pro Sekunde.


      Meine Einstellungen im Webmin:
      Socket1:
      Socket: /dev/ttyUSB0
      Optionen: raw,b2400,cs8

      Socket2:
      udp-datagram
      Socket: localhost:50110
      Optionen: bind=localhost:50111,reuseaddr


      Die Ausgabe bleibt leer:
      Code:
      my $socknum = 20; # Eindeutige Nummer des Sockets +1
      
      my $send_ip = "localhost"; # Sendeport (UDP, siehe in Socket-Einstellungen)
      my $send_port = "50011"; # Sendeport (UDP, siehe in Socket-Einstellungen)
      my $recv_ip = "localhost"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
      my $recv_port = "50010"; # Empfangsport (UDP, siehe in Socket-Einstellungen)
      
      if (!$socket[$socknum]) { # socket erstellen
              $socket[$socknum] = IO::Socket::INET->new(LocalPort => $recv_port,
                                        Proto => "udp",
                                        LocalAddr => $recv_ip,
                                        PeerPort  => $send_port,
                                        PeerAddr  => $send_ip,
                                        ReuseAddr => 1
                                         )
          or return ("open of $recv_ip : $recv_port failed: $!");
      
          $socksel->add($socket[$socknum]); # add socket to select
      
          $plugin_socket_subscribe{$socket[$socknum]} = $plugname; # subscribe plugin
          return "opened Socket $socknum";
          plugin_log($plugname,'Soket verbunden. Soketnummer: ' . $socknum);
      } elsif ($fh) { 
          
          my $line;
          $line = $fh;
          plugin_log($plugname,"$line");
          my $bufhex = $line;
          $bufhex =~ s/(.)/sprintf("0x%x ",ord($1))/eg;
          plugin_log($plugname,"hex: $bufhex");
          
      return;
      }
      Umgezogen? Ja! ... Fertig? Nein!
      Baustelle 2.0 !

      Kommentar


        #4
        Nun mal Butter bei die Fische Ich versuche die Daten vom Wiregate-Seriell über UDP zu senden:

        Wenn ich mit Alfreds UDP-Listener auf Port 50110 (WindowsIP=192.168.2.26) höre dann kommen die Daten mit folgenden Konsolenbefehl rein:
        socat /dev/ttyUSB0,raw,b2400,cs8 udp:192.168.2.26:50110

        Nun hab ich das ganze auf der Konsole versucht auf localhost zu senden:
        socat /dev/ttyUSB0,raw,b2400,cs8 udp:localhost:50110
        Fehler: socat[30963] E read(4, 0x912aea8,8192): Connection refused

        Wer ist hier socat-Experte ?
        Das legt mir jedenfalls den ganzen eBus lahm an dem der Adapter angeschlossen ist:
        socat /dev/ttyUSB0,raw,b2400,cs8 udp-datagram:localhost:50110,bind=localhost:50111,reus eaddr


        Der Vorteil...so langsam verstehe ich die Befehlssyntax und wie mächtig socat sein kann.
        Umgezogen? Ja! ... Fertig? Nein!
        Baustelle 2.0 !

        Kommentar


          #5
          Nachdem ich meinen Fehler gefunden habe mal die nächste Frage zum socat:
          Hier nun der richtige Befehl: /usr/bin/socat /dev/ttyUSB0,raw,b2400,echo=0 udp-datagram:localhost:50110,bind=localhost:50111,reus eaddr

          1. Wie kann ich Ihm mitteilen dass er mir bitte immer nur x Bytes senden soll?

          oder

          2. Wo gebe ich ein eol=0xaa weiter

          oder

          3. Was hilft mir denn meine zu emfangenden Daten zu konfigurieren (rcvbuf,rcvbuf-late,sndbuf???) -> man-page: SOCAT-MAN-PAGE

          Mal kommen 5byte , mal 1byte usw. da ich in meinem Stream kein EOL (crnl o.ä.) habe. Damit läuft das Plugin quasi dauerhaft weil ständig was reindröselt.

          Danke und Gruß
          Mirko
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            - Wenns kein definiertes "EOL" gibt hilft nur byteweise parsen im Plugin, Rest vom letzten merken etc..

            - eol beim socat ist dezimal!

            - Die Alternative, direkt auf den seriellen Port geht zwar, ist aber nicht viel leckerer..

            Makki
            EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
            -> Bitte KEINE PNs!

            Kommentar


              #7
              Hallo...

              Der Thread ist ja schon etwas älter aber ich versuch's trotzdem mal:

              ich versuche einen Onkyo Receiver per socat anzubinden, ich habe mich auf dem Denon-Script, das im Archiv rumschwebt basiert. Vom Prinzip her funktioniert's auch, die Telnet-Verbindung zum Receiver steht. Schreiben kann ich auch, ich habe nur ein Problem mit dem Lesen: das Plugin hört auf den UDP-Stream und startet, es erhält aber nicht den ganzen String, sondern nur einen Teil.

              So sieht der Output aus, wenn ich ihn auf der Console erzeuge:

              Code:
              root@wiregate733:~# socat -x - tcp:192.168.4.52:60128,cr,forever,keepalive
               49 53 43 50 00 00 00 10 00 00 00 0a 01 00 00 00 21 31 4d 56 4c 32 39 1a 0a 0a
              ISCP
              !1MVL29
              Mich interessiert in dem Falle das !1MVL29 (der Receiver hat die Lautstärke geändert). Die Ausgabe erzeugt drei Umbrüche, die wohl den 0a (LF) entsprechend. Damit kann ich leben, ich kann die beiden anderen Zeilen ja discarden.

              Allerdings hat mein Plugin das Problem, dass socat wohl irgendwo einen Teil der Ausgabe in einem Buffer hält: die ISCP-Zeile kriege ich, dann passiert nichts. Wenn dann ein neuer Befehl kommt, kriege ich die "!1MVL29" und Leerzeile, dazu den ISCP des neuen. Der Rest bleibt wieder stecken.

              Ich bin als quasi immer 'eins zu spät'.

              Der Socket im Wiregate sieht so aus:
              Code:
              /usr/bin/socat udp-datagram:localhost:12860,bind=localhost:12861,reuseaddr tcp-connect:192.168.4.52:60128,cr,forever,keepalive
              Wie kann ich das Wiregate bewegen, den ganzen Befehl einzulesen, oder zumindest irgendwelchen Buffer, die dazwischenhängen, zu leeren?

              Kommentar

              Lädt...
              X