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

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

Модератор: immortal

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

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

Сообщение Delphin » Вс ноя 19, 2017 12:56 am

У меня есть 1 блок реле - к примеру на 12 каналов.
Я пишу промежуточную программу которая будет общаться с этим реле и компьютером с установленным мажордомо.
Через GET - запрос хочу обновлять статусы у 12 шт каналов к примеру лампочек.
Подскажите пожалуйста как можно одним GET-запросом обновить статус 12 объектов, дабы не плодить лишний сетевой трафик?!
Мне удобно было бы к примеру отсылать 16 битное или 2шт. 8 битных числа со статусом всех реле.
Такое возможно реализовать в мажордомо?
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

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

Сообщение serghei » Вс ноя 19, 2017 1:35 am

Вполне возможно. Как пример - Ардуина отдает 1 напряжение и 13 мощностей одним запросом. Ну и на стороне МД разбираем все по полочкам
СпойлерПоказать

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

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( )   
В результате уходит один запрос с 14-ю цифрами. Так же и отправляется состояние ардуины раз в минуту, что она жива
СпойлерПоказать

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

2017-11-19 00:33:42 Host 192.168.2.70 GET /objects/?object=ncESP_32&op=m&m=update&v=1
За это сообщение автора serghei поблагодарил:
Delphin (Вс ноя 19, 2017 10:21 am)
Рейтинг: 1.16%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Delphin
Сообщения: 23
Зарегистрирован: Сб сен 30, 2017 2:35 am
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение Delphin » Пн ноя 20, 2017 1:26 am

Доброго время суток! Так как я php не знаю, не стал я заморачиваться, создал кучу объектов на базе класса "Relays", и по изменению состояния каждой из реле, отправляю по одному гет-запрос, по изменению состояния одного объекта состояние меняется и отображает в мажоре.

Но тут стал вопрос обратного взаимодействия, к примеру включения реле по нажатию кнопки из мажора.
Get - запросом я так понимаю нужно отдельно веб сервер подымать, что усложняет в разы программу коннектора, кто подскажет возможно ли отправлять статус реле, по нажатию на кнопку в мажоре, к примеру через socket соединение, используя UDP пакет и порт 6000 ?
Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение skysilver » Пн ноя 20, 2017 11:06 am

Delphin писал(а):Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
Т.е. на ардуине крутится udp-сервер, который принимает соединения на порту 6000? И из МДМ нужно слать команды на этот udp-порт?
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Delphin
Сообщения: 23
Зарегистрирован: Сб сен 30, 2017 2:35 am
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение Delphin » Пн ноя 20, 2017 11:30 am

skysilver писал(а):
Delphin писал(а):Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
Т.е. на ардуине крутится udp-сервер, который принимает соединения на порту 6000? И из МДМ нужно слать команды на этот udp-порт?
Совершенно верно. Только не на ардуино, но сути это не меняет.
Delphin
Сообщения: 23
Зарегистрирован: Сб сен 30, 2017 2:35 am
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение Delphin » Пн ноя 20, 2017 11:31 am

Т.е. мне нужно сделать коннект по этому сокету, отправку данных, и отключение от сокета.
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение 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; 
}
За это сообщение автора skysilver поблагодарил:
Delphin (Вт ноя 21, 2017 1:04 am)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Delphin
Сообщения: 23
Зарегистрирован: Сб сен 30, 2017 2:35 am
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение Delphin » Вт ноя 21, 2017 1:46 am

skysilver писал(а):
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; 
} 
Огромное спасибо за код!!!

Прописал данный код в скриптах с именем 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');
skysilver
Сообщения: 3006
Зарегистрирован: Чт авг 21, 2014 8:28 am
Откуда: Киров, Россия
Благодарил (а): 400 раз
Поблагодарили: 1753 раза
Контактная информация:

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

Сообщение skysilver » Вт ноя 21, 2017 9:55 am

Delphin писал(а):Прописал данный код в скриптах с именем Update, только поправил строку $msg = $params['MSG'];
Теперь в обработчике "Relays-> turnOn" пишу такой код:
$MSG='1R1_On';
runScript(Update,$MSG);
Не правильно вызываешь сценарий с параметром, попробуй так:

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

$MSG = '1R1_On';
runScript('Update', array('MSG'=>$MSG));
За это сообщение автора skysilver поблагодарил:
Delphin (Вт ноя 21, 2017 3:09 pm)
Рейтинг: 1.16%
MajorDoMo (GitHub) на Cubietruck. ОС Debian 7 (wheezy) (kernel 3.4.105) с переносом на HDD.
Мой CONNECT | Блоги | Telegram
Delphin
Сообщения: 23
Зарегистрирован: Сб сен 30, 2017 2:35 am
Благодарил (а): 10 раз
Поблагодарили: 0

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

Сообщение Delphin » Вт ноя 21, 2017 3:21 pm

skysilver писал(а):
Delphin писал(а):Прописал данный код в скриптах с именем Update, только поправил строку $msg = $params['MSG'];
Теперь в обработчике "Relays-> turnOn" пишу такой код:
$MSG='1R1_On';
runScript(Update,$MSG);
Не правильно вызываешь сценарий с параметром, попробуй так:

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

$MSG = '1R1_On';
runScript('Update', array('MSG'=>$MSG)); 

Спасибо! Так работает правильно!
Ответить