Авторизация по TCP с USR-R16

174
31 января 2018, 14:48

Написал класс по работе с 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.

Однако у меня не выходит. Как лучше отправить?

Answer 1

Отправил "admin\r\n";, пришёл ок)

Если вдруг кому-то понадобится класс для работы с этим устройством. Держите.

READ ALSO
Насколько безопасна выборка из базы?

Насколько безопасна выборка из базы?

В коде движка нашел подобный код (и не в одном месте)

163
Вывести на экран вектор с диапазоном (многопоточность)

Вывести на экран вектор с диапазоном (многопоточность)

Мне нужно научиться использовать многопоточность при добавлении или удалении значения в вектореЯ создала функцию CopyDataTo, чтобы вывести на экран,...

241
чтение из файла txt

чтение из файла txt

Добрый вечер,

262