Subversion Repositories HomeAutomation

Rev

Blame | Last modification | View Log | SVN | RSS feed

<?php

error_reporting(E_ALL);

function atomd_connect($host, $port)
{
  $socket = pfsockopen($host, $port, $errno, $errstr); 

  if (!$socket)
  { 
    throw new Exception("$errstr ($errno)"); 
  }
  
  return $socket;
}

function atomd_read_packet($socket)
{
  if (feof($socket))
  {
    throw new Exception("socket not open"); 
  }
  
  $command = fread($socket, 4);
  
  if ($command === FALSE)
  {
    throw new Exception("got EOF while reading command from socket"); 
  }
  
  $payload_length = fread($socket, 4);
  
  if ($payload_length === FALSE)
  {
    throw new Exception("got EOF while reading payload_length from socket"); 
  }
  
  $payload = "";
  
  if ($payload_length > 0)
  {
    $payload = fread($socket, intval($payload_length)-1);
    
    if ($payload === FALSE)
    {
      throw new Exception("got EOF while reading payload from socket"); 
    }
  }
  
  return $command . str_pad(strlen($payload)-1, 4, "0", STR_PAD_LEFT) . $payload;
}

function atomd_write_packet($socket, $command, $payload)
{
  if (feof($socket))
  {
    throw new Exception("socket not open"); 
  }
  
  $packet = $command . str_pad(strlen($payload), 4, "0", STR_PAD_LEFT) . $payload;
  
  if (fwrite($socket, $packet) === FALSE)
  {
     throw new Exception("got error while writing payload to socket"); 
  }
}

function atomd_data_available($socket)
{
  $read   = array($socket);
  $write  = NULL;
  $except = NULL;
  
  if (false === ($num_changed_streams = stream_select($read, $write, $except, 0)))
  {
    throw new Exception("could not do select on socket");
  }

  return $num_changed_streams > 0;
  /*


  $position = ftell($socket);
  
  fseek($socket, -1, SEEK_END);

  $has_data = ftell($socket) > $position;
  
  fseek($socket, $position, SEEK_SET);
  
  return $has_data;*/
}

/*

function atomd_data_available($socket)
{
  $position = ftell($socket);
  
  fseek($socket, -1, SEEK_END);

  $has_data = ftell($socket) > $position;
  
  fseek($socket, $position, SEEK_SET);
  
  return $has_data;
}
*/

function atomd_initialize($host, $port)
{
  $socket = atomd_connect($host, $port);

  while (atomd_data_available($socket))
  {
    $packet = atomd_read_packet($socket); // Read initial prompt
  }
  
  return $socket;
}

function atomd_send_command($socket, $command)
{
  atomd_write_packet($socket, "RESP", $command);
}


function atomd_read_command_response($socket)
{
  $response = "";
  
  while (true)
  {
    $packet = atomd_read_packet($socket);
    
    if (substr($packet, 0, 4) != "TEXT")
    {
      break;
    }
    
    $response .= substr($packet, 8) . "\n";
  }
  
  return $response;
}


/*
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

if ($socket === false)
{
  die("Socket Creation Failed");
}

$result = socket_connect($socket, "127.0.0.1", 1202);

if ($result === false)
{
  die("Connection Failed");
}


$command = "help";
$length = strlen($command) + 1;

$data = "RESP" . str_pad($length, 4, "0", STR_PAD_LEFT) . $command . "\0\n";

echo "Sending:" . $data . "<br/>";

socket_write($socket, $data, strlen($data));

do
{
  $line = socket_read($socket, 1024, PHP_BINARY_READ);
  $output .= $line;
}
while ($line != "");

echo $output . "<br/>";
$output = "";

echo "Done first read!<br/>";

do
{
  $line = socket_read($socket, 1024, PHP_BINARY_READ);
  $output .= $line;
}
while ($line != "");

echo $output . "<br/>";
$output = "";

echo "Done!<br/>";

socket_close($socket);
*/
?>