Массовое обновление свойств обьектов
Модератор: immortal
-
- Сообщения: 23
- Зарегистрирован: Сб сен 30, 2017 2:35 am
- Благодарил (а): 10 раз
- Поблагодарили: 0
Массовое обновление свойств обьектов
У меня есть 1 блок реле - к примеру на 12 каналов.
Я пишу промежуточную программу которая будет общаться с этим реле и компьютером с установленным мажордомо.
Через GET - запрос хочу обновлять статусы у 12 шт каналов к примеру лампочек.
Подскажите пожалуйста как можно одним GET-запросом обновить статус 12 объектов, дабы не плодить лишний сетевой трафик?!
Мне удобно было бы к примеру отсылать 16 битное или 2шт. 8 битных числа со статусом всех реле.
Такое возможно реализовать в мажордомо?
Я пишу промежуточную программу которая будет общаться с этим реле и компьютером с установленным мажордомо.
Через GET - запрос хочу обновлять статусы у 12 шт каналов к примеру лампочек.
Подскажите пожалуйста как можно одним GET-запросом обновить статус 12 объектов, дабы не плодить лишний сетевой трафик?!
Мне удобно было бы к примеру отсылать 16 битное или 2шт. 8 битных числа со статусом всех реле.
Такое возможно реализовать в мажордомо?
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: Массовое обновление свойств обьектов
Вполне возможно. Как пример - Ардуина отдает 1 напряжение и 13 мощностей одним запросом. Ну и на стороне МД разбираем все по полочкам
В результате уходит один запрос с 14-ю цифрами. Так же и отправляется состояние ардуины раз в минуту, что она жива
СпойлерПоказать
Код: Выделить всё
void sendElectroMajor(char obj[], byte STT, byte STP) {
// для посылки дробной части значения
int UPrms_[MAX_UI_SENSORS];
// Вычисляем дробные части значений для формирования строки
UPrms_[U] = (middleUPrms[U] - (int)middleUPrms[U]) * 100;
for (int i = STT; i < STP; i++) {
UPrms_[i] = (middleUPrms[i] - (int)middleUPrms[i]) * 100;
}
if (STT == START_PIN && STP == END_PIN) {
sprintf(buf, "GET /objects/?object=%s&op=m&m=update&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d&%s=%0d.%d HTTP/1.0",
obj, "u", (int)middleUPrms[U], abs(UPrms_[U]),
"p1", (int)middleUPrms[1], abs(UPrms_[1]), "p2", (int)middleUPrms[2], abs(UPrms_[2]),
"p3", (int)middleUPrms[3], abs(UPrms_[3]), "p4", (int)middleUPrms[4], abs(UPrms_[4]),
"p5", (int)middleUPrms[5], abs(UPrms_[5]), "p6", (int)middleUPrms[6], abs(UPrms_[6]),
"p7", (int)middleUPrms[7], abs(UPrms_[7]), "p8", (int)middleUPrms[8], abs(UPrms_[8]),
"p9", (int)middleUPrms[9], abs(UPrms_[9]), "p10",(int)middleUPrms[10],abs(UPrms_[10]),
"p11",(int)middleUPrms[11],abs(UPrms_[11]), "p12",(int)middleUPrms[12],abs(UPrms_[12]),
"p13",(int)middleUPrms[13],abs(UPrms_[13]));
#ifdef MAJORDOMO_FEATURE
sendHttpRequest(MAJOR_IP, MAJOR_PORT, mclient);
#endif
}
} // sendElectroMajor( )
СпойлерПоказать
Код: Выделить всё
2017-11-19 00:33:42 Host 192.168.2.70 GET /objects/?object=ncESP_32&op=m&m=update&v=1
- Рейтинг: 1.16%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 23
- Зарегистрирован: Сб сен 30, 2017 2:35 am
- Благодарил (а): 10 раз
- Поблагодарили: 0
Re: Массовое обновление свойств обьектов
Доброго время суток! Так как я php не знаю, не стал я заморачиваться, создал кучу объектов на базе класса "Relays", и по изменению состояния каждой из реле, отправляю по одному гет-запрос, по изменению состояния одного объекта состояние меняется и отображает в мажоре.
Но тут стал вопрос обратного взаимодействия, к примеру включения реле по нажатию кнопки из мажора.
Get - запросом я так понимаю нужно отдельно веб сервер подымать, что усложняет в разы программу коннектора, кто подскажет возможно ли отправлять статус реле, по нажатию на кнопку в мажоре, к примеру через socket соединение, используя UDP пакет и порт 6000 ?
Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
Но тут стал вопрос обратного взаимодействия, к примеру включения реле по нажатию кнопки из мажора.
Get - запросом я так понимаю нужно отдельно веб сервер подымать, что усложняет в разы программу коннектора, кто подскажет возможно ли отправлять статус реле, по нажатию на кнопку в мажоре, к примеру через socket соединение, используя UDP пакет и порт 6000 ?
Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1753 раза
- Контактная информация:
Re: Массовое обновление свойств обьектов
Т.е. на ардуине крутится udp-сервер, который принимает соединения на порту 6000? И из МДМ нужно слать команды на этот udp-порт?Delphin писал(а):Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram
-
- Сообщения: 23
- Зарегистрирован: Сб сен 30, 2017 2:35 am
- Благодарил (а): 10 раз
- Поблагодарили: 0
Re: Массовое обновление свойств обьектов
Совершенно верно. Только не на ардуино, но сути это не меняет.skysilver писал(а):Т.е. на ардуине крутится udp-сервер, который принимает соединения на порту 6000? И из МДМ нужно слать команды на этот udp-порт?Delphin писал(а):Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
-
- Сообщения: 23
- Зарегистрирован: Сб сен 30, 2017 2:35 am
- Благодарил (а): 10 раз
- Поблагодарили: 0
Re: Массовое обновление свойств обьектов
Т.е. мне нужно сделать коннект по этому сокету, отправку данных, и отключение от сокета.
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1753 раза
- Контактная информация:
Re: Массовое обновление свойств обьектов
У udp-протокола нет необходимости устанавливать соединение в отличие от tcp.Delphin писал(а):Т.е. мне нужно сделать коннект по этому сокету, отправку данных, и отключение от сокета.
Попробуй такой код:
Код: Выделить всё
$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;
}
- Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram
-
- Сообщения: 23
- Зарегистрирован: Сб сен 30, 2017 2:35 am
- Благодарил (а): 10 раз
- Поблагодарили: 0
Re: Массовое обновление свойств обьектов
Огромное спасибо за код!!!skysilver писал(а):У udp-протокола нет необходимости устанавливать соединение в отличие от tcp.Delphin писал(а):Т.е. мне нужно сделать коннект по этому сокету, отправку данных, и отключение от сокета.
Попробуй такой код:Код: Выделить всё
$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; }
Прописал данный код в скриптах с именем Update, только поправил строку $msg = $params['MSG'];
Теперь в обработчике "Relays-> turnOn" пишу такой код:
$MSG='1R1_On';
runScript(Update,$MSG);
Но почему то на клиент приходит только 1 - первый байт ($MSG='1'), а "R1_On" где то теряются...
При том если написать такую обработку, приходят все байты:
getURLBackground('http://127.0.0.1:80/objects/?script=Update&MSG=1R1_ON');
-
- Сообщения: 3006
- Зарегистрирован: Чт авг 21, 2014 8:28 am
- Откуда: Киров, Россия
- Благодарил (а): 400 раз
- Поблагодарили: 1753 раза
- Контактная информация:
Re: Массовое обновление свойств обьектов
Не правильно вызываешь сценарий с параметром, попробуй так:Delphin писал(а):Прописал данный код в скриптах с именем Update, только поправил строку $msg = $params['MSG'];
Теперь в обработчике "Relays-> turnOn" пишу такой код:
$MSG='1R1_On';
runScript(Update,$MSG);
Код: Выделить всё
$MSG = '1R1_On';
runScript('Update', array('MSG'=>$MSG));
- Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Мой CONNECT | Блоги | Telegram
-
- Сообщения: 23
- Зарегистрирован: Сб сен 30, 2017 2:35 am
- Благодарил (а): 10 раз
- Поблагодарили: 0
Re: Массовое обновление свойств обьектов
skysilver писал(а):Не правильно вызываешь сценарий с параметром, попробуй так:Delphin писал(а):Прописал данный код в скриптах с именем Update, только поправил строку $msg = $params['MSG'];
Теперь в обработчике "Relays-> turnOn" пишу такой код:
$MSG='1R1_On';
runScript(Update,$MSG);Код: Выделить всё
$MSG = '1R1_On'; runScript('Update', array('MSG'=>$MSG));
Спасибо! Так работает правильно!