Ohne jetzt den Inhalt deines LBS zu kennen, im EXEX Teil, ind er Zeile 3, da hat es was ...
Ankündigung
Einklappen
Keine Ankündigung bisher.
Telenot LBS--jemand Lust
Einklappen
X
-
Selbst wenn ich die Zeile ändere kommt die Fehlermeldung.
Code:set_time_limit(0); //Script soll maximal 2 Sekunden laufen
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
-
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
-
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 auchEDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
Kommentar
-
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
-
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
-
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 FunktionZuletzt geändert von benji; 30.08.2016, 09:57.
Kommentar
-
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
-
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
-
Zitat von benji Beitrag anzeigenich wollte $myip automatisch erkennen lassen, dazu hab ich $myIP = $_SERVER["SERVER_ADDR"]; getestet. Wieso klappt dies bei Edomi nicht???
http://php.net/manual/de/reserved.variables.server.php
Kommentar
Kommentar