Subversion Repositories HomeAutomation

Rev

Rev 2055 | Go to most recent revision | Blame | Last modification | View Log | SVN | RSS feed

  1. <?php
  2.  
  3. error_reporting(E_ALL);
  4.  
  5. function atomd_connect($host, $port)
  6. {
  7.   $socket = pfsockopen($host, $port, $errno, $errstr);
  8.  
  9.   if (!$socket)
  10.   {
  11.     throw new Exception("$errstr ($errno)");
  12.   }
  13.  
  14.   return $socket;
  15. }
  16.  
  17. function atomd_read_packet($socket)
  18. {
  19.   if (feof($socket))
  20.   {
  21.     throw new Exception("socket not open");
  22.   }
  23.  
  24.   $command = fread($socket, 4);
  25.  
  26.   if ($command === FALSE)
  27.   {
  28.     throw new Exception("got EOF while reading command from socket");
  29.   }
  30.  
  31.   $payload_length = fread($socket, 4);
  32.  
  33.   if ($payload_length === FALSE)
  34.   {
  35.     throw new Exception("got EOF while reading payload_length from socket");
  36.   }
  37.  
  38.   $payload = "";
  39.  
  40.   if ($payload_length > 0)
  41.   {
  42.     $payload = fread($socket, intval($payload_length));
  43.    
  44.     if ($payload === FALSE)
  45.     {
  46.       throw new Exception("got EOF while reading payload from socket");
  47.     }
  48.   }
  49.  
  50.   return $command . $payload_length . $payload;
  51. }
  52.  
  53. function atomd_write_packet($socket, $command, $payload)
  54. {
  55.   if (feof($socket))
  56.   {
  57.     throw new Exception("socket not open");
  58.   }
  59.  
  60.   $packet = $command . str_pad(strlen($payload) + 1, 4, "0", STR_PAD_LEFT) . $payload . "\0";
  61.  
  62.   if (fwrite($socket, $packet) === FALSE)
  63.   {
  64.      throw new Exception("got error while writing payload to socket");
  65.   }
  66. }
  67.  
  68. function atomd_data_available($socket)
  69. {
  70.   $read   = array($socket);
  71.   $write  = NULL;
  72.   $except = NULL;
  73.  
  74.   if (false === ($num_changed_streams = stream_select($read, $write, $except, 0)))
  75.   {
  76.     throw new Exception("could not do select on socket");
  77.   }
  78.  
  79.   return $num_changed_streams > 0;
  80.   /*
  81.  
  82.  
  83.   $position = ftell($socket);
  84.  
  85.   fseek($socket, -1, SEEK_END);
  86.  
  87.   $has_data = ftell($socket) > $position;
  88.  
  89.   fseek($socket, $position, SEEK_SET);
  90.  
  91.   return $has_data;*/
  92. }
  93.  
  94. /*
  95.  
  96. function atomd_data_available($socket)
  97. {
  98.   $position = ftell($socket);
  99.  
  100.   fseek($socket, -1, SEEK_END);
  101.  
  102.   $has_data = ftell($socket) > $position;
  103.  
  104.   fseek($socket, $position, SEEK_SET);
  105.  
  106.   return $has_data;
  107. }
  108. */
  109.  
  110. function atomd_initialize($host, $port)
  111. {
  112.   $socket = atomd_connect($host, $port);
  113.  
  114.   while (atomd_data_available($socket))
  115.   {
  116.     $packet = atomd_read_packet($socket); // Read initial prompt
  117.   }
  118.  
  119.   return $socket;
  120. }
  121.  
  122. function atomd_send_command($socket, $command)
  123. {
  124.   atomd_write_packet($socket, "RESP", $command);
  125. }
  126.  
  127.  
  128. function atomd_read_command_response($socket)
  129. {
  130.   $response = "";
  131.  
  132.   while (true)
  133.   {
  134.     $packet = atomd_read_packet($socket);
  135.    
  136.     if (substr($packet, 0, 4) != "TEXT")
  137.     {
  138.       break;
  139.     }
  140.    
  141.     $response .= substr($packet, 8) . "\n";
  142.   }
  143.  
  144.   return $response;
  145. }
  146.  
  147.  
  148. /*
  149. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  150.  
  151. if ($socket === false)
  152. {
  153.   die("Socket Creation Failed");
  154. }
  155.  
  156. $result = socket_connect($socket, "127.0.0.1", 1202);
  157.  
  158. if ($result === false)
  159. {
  160.   die("Connection Failed");
  161. }
  162.  
  163.  
  164. $command = "help";
  165. $length = strlen($command) + 1;
  166.  
  167. $data = "RESP" . str_pad($length, 4, "0", STR_PAD_LEFT) . $command . "\0\n";
  168.  
  169. echo "Sending:" . $data . "<br/>";
  170.  
  171. socket_write($socket, $data, strlen($data));
  172.  
  173. do
  174. {
  175.   $line = socket_read($socket, 1024, PHP_BINARY_READ);
  176.   $output .= $line;
  177. }
  178. while ($line != "");
  179.  
  180. echo $output . "<br/>";
  181. $output = "";
  182.  
  183. echo "Done first read!<br/>";
  184.  
  185. do
  186. {
  187.   $line = socket_read($socket, 1024, PHP_BINARY_READ);
  188.   $output .= $line;
  189. }
  190. while ($line != "");
  191.  
  192. echo $output . "<br/>";
  193. $output = "";
  194.  
  195. echo "Done!<br/>";
  196.  
  197. socket_close($socket);
  198. */
  199. ?>
  200.