Страница 2 из 2

Re: Массовое обновление свойств обьектов

Добавлено: Ср ноя 22, 2017 1:21 am
Delphin
Такой вопрос на засыпку, таким образом отправляются данные в виде ASCI представления массива строки, а можно ли как то отправлять данные в виде 16-ричного массива данных (array HEX) ?

Re: Массовое обновление свойств обьектов

Добавлено: Ср ноя 22, 2017 2:01 am
Delphin
Delphin писал(а):Такой вопрос на засыпку, таким образом отправляются данные в виде ASCI представления массива строки, а можно ли как то отправлять данные в виде 16-ричного массива данных (array HEX) ?
Update..
Решил таким способом:
$MSG = pack("N", 0xC0A801C8)

Re: Массовое обновление свойств обьектов

Добавлено: Ср ноя 22, 2017 9:32 am
skysilver
Delphin писал(а):Решил таким способом:$MSG = pack("N", 0xC0A801C8)
Я такие ф-ии использую:

Код: Выделить всё

echo bin2hex ('привет'); // строку в hex
echo hex2bin('d0bfd180d0b8d0b2d0b5d182'); // hex в строку  

Re: Массовое обновление свойств обьектов

Добавлено: Пн мар 18, 2019 8:20 pm
Lerych
skysilver писал(а):
Пн ноя 20, 2017 11:53 am
Delphin писал(а):Т.е. мне нужно сделать коннект по этому сокету, отправку данных, и отключение от сокета.
У udp-протокола нет необходимости устанавливать соединение в отличие от tcp.

Попробуй такой код:

Код: Выделить всё

$ip = '192.168.1.45';
$port = '6000';
$timeout = 5;

$sock = NULL;

if (!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))) {
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("Ошибка создания сокета - [socket_create()] [$errorcode] $errormsg \n");
} else { 
    echo 'Сокет успешно создан' . PHP_EOL; 
}
        
if (!socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec" => $timeout, "usec" => 0))) {
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    echo "Ошибка установки параметра SO_RCVTIMEO сокета - [socket_create()] [$errorcode] $errormsg" . PHP_EOL;
} else {
    echo 'Параметр SO_RCVTIMEO сокета успешно задан' . PHP_EOL; 
}

$msg = 'pt1=off';
        
if(!($bytes = socket_sendto($sock, $msg, strlen($msg), 0, $ip, $port))) {
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    echo "Не удалось отправить данные в сокет [$errorcode] $errormsg" . PHP_EOL;
} else { 
    echo " >>>>> Отправлено в сокет $bytes байт" . PHP_EOL; 
}
А как тоже самое сделать для TCP протокола? Надо передавать строку на сервер в виде: 01011
Строка формируется из статусов устройств, с этим разобрался, всё работает. Код выше тоже работает, если сервер принимает UDP, но по TCP не хочет. Понимаю, что надо немного подругому организовать соединение, но опыта и знаний маловато. Помогите!

Re: Массовое обновление свойств обьектов

Добавлено: Пн мар 18, 2019 8:31 pm
Lerych
Пробовал менять

Код: Выделить всё

if (!($sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP))) {
на

Код: Выделить всё

if (!($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
и строку

Код: Выделить всё

if(!($bytes = socket_sendto($sock, $msg, strlen($msg), 0, $ip, $port))) {
на

Код: Выделить всё

if(!($bytes = socket_sendto($sock, $msg, strlen($msg), 0, $ip, $port))){
не даёт соединения.
Какие варианты?

Re: Массовое обновление свойств обьектов

Добавлено: Вт мар 19, 2019 10:24 pm
Lerych
Да-а уж, помощи не дождёшься!
Сделал в итоге такой скрипт "sendTCP":

Код: Выделить всё

header('Content-Type: text/plain;'); //Мы будем выводить простой текст
  set_time_limit(0); //Скрипт должен работать постоянно
  ob_implicit_flush(); //Все echo должны сразу же выводиться
  $address = '192.168.0.108'; //Адрес работы сервера
  $port = 1985; //Порт работы сервера (лучше какой-нибудь редкоиспользуемый)
  if (($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
    //AF_INET - семейство протоколов
    //SOCK_STREAM - тип сокета
    //SOL_TCP - протокол
    echo "Ошибка создания сокета";
  }
  else {
    echo "Сокет создан\n";
  }
  $result = socket_connect($socket, $address, $port);
  if ($result === false) {
    echo "Ошибка при подключении к сокету";
  } else {
    echo "Подключение к сокету прошло успешно\n";
  }
//  $out = socket_read($socket, 1024); //Читаем сообщение от сервера
  echo "Сообщение от сервера: $out.\n";
  $relay1 = gg('Switch1.status');
  $relay2 = gg('Switch2.status');
  $relay3 = gg('Switch3.status');
  $msg = 'send_'.$relay1.$relay2.$relay3;

  echo "Сообщение серверу: $msg\n";
  socket_write($socket, $msg, strlen($msg)); //Отправляем серверу сообщение
//  $out = socket_read($socket, 1024); //Читаем сообщение от сервера
//  echo "Сообщение от сервера: $out.\n"; //Выводим сообщение от сервера
//  $msg = 'exit'; //Команда отключения
//  echo "Сообщение серверу: $msg\n";
//  socket_write($socket, $msg, strlen($msg));
//  echo "Соединение завершено\n";
  //Останавливаем работу с сокетом
  if (isset($socket)) {
    socket_close($socket);
    echo "Сокет успешно закрыт";
  }
  
Прицепил его к методу statusUpdated на Switch1,Switch2,Switch3 и теперь в другой программе по TCP протоколу получаю строку, типа: send_000,send_010,send_111 и т.п.
Также скрипт запускаю в ClockChime.onNewMinute.
Для этого в нём добавил:

Код: Выделить всё

$s=date('s',time());
if ($s=="00") {
   runScript('1socket_create');
 }
 
Спасибо форумчане!