diff options
Diffstat (limited to 'localwebsite/classes/InverterdClient.php')
-rw-r--r-- | localwebsite/classes/InverterdClient.php | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/localwebsite/classes/InverterdClient.php b/localwebsite/classes/InverterdClient.php new file mode 100644 index 0000000..b68b784 --- /dev/null +++ b/localwebsite/classes/InverterdClient.php @@ -0,0 +1,69 @@ +<?php + +class InverterdClient extends MySimpleSocketClient { + + /** + * @throws Exception + */ + public function setProtocol(int $v): string + { + $this->send("v $v"); + return $this->recv(); + } + + /** + * @throws Exception + */ + public function setFormat(string $fmt): string + { + $this->send("format $fmt"); + return $this->recv(); + } + + /** + * @throws Exception + */ + public function exec(string $command, array $arguments = []): string + { + $buf = "exec $command"; + if (!empty($arguments)) { + foreach ($arguments as $arg) + $buf .= " $arg"; + } + $this->send($buf); + return $this->recv(); + } + + /** + * @throws Exception + */ + public function recv() + { + $recv_buf = ''; + $buf = ''; + + while (true) { + $result = socket_recv($this->sock, $recv_buf, 1024, 0); + if ($result === false) + throw new Exception(__METHOD__ . ": socket_recv() failed: " . $this->getSocketError()); + + // peer disconnected + if ($result === 0) + break; + + $buf .= $recv_buf; + if (endsWith($buf, "\r\n\r\n")) + break; + } + + $response = explode("\r\n", $buf); + $status = array_shift($response); + if (!in_array($status, ['ok', 'err'])) + throw new Exception(__METHOD__.': unexpected status ('.$status.')'); + if ($status == 'err') + throw new Exception(empty($response) ? 'unknown inverterd error' : $response[0]); + + return trim(implode("\r\n", $response)); + } + +}
\ No newline at end of file |