Написал класс по работе с TCP с контроллером.
class TcpGpio
{
private $service_port, $address;
private $template = "0x55 0xaa 0x00 %s 0x00 %s %s %s";
function __construct($ip, $port)
{
$this->service_port = $port;
$this->address = $ip;
}
static function prettyHex($str)
{
$str = trim($str);
// дробим строку по два символа
$out = chunk_split(bin2hex($str), 2, ' ');
// создаем массив из строки
$out = explode(' ', $out);
// добавляем к каждому элементу 0x
foreach ($out as $k => $v) {
if (!empty($v)) $out[$k] = '0x' . $out[$k];
}
// возвращаем схлопнутый в строку массив
return implode(" ", $out);
}
static function prettyBin($str)
{
//на всякий случай убираем пробелы
$str = trim($str);
//разбиваем на массив
$out = explode(' ', $str);
//убираем 0x
foreach ($out as $k => $v) {
if (!empty($v)) $out[$k] = str_replace(['0x', " "], "", $out[$k]);
}
//Собираем без пробелов
$out = implode("", $out);
//навад в бин
return hex2bin($out);
}
private function read($socket)
{
while ($buf = socket_read($socket, 1024, PHP_BINARY_READ)) {
if ($buf = trim($buf))
break;
}
return $buf;
}
private function prepare($params, $command)
{
if (is_array($params)) {
$length = count($params) + 2;
foreach ($params as &$p) {
$p = $this->toHex($p);
}
$params = implode(" ", $params);
} else {
$length = 3;
$params = $this->toHex($params);
}
$fullSum = $length + $params + $command;
$length = $this->toHex($length);
$fullSum = $this->toHex($fullSum);
$command = $this->toHex($command);
return $this->connect(sprintf($this->template, $length, $command, $params, $fullSum));
}
function connect($data)
{
/* Создаём TCP/IP сокет. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
return false;
//echo "Не удалось выполнить socket_create(): причина: " . socket_strerror(socket_last_error()) . "\n";
}
$result = socket_connect($socket, $this->address, $this->service_port);
if ($result === false) {
return false;
}
$auth = "admin";
socket_write($socket, $auth, strlen($auth));
$out = $this->read($socket);
echo "<h3>$out</h3>";
$in = self::prettyBin($data);
socket_write($socket, $in, strlen($in));
$out = $this->read($socket);
return $out;
}
function toHex($dec)
{
if ($dec < 10) {
return "0x0" . dechex($dec);
} else {
$hex = dechex($dec);
if (strlen($hex) < 2) {
$hex = "0" . $hex;
}
return "0x" . $hex;
}
}
function gpioOff($num)
{
return $this->prepare($num, 1);
}
function gpioOn($num)
{
return $this->prepare($num, 2);
}
function gpioInvert($num)
{
return $this->prepare($num, 3);
}
function gpioOffAll()
{
return $this->prepare(0, 4);
}
function gpioOnAll()
{
return $this->prepare(0, 5);
}
function gpioInvertAll()
{
return $this->prepare(0, 6);
}
function readAll()
{
return $this->prepare(0, 10);
}
function doCommand($nums, $command)
{
return $this->prepare($nums, $command);
}
}
$TCP = new TcpGpio("192.168.1.6", "8899");
$return = $TCP->gpioOn(1);
Документация. В работе когда контроллер выступал в роли клиента были свои недостатки. Решил сделать обратное. Контроллер сервер. В документации сказано что первым запросом нужно отослать "admin".
Notice: Local to control device, after build TCP connect, it need send passport +0x0D+0x0A, system respond OK or NO, that’s mean passport right or wrong, when passport is right, then it can go on work.
Однако у меня не выходит. Как лучше отправить?
Отправил "admin\r\n";, пришёл ок)
Если вдруг кому-то понадобится класс для работы с этим устройством. Держите.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Мне нужно научиться использовать многопоточность при добавлении или удалении значения в вектореЯ создала функцию CopyDataTo, чтобы вывести на экран,...