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

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Delphin
Сообщения: 23
Зарегистрирован: Сб сен 30, 2017 2:35 am
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение Delphin » Ср ноя 22, 2017 1:21 am

Такой вопрос на засыпку, таким образом отправляются данные в виде ASCI представления массива строки, а можно ли как то отправлять данные в виде 16-ричного массива данных (array HEX) ?
Delphin
Сообщения: 23
Зарегистрирован: Сб сен 30, 2017 2:35 am
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение Delphin » Ср ноя 22, 2017 2:01 am

Delphin писал(а):Такой вопрос на засыпку, таким образом отправляются данные в виде ASCI представления массива строки, а можно ли как то отправлять данные в виде 16-ричного массива данных (array HEX) ?
Update..
Решил таким способом:
$MSG = pack("N", 0xC0A801C8)
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение skysilver » Ср ноя 22, 2017 9:32 am

Delphin писал(а):Решил таким способом:$MSG = pack("N", 0xC0A801C8)
Я такие ф-ии использую:

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

echo bin2hex ('привет'); // строку в hex
echo hex2bin('d0bfd180d0b8d0b2d0b5d182'); // hex в строку  
За это сообщение автора skysilver поблагодарил:
Delphin (Ср ноя 22, 2017 3:22 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

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

Сообщение Lerych » Пн мар 18, 2019 8:20 pm

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 не хочет. Понимаю, что надо немного подругому организовать соединение, но опыта и знаний маловато. Помогите!
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

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

Сообщение Lerych » Пн мар 18, 2019 8:31 pm

Пробовал менять

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

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))){
не даёт соединения.
Какие варианты?
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

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

Сообщение Lerych » Вт мар 19, 2019 10:24 pm

Да-а уж, помощи не дождёшься!
Сделал в итоге такой скрипт "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');
 }
 
Спасибо форумчане!
Ответить