Wenn dies dein erster Besuch hier ist, lies bitte zuerst die Hilfe - Häufig gestellte Fragen durch. Du musst dich vermutlich registrieren, bevor du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um den Registrierungsprozess zu starten. Du kannst auch jetzt schon Beiträge lesen. Suche dir einfach das Forum aus, das dich am meisten interessiert.
Du definierst die Funktion, aber rufst sie nicht auf.
Wenn du vor deinem setLogicLinkAusgang() ein
PHP-Code:
$con = telnetOpen($ip,$port, $timeout);
machst, dann rufst du sie auch auf.
Aber nicht vergessen vorher auch $timeout zu definieren.
EDIT: Du solltest besser alles posten, was du programmiert hast, dann wird es klarer. LBS und EXEC kennen sich nicht und laufen völlig unabhängig. Variablen aus dem LBS Teil sind im EXEC Teil nicht bekannt.
$con ist halt eine Resource und keine String. Es ist eine connection. Du musst danach irgendwie die Daten aus dieser connection auslesen. z.B. mit den telnetWait funktionen, die Christian erwähnt hat. Oder wie gesagt, nimm die while Schleife aus meinem Wetterstation LBS, da ist alles schon fertig drin, denn so scheint das ein steiniger Weg zu werden.
ich bekomme die Daten jetzt in EDOMI, allerdings in ascii. Jetzt wollte ich mit einer Funktion ascii2hex alles umwandeln. Allerdings kommt dabei nicht das richtige raus. Diese function sollte doch passen oder?? Hier der Code.
Code:
<?php
function ascii2hex($ascii) {
$hex = '';
for ($i = 0; $i < strlen($ascii); $i++) {
$byte = strtoupper(dechex(ord($ascii{$i})));
$byte = str_repeat('0', 2 - strlen($byte)).$byte;
$hex.=$byte." ";
}
return $hex;
}
// configuration
$myIP = '192.168.84.200'; // IP wo dieses Skript gestartet wird
$ip = '192.168.84.118'; // IP wo ser2net läuft
$port = 4002; // Port auf dem ser2net lauscht
// connection
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$bind = socket_bind($sock,$myip );
socket_connect($sock, $ip, $port);
socket_set_nonblock($sock);
socket_set_option($sock,SOL_SOCKET,SO_KEEPALIVE,1);
// read loop
while (1)
{
$buf = socket_read($sock,2048); // read data from socket
if ($buf!='')
{
echo ascii2hex('$buf');
}
usleep(100000);
}
?>
Ich wollte jetzt telnet Funktion von Edomi nutzen um zu senden. Habe den Code umgeschrieben, leider sendet er aber nichts.... hab ich noch irgendwo ein Fehler bzgl dem $con Handle???
Der vergleich vor dem telnetSend wird mit "1" auf Ausgang 2 getiggert.
Code:
###[LBS]###
<?
function LB_LBSID($id) {
$E=getLogicEingangDataAll($id);
$ip = $E[2]['value'];
if (getLogicElementVar($id,1)!=1) {
setLogicElementVar($id,1,1);
if ($E=getLogicEingangDataAll($id))
if (!filter_var($ip, FILTER_VALIDATE_IP) === false)
callLogicFunctionExec(LBSID,$id);
} else setLogicLinkAusgang($id,1,1);
}
?>
###[/LBS]###
###[EXEC]###
<?
require(dirname(__FILE__)."/../../../../main/include/php/incl_lbsexec.php");
set_time_limit(0); //Script soll maximal 2 Sekunden laufen
sql_connect();
function ascii2hex($ascii) {
$hex = '';
for ($i = 0; $i < strlen($ascii); $i++) {
$byte = strtoupper(dechex(ord($ascii{$i})));
$byte = str_repeat('0', 2 - strlen($byte)).$byte;
$hex.=$byte." ";
}
return $hex;
}
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");
}
$E=getLogicEingangDataAll($id);
$ip = $E[2]['value'];
$port = $E[3]['value'];
$myip = $E[4]['value'];
$timeout = '30';
$n = 'hh';
// connection
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$bind = socket_bind($sock,$myip );
socket_connect($sock, $ip, $port);
socket_set_nonblock($sock);
socket_set_option($sock,SOL_SOCKET,SO_KEEPALIVE,1);
// read loop
while (1)
{
$buf = socket_read($sock,2048); // read data from socket
if ($buf!='')
{
setLogicLinkAusgang($id,1,ascii2hex($buf));
}
if($buf=='hh@B')
{
setLogicLinkAusgang($id,2,1);
$con= telnetOpen($ip,$port,$timeout);
telnetSend($con,$n);
}
usleep(100000);
}
sql_disconnect();
?>
###[/EXEC]###
Im LBS-Teil ist zwei mal:
$E=getLogicEingangDataAll($id)
Beim ersten ist das ; zuviel stattdessen fehlt ein { am Ende und ein if davor ..
Und ein paar fehlende } im am ende ..
Den EXEC habe ich nicht angeschaut ...
Zuletzt geändert von coliflower; 26.08.2016, 19:49.
Ich würde Dir für den Anfang empfehlen, Dein Script erstmal eigenständig zu entwickeln und zu testen - also nicht als LBS, sondern unabhängig von EDOMI. Einfach irgendwo die PHP-Datei speichern und mit "php <Dateiname>" ausführen...
EDOMI - Intelligente Steuerung und Visualisierung KNX-basierter Elektro-Installationen (http://www.edomi.de)
LBS Teil korrigiert. Ich hab das Skript schon so ohne edomi getestet. Wollte ja die Telnet function von edomi nutzen. Ich hatte vergessen diese in den Exec Teil zu inkludieren. telnet_inc.php ist ja standardmäßig nicht im EXEC
Wir verarbeiten personenbezogene Daten über die Nutzer unserer Website mithilfe von Cookies und anderen Technologien, um unsere Dienste bereitzustellen. Weitere Informationen findest Du in unserer Datenschutzerklärung.
Indem Du unten auf "ICH stimme zu" klickst, stimmst Du unserer Datenschutzerklärung und unseren persönlichen Datenverarbeitungs- und Cookie-Praktiken zu, wie darin beschrieben. Du erkennst außerdem an, dass dieses Forum möglicherweise außerhalb Deines Landes gehostet wird und bist damit einverstanden, dass Deine Daten in dem Land, in dem dieses Forum gehostet wird, gesammelt, gespeichert und verarbeitet werden.
Kommentar