Dobrý den všem,
Potřebuji malinko pomoc s TCP clientem v PHP.
Mám fotovoltaický měnič, který zasílá v 10s intervalech data po RS 232 ve formátu:
0000.00.00 12:36 3 126.5 1 126.5 231.2 0.2 124.8 25
U měniče mám převodník: Papouch gnome Rs232 na Ethernet.
Jelikož troch programuji v PHP a mám nainstalovaný web server, hledal jsem i v php možnost přijímat data a dále je používat.
Našel jsem a dal dohromady toto:
// Vložíme soubor s připojením k databázi a funkce
require_once '../php/db.php';
require_once '../php/function.php';
// vytvoříme socket
if(!($sock = socket_create(AF_INET, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Nelze vytvořit socket: [$errorcode] $errormsg <br />");
}
//echo "Socket vytvořen <br />";
//Navážeme spojení se vzdáleným servrem
if(!socket_connect($sock , '192.168.0.100' , 10001))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
socket_close($sock);
die("Nelze se připojit: [$errorcode] $errormsg <br />");
}
//echo "Spojení navázáno <br />";
//Poslat zprávu na serveru
$message = "GET / HTTP/1.1\r\n\r\n";
if( ! socket_send ( $sock , $message , strlen($message) , 0))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Nelze odeslat data: [$errorcode] $errormsg <br />");
}
//echo "Zpráva úspěšně odeslána <br />";
// smažeme tabulku data_ram
$del = mysql_query("DELETE FROM `data_ram` ");
if(!$del)
{
echo mysql_error() . " - " . mysql_errno();
}
// reset ID v data_ram
$resetID = mysql_query("ALTER TABLE `data_ram` AUTO_INCREMENT=1 ");
if(!$resetID)
{
echo 'resetID: '.mysql_error() . " - " . mysql_errno();
}
// načítáme data ze servru
while(true)
{
// počká se, až budou data kompletní - celý řádek
$x = 0;
while ( $out = socket_read($sock, 150, PHP_NORMAL_READ) )
{
if($out != "")
{
// nahradíme mezery
$intoS = str_replace(" ", ";", $out);
//rozložíme
$intoS = explode(";",$intoS);
$into = '';
$ii = count($intoS);
// odstraníme poslední položku v poli, je to zalomení řádků
$ii = $ii - 1;
for($n=0;$n<$ii;$n++)
{
if($intoS[$n] != '')
{
$into[] = $intoS[$n];
}
}
// kontrola, zda jsou data a jsou úplnná
if(isset($into[0]) AND $into[0] != '' AND isset($into[9]) AND $into[9] != '')
{
// vymaže se data_ram
$del = mysql_query("DELETE FROM `data_ram` ");
if(!$del)
{
echo mysql_error() . " - " . mysql_errno();
}
$resetID = mysql_query("ALTER TABLE `data_ram` AUTO_INCREMENT=1 ");
if(!$resetID)
{
echo 'resetID: '.mysql_error() . " - " . mysql_errno();
}
// nahradí se v 0-té položce
$z_into = str_replace(".", "-", $into[0]);
$z_into = datumSQL($z_into);
// zapíší se data
$INTO = mysql_query("INSERT INTO `data_ram` SET `znak`='".$z_into."',`doba`='".$into[1]."',`stav`='".$into[2]."',`napeti_fv`='".$into[3]."',`proud_fv`='".$into[4]."',`vykon`='".$into[5]."',`sit_napeti`='".$into[6]."',`sit_proud`='".$into[7]."',`nap_vykon`='".$into[8]."',`teplota`='".$into[9]."', `date`=NOW()");
if(!$INTO)
{
echo mysql_error() . " - " . mysql_errno();
}
// provede se vždy jen jeden řádek
if($x == 1)
{
break;
}
$x++;
}
}
}
} //konec načítání dat ze servru
Funguje to jak má, ale do doby, kdy zapadne sluníčko a měnič jde spát a přestane vysílat data. Sice program nic nepíše, ale ráno jakmile se měnič probudí a začne posílat data, tak program nic nezaznamená a je kouslý??
Můj odhad je, že u části: while ( $out = socket_read($sock, 150, PHP_NORMAL_READ) )
se při přerušení zasílání dat kousne a už se neprobudí.
Nemá někdo náhodou nápad jak toto ošetřit?