Probleme beim lesen/schreiben mit fsockopen
Einklappen
X
-
@Chr_PHP_04 Das Forum bietet dir die Möglichkeit, mehrere Beiträge zu zitieren. Das ist schöner, als auf mehrere Posts verteilt zu antworten. Versuchs das nächste mal bitte.
-
Hi,
ja, das denke ich jetzt auch. Ich hatte erst auf der CCU PHP installiert. Und da traten halt die Probleme des einfrierrens auf. Deshalb habe ich dann PHP vom Windowsrechner aus benutzt. Aber auch hier passiert das selbe. Die CCU friert ein.Zitat von Slava Beitrag anzeigenAlso ich glaube, das es mit php nichts zutun hat.
Du sagst doch, dass du CCU neustarten muss und nicht der Rechner, der Request sendet.
Ich hoffe, werde gleich mal im entsprechenden Forum nachfragen. Bei ELV oder eQ3 frage ich inzwischen nicht mehr nach. Die Arbeit kann man sich sparen. Auf E-Mails reagieren die nicht. Anrufen bringt leider nichts, da die Mitarbeiter bei so speziellen Fragen keine Antwort parat haben.Zitat von Slava Beitrag anzeigenGibt es eine möglichkeit fehler-protocol von Homematic anzuschauen?
Aber ich denke so langsam komme ich dem Problem näher. Ich denke, die Geräte müssen auch nicht immer nacheinander abgefragt werden. Wenn ich 30 Stati abfrage, dann wird ja 30 mal tclrega.exe gestartet. Das das bei der leistungsschwachen CCU zu Problemen führt ist eigentlich klar. Wahrscheinlich kann ich aber auch ein Skript starten dass dann einmal tclrega startet und alle erforderlichen Daten liefert.
Ciao, Chr.
Einen Kommentar schreiben:
-
Hi,
kannst Du mir sagen, wie der aussehen könnte?Zitat von combie Beitrag anzeigenDeine Header sind nicht HTTP 1.1 konform. Es wird mindestens noch ein Host Header erwartet.
Würde ich gerne, wenn ich die leiseste Ahnung hätte, was in der Funktion Post_Request genau passiert. Leider hat php.info im Moment Probleme, so dass ich nur an wenige und dann auch nur englische Informationen komme.Zitat von combie Beitrag anzeigenWarum verwendest du nicht cURL, Snoopy oder irgendwas anderes vorgefertigtes?
Ich habe mir die Funktion noch mal genau angeschaut. So wie ich das jetzt verstehe wird durch fsockopen das Programm tclrega.exe gestartet. Danach wird dann die Ausgabe des Programms ausgelesen.
Jetzt verstehe ich auch was mkb_webprint meinte. Was mir jetzt noch nicht klar ist, wie ich per cURL an die Daten kommen soll. Ich dachte, damit kann man nur normale Webseiten öffnen, aber Programme starten? Ich werde mir gleich mal die Anleitung zu cURL anschauen.
Eben, genau deshalb benutze ich die Funktion. Ich habe einen PHP-Server auf der CCU installiert. Bei dem Server waren auch einige Beispielseiten. In diesen Beispielseiten wurde auf die einzelnen Geräte über die Funktion Post_Request zugegriffen. Da es damit funktionierte (mehr oder weniger) habe ich die Funktion einfach übernommen.Zitat von combie Beitrag anzeigenDas Rad wird auch nicht runder davon, wenn man es dauernd neu erfindet.
Ciao, Chr.
Einen Kommentar schreiben:
-
Also ich glaube, das es mit php nichts zutun hat.
Du sagst doch, dass du CCU neustarten muss und nicht der Rechner, der Request sendet.
Gibt es eine möglichkeit fehler-protocol von Homematic anzuschauen?
Frage das bitte in jedem fall bei:
ELV Elektronik AG, 26787 Leer
Telefon: 0491/6008-245
Fax: 0491/6008-457
E-Mail: technik@elv.de
Einen Kommentar schreiben:
-
Deine Header sind nicht HTTP 1.1 konform. Es wird mindestens noch ein Host Header erwartet. Warum verwendest du nicht cURL, Snoopy oder irgendwas anderes vorgefertigtes?
Das Rad wird auch nicht runder davon, wenn man es dauernd neu erfindet.
Einen Kommentar schreiben:
-
Hi,
tclrega.exe kenne ich leider nicht. Ich weiß wohl, dass ich auf der CCU auch tcl-Skripte ausführen lassen kann.
Allerdings ergibt sich hier ein neues Problem. Im Code hatte ich zwar 127.0.0.1 angegeben, aber in wirklichkeit liegt der PHP-Server auf einem anderen Rechner. PHP greift über die korrekte IP-Adresse auf die CCU zu. Ein tcl-Skript kann ich so aber nicht auf der CCU starten.
Übrigens die CCU ist ein normaler Linuxrechner, nur halt besonders leistungsschwach. Deshalb läuft der PHP-Server auch auf einem anderen Rechner.
Ich habe jetzt erst mal folgenden Code eingefügt, wenn fsockopen korrekt geklappt hat.
Dann habe ich nochmal ein usleep(300) zwischen lesen und schreiben eingebaut.PHP-Code:stream_set_blocking ( $fp , 1 );
usleep(300);
Ob es was bringt weiss ich nicht. Das wird gerade getestet. Eigentlich sollte nach dem öffnen der Stream im Blocking Mode arbeiten.
So ganz verstehe ich stream_set_blocking aber auch nicht. Oder muss der Blocking Mode besser abgeschaltet werden?
Oder kann ich mit stream_select() den Fehler abfangen, dass die Daten einfach nicht ankommen wollen?
Ciao, Chr
Einen Kommentar schreiben:
-
Guten Morgen,
ich kenne mich mit HM CCU jetzt nicht aus, aber kannst du die Daten die du brauchst nicht auch über die CMD an die tclrega.exe weitergeben, als Parameter a lá cmd> tclrega.exe -data1=bla -data2=blubblub ?
Wenn ja kannst du es ja z.B. mit der PHP-Funktion PHP: exec - Manual probieren, oder den anderen Funktionen die PHP zum Starten von Programmen anbietet. Dann musste keinen Socket aufmachen.
Gruß
Björn
Einen Kommentar schreiben:
-
Probleme beim lesen/schreiben mit fsockopen
Hi,
ich habe ein Problem beim lesen oder schreiben (ich weiß nicht genau wobei der Fehler auftritt) von Daten.
Ich benutze einen kleinen Linux Rechner für die Heimautomation (HM CCU). Von außen übergebe ich die notwendigen Daten an den Rechner mit folgendem Code:
Das klappt auch wunderbar. Aber nach einiger Zeit (das können 1 h oder auch 2 Tage sein) reagiert die CCU nicht mehr. Ich kann dann nichts mehr machen und muss den Resetknopf drücken.PHP-Code:function Post_Request ($sdata)
{
$fp = fsockopen ("127.0.0.1", 8181, $errno, $errstr, 30);
if (!$fp)
echo "$errstr ($errno)<br />\n";
else
{
$st = "POST /tclrega.exe HTTP/1.1\r\n";
$st = $st . "Content-type: application/x-www-form-urlencoded\r\n";
$st = $st . "Connection: Close\r\n";
$st = $st . "Content-length: ". strlen($sdata) ."\r\n\r\n";
fputs($fp,$st.$sdata);
$st = "";
$t = fgets($fp,500);
$st = $st . $t . "\r\n";
while ($t != "\r\n")
{
$t = fgets($fp,500);
}
$t = "";
while (!feof($fp))
{
$t .= fgets($fp,10000);
}
fclose($fp);
}
$xml = new SimpleXMLElement($t);
return $xml->result;
}
Ich muss dazu sagen, dieses Script wird regelmäßig von fünf Rechnern, die jeweils als Fernbedienung dienen aufgerufen.
Ich vermute dass hier der Fehler zu finden ist, dass einfach zu viele Verbindungen bestehen.
Wie kann ich das verhindern? Ich suche nach einer Möglichkeit, das dieses Script korrekt abbricht und die Resourcen wieder freigibt, wenn gerade kein Zugriff möglich ist, damit spätere Zugriffe wieder korrekt funktionieren und die CCU nicht mehr einfriert.
Ciao, Chr.
Einen Kommentar schreiben: