Страница 1 из 2

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

Добавлено: Вс ноя 19, 2017 12:56 am
Delphin
У меня есть 1 блок реле - к примеру на 12 каналов.
Я пишу промежуточную программу которая будет общаться с этим реле и компьютером с установленным мажордомо.
Через GET - запрос хочу обновлять статусы у 12 шт каналов к примеру лампочек.
Подскажите пожалуйста как можно одним GET-запросом обновить статус 12 объектов, дабы не плодить лишний сетевой трафик?!
Мне удобно было бы к примеру отсылать 16 битное или 2шт. 8 битных числа со статусом всех реле.
Такое возможно реализовать в мажордомо?

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

Добавлено: Вс ноя 19, 2017 1:35 am
serghei
Вполне возможно. Как пример - Ардуина отдает 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

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

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

Но тут стал вопрос обратного взаимодействия, к примеру включения реле по нажатию кнопки из мажора.
Get - запросом я так понимаю нужно отдельно веб сервер подымать, что усложняет в разы программу коннектора, кто подскажет возможно ли отправлять статус реле, по нажатию на кнопку в мажоре, к примеру через socket соединение, используя UDP пакет и порт 6000 ?
Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.

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

Добавлено: Пн ноя 20, 2017 11:06 am
skysilver
Delphin писал(а):Если кто хорошо разбирается в php буду благодарен за пример кода отправки статуса (Status) стандартного класса "Relays" через UDP пакет.
Т.е. на ардуине крутится udp-сервер, который принимает соединения на порту 6000? И из МДМ нужно слать команды на этот udp-порт?

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

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

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

Добавлено: Пн ноя 20, 2017 11:31 am
Delphin
Т.е. мне нужно сделать коннект по этому сокету, отправку данных, и отключение от сокета.

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

Добавлено: Пн ноя 20, 2017 11:53 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; 
}

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

Добавлено: Вт ноя 21, 2017 1:46 am
Delphin
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');

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

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

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

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

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

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

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

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

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