Ankündigung

Einklappen
Keine Ankündigung bisher.

- √ - Plugin mit Telnetverbindung ohne Login

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

    [wiregate] - √ - Plugin mit Telnetverbindung ohne Login

    Hallo zusammen

    Ich habe mal wieder ein Problem mit PERL.

    Ich versuche eine Telnetverbindung zu meinem Surroundsystem aufzubauen, um es fernzusteuern. Soweit so gut. ABER...

    Die Telnetverbindung hat kein Login. Es wird also weder nach dem Usernamen noch nach dem Password gefragt (gibt's auch nicht). Der grosse Haken ist, dass sich das Surroundsystem nach dem Verbindungsaufbau auch nicht zurück meldet. Erst nach dem senden eines Befehls wird eine Antwort zurück gegeben.

    In Windows sieht das so aus:

    Telnetkonsole auf.
    Verbindung auf IP
    Terminalfenster bleibt schwarz und der Cursor blinkt
    z.B. Befehl MVUP eingeben und mit Enter bestätigen
    Rückmeldung des Surroundsystems

    Ich versuche mit folgendem Code die Verbindung aufzubauen:

    Code:
    sub remote_command_send {
        # Telnet
        my $telnet = Net::Telnet->new($ip_address);
        my @lines = $telnet->cmd("$remote_command");
        return "gesendet";
    }
    Das Problem ist, dass dieser Aufruf ein Login erwartet. Und der Aufruf in ein Timeout läuft.

    Kann man die Loginabfrage deaktivieren und die Timeoutzeit beeinflussen?

    Ich hoffe ihr könnt mir helfen.
    Gruss Patrik alias swiss

    #2
    Ich vermute mal wir sprechen von einem Denon? Das Rad wurde schonmal erfunden, nur halbfertig und undokumentiert
    Denon-Plugin

    Dazu ein Socket (socat) Eintrag: siehe Anhang (#5 Denon). Klingt komplizierter als nötig ist aber unterm Strich mit dem socat dazwischen einfacher, weil man sich das ganze leidige Handling (reconnect, timeouts,...) spart.

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

    Kommentar


      #3
      Hallo makki
      danke für die schnelle Antwort

      JA. Es handelt sich um ein Denon. Aber geht das nicht einfacher? Wenn ich mir dein Plugin ansehe, bekomme ich gleich Kopfschmerzen. Ich möchte ungern den Doktor in angewanter PERL Programmierung machen.

      Ist das die einzige Möglichkeit? Ich müsste ja dein Plugin komplet zerlegen und in mein Plugin einarbeiten. Vor allem die Befehlsübergabe in deinem Plugin ist mir noch nicht klar. Und das mit dem erstellen von soket im WG hab ich auch noch nie richtig verstanden.
      Gruss Patrik alias swiss

      Kommentar


        #4
        Wiegesagt, ganz perfekt ist das noch nicht aber vom Ansatz her..
        Befehlübergabe ist "$Tippfaul" und $unfertig:
        Also $base_ga ist hier 10/0/0
        10/0/0 macht PWON/OFF (1Bit)
        10/0/2 macht MVUP/DOWN (1Bit)
        10/0/3 macht MV<WERT> setzen (1 byte)
        usw.

        Keine Angst, ein echter Perl-Programmierer würde in einer eigenen Klasse einen Hashref machen

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

        Kommentar


          #5
          Hmmm...

          Sorry ich raff es nicht. Da ich in meinem Plugin schon die ganze Ansteuerung und Rückmeldegeschichte mit meinen KNX Tastern aufgebaut habe und mir nur noch das senden von Befehlen via Telnet fehlt, muss ich dein Plugin doch irgendwie in mein Plugin einbauen.

          Ich tu mich momentan am schwersten mit solchen Kombiausdrücke:

          Code:
                    my @vals = qw/PWSTANDBY PWON/; #1bit on/off 
                    syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
          Also nochmal für mich als blutiger Anfänger...

          my @vals = qw/PWSTANDBY PWON/; #1bit on/off Hier wird der zu übertragende Befehl für den Denon erzeugt. Wiso steht da qw/PWSTANDBY ? Hat das qw eine bestimmt Funktion? Wie müsste die Variabel beschrieben werden, wenn ich NUR PWSTANDBY senden möchte (ohne unterscheidung zwischen 0 oder 1)?

          Code:
          syswrite($socket[$socknum], $vals[$msg{'data'}]."\r");
          Hier wird allem anschein nach der vorher erstellte Befehl für den Denon via socat gesendet. oder?

          Sorry fürs blöde fragen aber ich versuche das Script zu verstehen.
          Gruss Patrik alias swiss

          Kommentar


            #6
            Blöde Fragen gibts nicht

            Zitat von swiss Beitrag anzeigen
            Da ich in meinem Plugin schon die ganze Ansteuerung und Rückmeldegeschichte mit meinen KNX Tastern aufgebaut habe und mir nur noch das senden
            Dann sehen wir das ja hoffentlich bald

            von Befehlen via Telnet fehlt
            vergiss mal lieber das Telnet, da wirst Du nicht froh werden.. Effizient offenhalten ohne ständige Timeout-Probleme Der Denon mag auch keine mehreren connections etc.pp., ist ja nur ein kleiner Microcontroller ohne robusten, gescheiten IP-Stack (ich spreche aus Erfahrung glaube ich..)

            Code:
                      my @vals = qw/PWSTANDBY PWON/; #1bit on/off
            ist dasselbe wie
            my @vals; # ein Array
            $vals[0] = "PWSTANDBY"; # dem array in 0 den Wert zuweisen
            $vals[1] = "PWON"; # ...
            Per Inhalt des Telegramms wird nun auswählt ob eben der String PWSTANDBY oder PWON rausgeschrieben wird.

            Wie müsste die Variabel beschrieben werden, wenn ich NUR PWSTANDBY senden möchte (ohne unterscheidung zwischen 0 oder 1)?
            syswrite($socket[$socknum], "PWSTANDBY\r");
            oder
            syswrite($socket[$socknum], $vals[0]."\r");

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

            Kommentar


              #7
              OK. Danke. Ich glaube ich hab zumindest das Script verstanden...

              Zitat von makki
              Dann sehen wir das ja hoffentlich bald
              Klar doch. Ich will ja auch meinen Beitrag leisten Wenn es dann mal lüpt, muss ich es nur nochmals etwas nachbessern, da es momentan relativ chaotisch ist.

              Nun hab ich aber noch ein Problem. Leider passiert weiterhin nix, wenn ich einen Befehl per socat versenden will.

              Das könnte damit zusammen hangen, dass ich von Socat 0 Ahnung habe. Ist es normal im WG unter "Socketverbindungen" die Ampel auf ROT steht? Und das Zusammenspiel der Socketnummern hab ich auch noch nicht verstanden. Gibt's dazu ein Nachschlagewerk?
              Gruss Patrik alias swiss

              Kommentar


                #8
                Zitat von swiss Beitrag anzeigen
                Nun hab ich aber noch ein Problem. Leider passiert weiterhin nix, wenn ich einen Befehl per socat versenden will.
                ..
                Ist es normal im WG unter "Socketverbindungen" die Ampel auf ROT steht?
                Nein, da muss der laufende socat-Prozess stehen sonst stimmt was nicht.
                Der Denon ist ziemlich zimperlich, also z.B. nicht mehrere Verbindungen offenhaben (altes Plugin?) -> im Zweifel den wiregated unter Status durchstarten, auf der ssh-Konsole mit
                Code:
                netstat -anp | grep <DENON-IP>
                prüfen

                Zum obigen Screenshot: das ist nichts anderes als ein "TCP-UDP-Umsetzer"
                172.17.2.89 ist die IP des Denon, :23 der Telnet-Port, 50105/UDP der Port zum empfangen, 50106 zum senden (aus Sicht des Plugins)

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

                Kommentar


                  #9
                  Danke makki

                  Ich hab nun den Fehler gefunden. Ich habe in der Socketverbindung nach der IP des Denon den Telnetport vergessen Nun steht die Ampel auf Grün und die Ansteureung funktioniert Und nun hab ich auch das Prinzip der Socketverbindungen verstanden. cool. Nur die Optionen hab ich noch nicht verstanden aber das finde ich schon noch heraus.

                  Nochmals danke für deine Geduld und Hilfe.
                  Gruss Patrik alias swiss

                  Kommentar


                    #10
                    Und schon kommt das nächste Problem

                    Nachdem nun die Steuerung ansich funktioniert, bin ich an der Optimierung des Codes. Und wie das hald bei mir so ist. Sobald ich den Code optimieren möchte geht erstmal nix mehr...

                    Nun zu mienem Problem.

                    Ich möchte das senden der Befehle in eine eigene Subroutine auslagern. Das Problem ist, dass ich mit dem Aufruf der Subroutine einen Wert übergeben möchte.

                    Der Aufruf sieht im Moment so aus:

                    Code:
                    my $return_value2 = command_senden("SAT");
                    Die Subroutine selbst sieht so aus:

                    Code:
                    sub command_senden{
                        (my $befehl) = @_;
                        my $command = $denon_befehle{$befehl};
                        syswrite($socket[$socknum], $command);
                        return "denon send: $command";
                    }
                    Das Problem ist, dass scheinbar der Wert, den ich mit dem Aufruf übergebe nicht verarbeitet wird. Nur finde ich den Fehler nicht
                    Gruss Patrik alias swiss

                    Kommentar


                      #11
                      [QUOTE=swiss;163725]
                      Code:
                      sub command_senden{
                          (my $befehl) = @_;
                      ...
                      Ich würde jetzt mal instinktiv sagen
                      my ($befehl) = @_;
                      oder
                      my $befehl = shift;

                      Makki

                      P.S.: ich habe eben das mit der Dreambox-Meldung so gemacht wie ich das eher machen würde Da kommt auch eine sub vor..

                      P.P.S: soclhe Sachen probiere ich übrigens auch immer erst sep. in einem 5-Zeiler Perl-script weil die Wege von Perl sind manchmal unergründlich..
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        So. Das Script läuft und wurde etwas aufgeräumt. Naja mein Programmierstiel ist nicht so toll also bitte nicht für die vielen IF abfragen schlagen. Die Performanc ist auch nicht so schlecht. Innerhalb einer Sekunde sind im Normalfall alle Zustands-LED's aktualisiert (auch bei Steuerung über die FB) und die Befehle weden relativ zügig ausgeführt.

                        @makki: Wie funktioniert das in SF, wenn ich den Quelltext erstmal als BETA einstellen möchte, und daran später noch weitere Veränderungen vornehmen möchte, bis diese Version als STABLE veröffentlicht werden kann?
                        Gruss Patrik alias swiss

                        Kommentar


                          #13
                          Naja das ist momentan bzgl. der Plugins eher rudimentär organisiert: Wenns ein Plugin gibt wird eingecheckt - erstmal mehr der grundlegenden Übersicht halber. Wenn man eins braucht holt man es sich ab, wenns was aktuelleres gibt schiebt man es hoch.

                          Aber deswegen hab ichs auf SF gelegt: jeder soll mitmachen können: Account anlegen, schreibrechte erfragen, fertig (oder ich checke es ein)

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

                          Kommentar


                            #14
                            Ich habe auf SF einen account nur wie man damit das aktuelle Plugin eincheckt weiss ich noch nicht. Kann aber eigentlich auch nicht schwierig sein. oder? Kriegt das ein Laie gebacken?
                            Gruss Patrik alias swiss

                            Kommentar


                              #15
                              Denke schon
                              Je nach präferiertem OS einen SVN-Client holen (Tourtoise SVN oder eben apt-get install subversion)
                              betreffenden Verzeichnis auschecken:
                              svn co https://openautomation.svn.sourcefor...plugin/generic mylocalplugins
                              .. reinkopieren
                              svn add MeinNeuesPlugin
                              svn ci -m "Beschreibung meines neuen Plugins"

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

                              Kommentar

                              Lädt...
                              X