Страница 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');
}
Спасибо форумчане!