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

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

Добавлено: Чт май 02, 2013 6:25 pm
sergejey
Обсуждение страницы Взаимодействие по протоколу SNMP

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

Добавлено: Чт май 02, 2013 7:38 pm
Alex
Интересно. Хотелось бы конкретный пример как считать значение и как записать значение.

И сам принцип как узнать поддерживаемые устройством значения и команды.

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

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

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

Добавлено: Вт июл 30, 2013 7:04 am
Amarok
А покажите, пожалуйста, пример взаимодействия программы Tasker и SNMP-устройства

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

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

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

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

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

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

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

P.S. Пытаюсь интегрировать девайс IPSensor S4T1 засветившийся на ab-log.

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

Добавлено: Вт сен 17, 2013 4:40 pm
sergejey
Это баг системы похоже. Записал себе в список на разбор. В ближайшее время постараюсь посмотреть.

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

Добавлено: Вс окт 27, 2013 10:51 pm
dimitrystd
Дошли руки наконец разобраться с багой. Ато девайс уже 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)

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

Добавлено: Пн окт 28, 2013 3:37 pm
sergejey
Можно убрать эту проверку вовсе, хоть и придётся полагаться на то, что логических ошибок пользователь не допустит.

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

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

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

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