Ankündigung

Einklappen
Keine Ankündigung bisher.

Telenot LBS--jemand Lust

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #31
    Ohne jetzt den Inhalt deines LBS zu kennen, im EXEX Teil, ind er Zeile 3, da hat es was ...
    Danke und LG, Dariusz
    GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

    Kommentar


      #32
      Selbst wenn ich die Zeile ändere kommt die Fehlermeldung.

      Code:
      set_time_limit(0);    //Script soll maximal 2 Sekunden laufen
      hier der Exec Teil

      Code:
      require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
      require(dirname(__FILE__)."/../../../../main/include/php/incl_telnet.php");
      
      set_time_limit(0);    //Script soll maximal 2 Sekunden laufen
      
      sql_connect();
      
      
      function telnetOpen($ip,$port,$timeout) {
          //Öffnet eine Telnet-Session
          //$ip: IP-Adresse
          //$Port: Telnet-Port
          //$timeout: Timeout in Sekunden
          //return: Connection-Handler, oder false=Fehler
          $con=fsockopen($ip,$port,$timeout);
          if ($con) {
              stream_set_blocking($con,0);
              return $con;
          } else {
              return false;
          }
      }
      
      
      function telnetSend($con,$n) {
          //Sendet in eine Telnet-Session
          //$con: Connection-Handler
          //$n: Inhalt (String)
          //return: false=Fehler, sonst Anzahl der geschriebenen Bytes
          return fwrite($con,$n."\r\n");
      }
      
      
      function telnetWait2($con,$waitFor,$readBytes,$timeout) {
          //Wartet auf einen bestimmten String und liefert die Antwort zurück
          //$con: Connection-Handler
          //$waitFor: String, auf den gewartet werden soll
          //$readBytes: soviele Bytes werden in einem Rutsch gelesen
          //$timeout: Timeout
          //return: die komplette Antwort, oder false=Timeout/nicht gefunden
          $ok=false;
          $n='';
          $t0=microtime(true);
          while (!feof($con)) {
              $n.=fread($con,$readBytes);
              if (strpos(strtoupper($n),strtoupper($waitFor))!==false) {
                  $ok=$n;
                  break;
              }
              if ((microtime(true)-$t0)>$timeout) {
                  break;
              }
              usleep(100*1000);
          }
          return $ok;
      }
      
      
      $E=getLogicEingangDataAll($id);
      $ip = $E[2]['value'];
      $port = $E[3]['value'];
      $myip = $E[4]['value'];
      $timeout = $E[5]['value'];
      $waitFor = 'hh';
      $readBytes = '2';
      
      
      
      $con1 = telnetOpen($ip,$port,$timeout);
      
      $data = telnetWait2($con1,$waitFor,$readBytes,$timeout);
       
       {
      setLogicLinkAusgang($id,1,$data);
       }
      
      sql_disconnect();
      
      ?>

      Kommentar


        #33
        Mit Telnet kenne ich mich absolut nicht aus aber wenn in der Notiz etwas von 2 Sekunden steht, warum steht da in der Klammer eine 0 und nicht die 2 ?
        Danke und LG, Dariusz
        GIRA | ENERTEX | MDT | MEANWELL | 24VDC LED | iBEMI | EDOMI | ETS5 | DS214+ | KNX/RS232-GW-ROTEL

        Kommentar


          #34
          Ich bin auch kein PHP Spezialist, aber wenn ich das richtig verstehe, sind die Funktionen bereits in der incl_telnet.php definiert.

          Du bindest diese mit include in deinem EXEC Teil ein und definierst sie dann nochmal. Das würde den Fehlertext erklären.

          Eigentlich kannst Du die Funktionen nach dem einbinden direkt nutzen.

          Kommentar


            #35
            So ist es - incl_telnet.php enthält genau diese Funktionen (wie zuvor beschrieben). Diese werden (teilweise) übrigens für den Anrufmonitor benötigt (Fritzbox) - dort funktionieren sie auch
            EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)

            Kommentar


              #36
              Hi,

              sorry aber muss nochmal was nachfragen....ich kann einfach den Fehler nicht finden in meinem Exec Teil. Was genau stimmt nicht????

              Code:
              ###[EXEC]###
              
              <?
              require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
              require(dirname(__FILE__)."/../../../../main/include/php/incl_telnet.php");
              
              set_time_limit(0);    //Script soll maximal 2 Sekunden laufen
              
              sql_connect();
              
              
              $E=getLogicEingangDataAll($id);
              $ip = $E[2]['value'];
              $port = $E[3]['value'];
              $myip = $E[4]['value'];
              $timeout = $E[5]['value'];
              $waitFor = 'hh@B';
              $readBytes = '2';
              
              
              
              $con1 = telnetOpen($ip,$port,$timeout);
              $data = telnetWait($con1,$waitFor,$readBytes,$timeout);
              
               {
              setLogicLinkAusgang($id,1,$data);
               }
              
              sql_disconnect();
              
              ?>
              ###[/EXEC]###

              Kommentar


                #37
                welchen Fehler?

                Kommentar


                  #38
                  Es gibt keine Fehlermeldung, allerdings kommt auch kein true/false auf mein Ausgang.

                  Kommentar


                    #39
                    vermutlich wird false zurückgegeben. false ist aber am Ausgang nicht sichtbar.

                    Mach mal ...

                    PHP-Code:
                      setLogicLinkAusgang($id,1,($data 'true' 'false')); 

                    Kommentar


                      #40
                      Jep genau so ist es, wenn die richtigen Daten ankommen dann setzt er auch true. Gibt es eine Möglichkeit die Telnet function so aufzurufen, das sie mir einfach weiterleitet was rein kommt, also den hex wert?? Ich muss ja bei telnetWait und telnetWait2 immer einen $waitfor angeben.


                      Gruß

                      Kommentar


                        #41
                        telnetWait2 sollte doch genau das machen. Das liefert die Antwort oder false wenn nichts reinkommt.

                        Die Variante die kontinuierlich liest hatte ich dir doch geschickt und die steht in #25
                        Zuletzt geändert von jonofe; 30.08.2016, 09:39.

                        Kommentar


                          #42
                          Ja ich weiß, telnetWait2 sendet mir nur true oder false, hatte dies eigentlich auch so aus der Beschreibung verstanden, dass die Antwort kommt.

                          Deine Variante funktioniert auch, ich wollte aber eventuell alles über telnet machen. Dachte mir ich könnte den selben $con verwenden. Wenn ich die Variante von dir mit einbaue und über telnetSend in einem anderen LBS sende ist der Port ja schon belegt, oder liege ich falsch??


                          Edit: muss mich korrigieren, telnetWait2 macht genau diese Funktion
                          Zuletzt geändert von benji; 30.08.2016, 09:57.

                          Kommentar


                            #43
                            Mit den telnet Funktionen wartest du halt immer auf einen bestimmt String oder auf den timeout. Wenn du also auf verschiedene String reagieren möchtest, dann funktioniert das nicht.

                            Du kannst in meinem socket Ansatz die Connection ($sock), die du fürs Lesen verwendest auch fürs Senden verwenden. Dann ist kein TelnetSend() nötig.

                            Z.B so:

                            PHP-Code:
                            if($buf=='hh@B')
                            {
                            setLogicLinkAusgang($id,2,1);
                            $result socket_write($sock,"hh");

                            Kommentar


                              #44
                              das wäre dann ja auch ein guter Ansatz, den die Variante von dir läuft sehr gut. Kannst du mir sagen wie ich die variable $buf außerhalb von der while schleife zugänglich mache???

                              hab es getestet mit global $buf getestet innerhalb der Schleife, dies klappt aber leider nicht.


                              und zweite Frage noch (oder die 27zigste)

                              ich wollte $myip automatisch erkennen lassen, dazu hab ich $myIP = $_SERVER["SERVER_ADDR"]; getestet. Wieso klappt dies bei Edomi nicht???

                              Gruß

                              Kommentar


                                #45
                                Zitat von benji Beitrag anzeigen
                                ich wollte $myip automatisch erkennen lassen, dazu hab ich $myIP = $_SERVER["SERVER_ADDR"]; getestet. Wieso klappt dies bei Edomi nicht???
                                Weil das nur klappt, wenn das Skript per Webserver gestartet wird:
                                http://php.net/manual/de/reserved.variables.server.php

                                Kommentar

                                Lädt...
                                X