Прослушивание TCP/IP

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Прослушивание TCP/IP

Сообщение Lerych » Вс дек 02, 2018 11:47 pm

fandaymon писал(а):
Вс дек 02, 2018 11:27 pm
Lerych писал(а):
Вс дек 02, 2018 11:01 pm
Мужики помогите с кодом!
Имеем такой код:

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

// Получаем все каналы из БД
                $channels = SQLSelect("SELECT * FROM Channels WHERE DEVICE_ID=($i + 1)");
                $cnt = count($channels);
                for($j = 0; $j < $cnt; $j++) 
                {
                    $chan = $channels[$j];
                    if($chan['LINKED_OBJECT']!='' && $chan['LINKED_PROPERTY']!='') 
                    {
                        if(preg_match('\'^GET\\([0-9]{1,}\\)$\'', $chan['VALUE']))
                        {
                            preg_match('\'[0-9]{1,}\'', $chan['VALUE'], $val);
                            $pos = strpos($read_buf, $chan['TITLE']);
                            if(!($pos === false))
                            {                               
				$code = substr($read_buf,5,20);
				setGlobal($chan['LINKED_OBJECT'].'.'.$chan['LINKED_PROPERTY'], $code);
                            }
                        }
т.е. записываем в свойства объекта вырезанную часть строки из буфера. В коде выше вырезаем из буфера с 5-ой позиции, 20-ть символов. Но эти переменные могут быть различными.
Надо вместо 5 подставлять $chan['TITLE'], а вместо 20: $read_buf-$chan['TITLE'].
Помогите с синтаксисом этого действия.
Я правильно понимаю, что железка присылает cn0_true или cn199_false в зависимости от того, какой контакт замкнут/разомкнут?
Если да, то зачем всё это городить, когда можно просто разбить пришедшее командой $plc=explode('_',$read_buff)

И без всяких таблиц просто занести свойство нужному объекту

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

$obj_name=$plc[0]; // При условии что объекты будут называться cn0, если нужно как-то по другому, то просто добавить нужное
if ($plc[1]=='true')  {
 sg( $obj_name. '.status',1);
} else {
 sg($obj_name . '.status',0);
}
Ну конечно перед этим проверить есть ли такой объект, а если нет, то создать

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

$obj=getObject($obj_name);
if ($obj==0) {
 addClassObject('PLC', $obj_name); //Вместо PLC тут указать свой класс объектов
}
 
Выше писал, что железка может все контакты присылать одной строкой, типа ALL000101100...111 (128 контактов).
Вот и хочу переделать, чтобы разбирать их одним действием.
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Прослушивание TCP/IP

Сообщение Lerych » Пн дек 03, 2018 12:31 am

Lerych писал(а):
Вс дек 02, 2018 11:01 pm
Мужики помогите с кодом!
Имеем такой код:

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

// Получаем все каналы из БД
                $channels = SQLSelect("SELECT * FROM Channels WHERE DEVICE_ID=($i + 1)");
                $cnt = count($channels);
                for($j = 0; $j < $cnt; $j++) 
                {
                    $chan = $channels[$j];
                    if($chan['LINKED_OBJECT']!='' && $chan['LINKED_PROPERTY']!='') 
                    {
                        if(preg_match('\'^GET\\([0-9]{1,}\\)$\'', $chan['VALUE']))
                        {
                            preg_match('\'[0-9]{1,}\'', $chan['VALUE'], $val);
                            $pos = strpos($read_buf, $chan['TITLE']);
                            if(!($pos === false))
                            {                               
				$code = substr($read_buf,5,20);
				setGlobal($chan['LINKED_OBJECT'].'.'.$chan['LINKED_PROPERTY'], $code);
                            }
                        }
т.е. записываем в свойства объекта вырезанную часть строки из буфера. В коде выше вырезаем из буфера с 5-ой позиции, 20-ть символов. Но эти переменные могут быть различными.
Надо вместо 5 подставлять $chan['TITLE'], а вместо 20: $read_buf-$chan['TITLE'].
Помогите с синтаксисом этого действия.
Решил так (добавляем две строки):

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

$str_command = strlen($chan['TITLE']);
$str_code = strlen($read_buf)-strlen($chan['TITLE']);
$code = substr($read_buf,$str_command,$str_code);
setGlobal($chan['LINKED_OBJECT'].'.'.$chan['LINKED_PROPERTY'], $code);
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Прослушивание TCP/IP

Сообщение fandaymon » Пн дек 03, 2018 12:37 am

Строчку тоже можно

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

for ($i=0;$i<strlen($read_buff);$i++) {
 sg('cn' . $i . '.status')=$read_buff[$i]);
}
Но так будет большая нагрузка на mysql
За это сообщение автора fandaymon поблагодарил:
Lerych (Пн дек 03, 2018 12:44 am)
Рейтинг: 1.16%
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Прослушивание TCP/IP

Сообщение Lerych » Пн дек 03, 2018 12:46 am

А можно потом в скрипте разбирать с помощью var_dump?
var_dump(str_split($code, 1));
Или где лучше вообще разбор организовать, чтобы нагрузку и быстродействие не замедлить?
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Прослушивание TCP/IP

Сообщение Lerych » Пн дек 03, 2018 12:49 am

fandaymon писал(а):
Пн дек 03, 2018 12:37 am
Но так будет большая нагрузка на mysql
А ББ на Linux c 4Gb ОЗУ это будет заметно?
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Прослушивание TCP/IP

Сообщение fandaymon » Пн дек 03, 2018 1:42 am

Lerych писал(а):
Пн дек 03, 2018 12:46 am
А можно потом в скрипте разбирать с помощью var_dump?
var_dump(str_split($code, 1));
Или где лучше вообще разбор организовать, чтобы нагрузку и быстродействие не замедлить?
А при чём тут var_dump?
Где разбирать мне кажется без разницы, но если делать приём инфы в одну строчку, то я бы делал класс, у которого есть свойство status, в котором хранится строчка с status1 ... status100 и метод, который при изменении status раскидывал бы 1 и 0 по остальным статусам.

Что-то типа

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

for ($i=0;$i<strlen($this->status);$i++) {
 $this->SetProperty('status' . $i,$this->status[$i]);
}
Потом создал бы объект с этим классом, а потом в цикле просто присваивал бы этому объекту свойство status
В этом же объекте можно хранить ip и т.д.

Почему нагрузка вырастет, потому что вместо одного свойства придётся каждый раз обновлять 100 - количество операций с базой сразу возрастает на 2 порядка... Заметно или нет не знаю - зависит от того, как эту заметность мерить...
За это сообщение автора fandaymon поблагодарил:
Lerych (Пн дек 03, 2018 7:53 am)
Рейтинг: 1.16%
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Прослушивание TCP/IP

Сообщение Lerych » Пн дек 03, 2018 7:56 am

var_dump производит разбор строки на массив.
Чтобы не перебирать каждый раз всю строку, хочу сперва сравнивать пришедшее с предыдущим сообщением, и если новые данные - раскидывать.
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Прослушивание TCP/IP

Сообщение fandaymon » Пн дек 03, 2018 12:15 pm

Lerych писал(а):
Пн дек 03, 2018 7:56 am
var_dump производит разбор строки на массив.
Чтобы не перебирать каждый раз всю строку, хочу сперва сравнивать пришедшее с предыдущим сообщением, и если новые данные - раскидывать.
var_dump выводит информацию о переменной
А в PHP к строке можно без всяких дополнительных операций обращаться как к массиву символов

Сравнивать можно в том же самом методе, отрабатывающем на изменение статуса - там будет работать $params['OLD_VALUE'] и $params['NEW_VALUE']

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

for ($i=0;$i<strlen($this->status);$i++) {
 if ($params['OLD_VALUE'][$i]!=$params['NEW_VALUE'][$i]) {
  $this->SetProperty('status' . $i,$this->status[$i]);
 }
}
За это сообщение автора fandaymon поблагодарил:
Lerych (Пн дек 03, 2018 12:46 pm)
Рейтинг: 1.16%
Аватара пользователя
Lerych
Сообщения: 191
Зарегистрирован: Чт дек 14, 2017 8:46 pm
Откуда: Московская область, Серпухов
Благодарил (а): 79 раз
Поблагодарили: 24 раза

Re: Прослушивание TCP/IP

Сообщение Lerych » Пн дек 03, 2018 1:01 pm

fandaymon писал(а):
Пн дек 03, 2018 12:15 pm
var_dump выводит информацию о переменной
Странно,я в онлайн интерпретаторе набираю:

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

var_dump(str_split('010101011110001110011001100110', 1));
Выдаёт:

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

array(30) { [0]=> string(1) "0" [1]=> string(1) "1" [2]=> string(1) "0" [3]=> string(1) "1" [4]=> string(1) "0" [5]=> string(1) "1" [6]=> string(1) "0" [7]=> string(1) "1" [8]=> string(1) "1" [9]=> string(1) "1" [10]=> string(1) "1" [11]=> string(1) "0" [12]=> string(1) "0" [13]=> string(1) "0" [14]=> string(1) "1" [15]=> string(1) "1" [16]=> string(1) "1" [17]=> string(1) "0" [18]=> string(1) "0" [19]=> string(1) "1" [20]=> string(1) "1" [21]=> string(1) "0" [22]=> string(1) "0" [23]=> string(1) "1" [24]=> string(1) "1" [25]=> string(1) "0" [26]=> string(1) "0" [27]=> string(1) "1" [28]=> string(1) "1" [29]=> string(1) "0" }
Большое спасибо за ПОМОЩЬ!
Буду разбираться.
fandaymon
Сообщения: 1554
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: Прослушивание TCP/IP

Сообщение fandaymon » Пн дек 03, 2018 1:20 pm

Lerych писал(а):
Пн дек 03, 2018 1:01 pm
fandaymon писал(а):
Пн дек 03, 2018 12:15 pm
var_dump выводит информацию о переменной
Странно,я в онлайн интерпретаторе набираю:

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

var_dump(str_split('010101011110001110011001100110', 1));
Выдаёт:

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

array(30) { [0]=> string(1) "0" [1]=> string(1) "1" [2]=> string(1) "0" [3]=> string(1) "1" [4]=> string(1) "0" [5]=> string(1) "1" [6]=> string(1) "0" [7]=> string(1) "1" [8]=> string(1) "1" [9]=> string(1) "1" [10]=> string(1) "1" [11]=> string(1) "0" [12]=> string(1) "0" [13]=> string(1) "0" [14]=> string(1) "1" [15]=> string(1) "1" [16]=> string(1) "1" [17]=> string(1) "0" [18]=> string(1) "0" [19]=> string(1) "1" [20]=> string(1) "1" [21]=> string(1) "0" [22]=> string(1) "0" [23]=> string(1) "1" [24]=> string(1) "1" [25]=> string(1) "0" [26]=> string(1) "0" [27]=> string(1) "1" [28]=> string(1) "1" [29]=> string(1) "0" }
Большое спасибо за ПОМОЩЬ!
Буду разбираться.
Ну правильно - var_dump выдаёт информацию о том, что в результате работы функции str_split строчка превратилась в массив. Т.е. массив был сделан функцией str_split. К самой конвертации var_dump отношение не имеет
За это сообщение автора fandaymon поблагодарил:
Lerych (Пн дек 03, 2018 1:22 pm)
Рейтинг: 1.16%
Ответить