Взаимодействие по протоколу SNMP

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

Модератор: immortal

Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Взаимодействие по протоколу SNMP

Сообщение sergejey » Чт май 02, 2013 6:25 pm

Обсуждение страницы Взаимодействие по протоколу SNMP

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Alex
Сообщения: 2357
Зарегистрирован: Пт апр 20, 2012 12:53 pm
Благодарил (а): 42 раза
Поблагодарили: 262 раза

Re: Взаимодействие по протоколу SNMP

Сообщение Alex » Чт май 02, 2013 7:38 pm

Интересно. Хотелось бы конкретный пример как считать значение и как записать значение.

И сам принцип как узнать поддерживаемые устройством значения и команды.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Взаимодействие по протоколу SNMP

Сообщение sergejey » Чт май 02, 2013 9:07 pm

Я завтра допишу статью на примере netping. Если кратко, то принцип такой -- связываем со свойством объекта и запись в это свойство через тот же SetGlobal отправит команду записи в snmp свойство. Чтение так же просто как в 1wire. А сами свойства поддерживаемые нужно искать в документации к девайсу.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
Аватара пользователя
Amarok
Сообщения: 1425
Зарегистрирован: Пт дек 14, 2012 12:24 pm
Откуда: Россия, Нижняя Тура
Благодарил (а): 460 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Взаимодействие по протоколу SNMP

Сообщение Amarok » Вт июл 30, 2013 7:04 am

А покажите, пожалуйста, пример взаимодействия программы Tasker и SNMP-устройства
Алиска живёт на Ubuntu Server 14.04.3 LTS
connect, группа в Telegram, Яндекс.Деньги для благодарностей за помощь: 41001355945165
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Взаимодействие по протоколу SNMP

Сообщение sergejey » Вт июл 30, 2013 10:15 am

BlackWarrior писал(а):А покажите, пожалуйста, пример взаимодействия программы Tasker и SNMP-устройства
У меня такой связки нету, но могу подсказать как реализовать:
1. Делаем сценарий, который обновляет какое-то свойство объекта (условно Object1.A) через setGlobal("Object1.A","нужное_значение");
2. Получаем URL на запуск этого сценария и в таскере добавляем действие с открытием URL-а
3. В модуле SNMP-устройств связываем SNMP-свойство со свойством Object1.A

собственно, всё -- из таскера будет устанавливаться свойство объекта и соответствующий запрос будет отправлен на связанное SNMP-устройство

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: Взаимодействие по протоколу SNMP

Сообщение dimitrystd » Пт авг 30, 2013 10:59 pm

Есть подозрение на баг. Итак опишу ситуацию
1. Добавид снмп устройство
2. Добавил новый клас и объект и связал свойства с устройством
snmp_device.png
snmp_device.png (14.95 КБ) 17156 просмотров
3. Значение в одном из свойст "1,1,1,1". Я его записываю в IPSensor1.rawSensorStatus
4. В настройках rawSensorStatus стоит вызов метода. Этот метод разбивает строку на 4 значения и записывает в 4 других свойства
property.png
property.png (4.21 КБ) 17156 просмотров
На данном этапе всё работает отлично. МД пулит значения, метод срабатывает и парсит их. Идём дальше, настраиваем snmp_trap_daemon.php

5. Добавляю бат файл и запускаю (кстати в документации неправильный скрипт указан)
6. Замыкаю контакты на устройсве, вижу что МД ловит трап, вижу в X-Ray изменения rawSensorStatus

Проблема в том что не срабатывает метод который прописан на изменение в rawSensorStatus. Можно ли это как то пофиксить малой кровью?

P.S. Пытаюсь интегрировать девайс IPSensor S4T1 засветившийся на ab-log.
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Взаимодействие по протоколу SNMP

Сообщение sergejey » Вт сен 17, 2013 4:40 pm

Это баг системы похоже. Записал себе в список на разбор. В ближайшее время постараюсь посмотреть.

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: Взаимодействие по протоколу SNMP

Сообщение dimitrystd » Вс окт 27, 2013 10:51 pm

Дошли руки наконец разобраться с багой. Ато девайс уже 2 месяца валяется без дела.
Итак есть объект со свойством IPSensor1.rawSensorStatus. На изменение свойства висит метод splitStringToBool. Делаем простой юнит тест

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

    public function testSetPropertyWithOnChangeMethod()
    {
        $obj=getObject('IPSensor1');
        $this->assertNotEmpty($obj);

        $obj->setProperty('rawSensorStatus', '1,2,1,0');

        $this->assertEquals(1, $obj->getProperty('sensor1'));
        $this->assertEquals(2, $obj->getProperty('sensor2'));
        $this->assertEquals(1, $obj->getProperty('sensor3'));
        $this->assertEquals(0, $obj->getProperty('sensor4'));

        $obj->setProperty('rawSensorStatus', '0,0,0,0');

        $this->assertEquals(0, $obj->getProperty('sensor1'));
        $this->assertEquals(0, $obj->getProperty('sensor2'));
        $this->assertEquals(0, $obj->getProperty('sensor3'));
        $this->assertEquals(0, $obj->getProperty('sensor4'));
    }
Тест падает после второго присваивания значения на проверке

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

$this->assertEquals(0, $obj->getProperty('sensor1'));
PHPUnit_Framework_ExpectationFailedException : Failed asserting that '1' matches expected 0.
Expected :0
Actual   :1
Подебажив метод setProperty класса /modules/objects/objects.class.php видно что мы забываем сбрасывать $property_linked_history[$property][$prop['ONCHANGE']]
Покажу в куске кода

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

 function setProperty($property, $value, $no_linked=0) {
....
....
  if ($prop['ONCHANGE']) {
   global $property_linked_history;
   if (!$property_linked_history[$property][$prop['ONCHANGE']]) {
    $property_linked_history[$property][$prop['ONCHANGE']]=1;
    global $on_change_called;
    $params=array();
    $params['NEW_VALUE']=(string)$value;
    $params['OLD_VALUE']=(string)$old_value;
    $this->callMethod($prop['ONCHANGE'], $params);
    // Если расскоментировать строку то тест заработает unset($property_linked_history[$property][$prop['ONCHANGE']]);
   } elseif ($property_linked_history[$property][$prop['ONCHANGE']]) {
    unset($property_linked_history[$property][$prop['ONCHANGE']]);
   }
  }
Я если честно не разобрался во всей этой логик с флажками, и нет полных тестов чтоб можно было не опасаясь рефакторить. Помогите разобраться как фофиксить.

p.S. Может заменить концепцию $property_linked_history на обычный стек вызовов методов и свойств. Да, надо будет бежать по этому стеку вместо простой проверки, но такой подход более ясный (IMHO)
Аватара пользователя
sergejey
Site Admin
Сообщения: 4284
Зарегистрирован: Пн сен 05, 2011 6:48 pm
Откуда: Минск, Беларусь
Благодарил (а): 75 раз
Поблагодарили: 1559 раз
Контактная информация:

Re: Взаимодействие по протоколу SNMP

Сообщение sergejey » Пн окт 28, 2013 3:37 pm

Можно убрать эту проверку вовсе, хоть и придётся полагаться на то, что логических ошибок пользователь не допустит.

Стек вызовов это хорошо было бы, но когда делал сходу не сообразил как его организовать правильно (чтобы он обнулялся когда нужно), поэтому поставил такой "костыль".

Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
dimitrystd
Сообщения: 80
Зарегистрирован: Пн апр 01, 2013 10:20 pm
Откуда: Днепропетровск
Благодарил (а): 7 раз
Поблагодарили: 3 раза

Re: Взаимодействие по протоколу SNMP

Сообщение dimitrystd » Пн окт 28, 2013 11:49 pm

Не, флажок там всётки нужно потому как сообразить бесконечный цикл на одном свойстве и одном методе тяжело в здравом уме, а вот несколько объектов с перекрётсными ссылками дадут бесконечный цикл. И потом будут топики на форуме что один из циклов уходит в себя по непонятным причинам. И думай потом как унего объекты заведены и события с девайсов приходят. Надеюсь пхп имеет встроеную проверку что стек вызовов не может быть глубже какого то значения.
Сделаю ещё пару юнит тестов и потом поменяю код. Но наверное только на вых. доберусь до этого.

Про стек я ещё потом подумал и решил что этот флажок справится. Ну а вообще при заходе в метод добавляем в стек, при выходе вытягиваем. Посколько это выглядит как рекурсия работа со стеком как FIFO. Но в этом месте нет смысла заморачиваться.
Ответить