Hallo Leute,
ich stehe mal wieder vor einm Rätsel…
Folgender Aufbau eins Client Socket funktioniert auf einem Raspberry Pi problemlos, auf einem Windows-IPS hingegen ist das ganze so extrem träge, dass es bei hoher Belastung Fehler produziert:
private function CommandClientSocket(String $message, $ResponseLen = 16)
{
$Result = -999;
If (($this->ReadPropertyBoolean("Open") == true) AND ($this->GetParentStatus() == 102)) {
if (IPS_SemaphoreEnter("CommandClientSocket", 100))
{
// Socket erstellen
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
IPS_LogMessage("GeCoS_IO Socket", "Fehler beim Erstellen ".$errorcode." ".$errormsg);
$this->SendDebug("CommandClientSocket", "Fehler beim Erstellen ".$errorcode." ".$errormsg, 0);
IPS_SemaphoreLeave("CommandClientSocket");
return $Result;
}
// Timeout setzen
socket_set_option($sock,SOL_SOCKET, SO_RCVTIMEO, array("sec"=>2, "usec"=>0));
// Verbindung aufbauen
if(!(socket_connect($sock, $this->ReadPropertyString("IPAddress"), 8888))) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
IPS_LogMessage("GeCoS_IO Socket", "Fehler beim Verbindungsaufbaus ".$errorcode." ".$errormsg);
$this->SendDebug("CommandClientSocket", "Fehler beim Verbindungsaufbaus ".$errorcode." ".$errormsg, 0);
IPS_SemaphoreLeave("CommandClientSocket");
return $Result;
}
// Message senden
if(!socket_send($sock, $message, strlen($message), 0))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
IPS_LogMessage("GeCoS_IO Socket", "Fehler beim beim Senden ".$errorcode." ".$errormsg);
$this->SendDebug("CommandClientSocket", "Fehler beim Senden ".$errorcode." ".$errormsg, 0);
IPS_SemaphoreLeave("CommandClientSocket");
return $Result;
}
//Now receive reply from server
if(socket_recv ($sock, $buf, $ResponseLen, MSG_WAITALL ) === FALSE) {
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
IPS_LogMessage("GeCoS_IO Socket", "Fehler beim beim Empfangen ".$errorcode." ".$errormsg);
$this->SendDebug("CommandClientSocket", "Fehler beim Empfangen ".$errorcode." ".$errormsg, 0);
IPS_SemaphoreLeave("CommandClientSocket");
return $Result;
}
// Anfragen mit variabler Rückgabelänge
$CmdVarLen = array(56, 67, 70, 73, 75, 80, 88, 91, 92, 106, 109);
$MessageArray = unpack("L*", $buf);
$Command = $MessageArray[1];
If (in_array($Command, $CmdVarLen)) {
$Result = $this->ClientResponse($buf);
//IPS_LogMessage("IPS2GPIO ReceiveData", strlen($buf)." Zeichen");
}
// Standardantworten
elseIf ((strlen($buf) == 16) OR ((strlen($buf) / 16) == intval(strlen($buf) / 16))) {
$DataArray = str_split($buf, 16);
//IPS_LogMessage("IPS2GPIO ReceiveData", strlen($buf)." Zeichen");
for ($i = 0; $i < Count($DataArray); $i++) {
$Result = $this->ClientResponse($DataArray[$i]);
}
}
else {
IPS_LogMessage("GeCoS_IO ReceiveData", strlen($buf)." Zeichen - nicht differenzierbar!");
$this->SendDebug("CommandClientSocket", strlen($buf)." Zeichen - nicht differenzierbar!", 0);
}
if(!socket_shutdown($sock, 2))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
IPS_LogMessage("GeCoS_IO Socket", "Fehler beim beim Schliessen ".$errorcode." ".$errormsg);
$this->SendDebug("CommandClientSocket", "Fehler beim Schliessen ".$errorcode." ".$errormsg, 0);
}
socket_close($sock);
IPS_SemaphoreLeave("CommandClientSocket");
}
else {
$this->SendDebug("CommandClientSocket", "Semaphore Abbruch", 0);
}
}
return $Result;
}
Woran liegt es, dass es im Windows-IPS - ichunterstelle mal das der Rechner inder Regel schneller ist als ein Raspberry Pi 3 - für den Client Socket Aufbau so viel länger benötigt??
Joachim