Взаимодействие по протоколу SNMP
Модератор: immortal
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Взаимодействие по протоколу SNMP
Обсуждение страницы Взаимодействие по протоколу SNMP
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Взаимодействие по протоколу SNMP
Интересно. Хотелось бы конкретный пример как считать значение и как записать значение.
И сам принцип как узнать поддерживаемые устройством значения и команды.
И сам принцип как узнать поддерживаемые устройством значения и команды.
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Взаимодействие по протоколу SNMP
Я завтра допишу статью на примере netping. Если кратко, то принцип такой -- связываем со свойством объекта и запись в это свойство через тот же SetGlobal отправит команду записи в snmp свойство. Чтение так же просто как в 1wire. А сами свойства поддерживаемые нужно искать в документации к девайсу.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
- Amarok
- Сообщения: 1427
- Зарегистрирован: Пт дек 14, 2012 12:24 pm
- Откуда: Россия, Нижняя Тура
- Благодарил (а): 460 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Взаимодействие по протоколу SNMP
А покажите, пожалуйста, пример взаимодействия программы Tasker и SNMP-устройства
Моя Алиска живёт на Proxmox в Debian 12
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Взаимодействие по протоколу SNMP
У меня такой связки нету, но могу подсказать как реализовать:BlackWarrior писал(а):А покажите, пожалуйста, пример взаимодействия программы Tasker и SNMP-устройства
1. Делаем сценарий, который обновляет какое-то свойство объекта (условно Object1.A) через setGlobal("Object1.A","нужное_значение");
2. Получаем URL на запуск этого сценария и в таскере добавляем действие с открытием URL-а
3. В модуле SNMP-устройств связываем SNMP-свойство со свойством Object1.A
собственно, всё -- из таскера будет устанавливаться свойство объекта и соответствующий запрос будет отправлен на связанное SNMP-устройство
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 80
- Зарегистрирован: Пн апр 01, 2013 10:20 pm
- Откуда: Днепропетровск
- Благодарил (а): 7 раз
- Поблагодарили: 3 раза
Re: Взаимодействие по протоколу SNMP
Есть подозрение на баг. Итак опишу ситуацию
1. Добавид снмп устройство
2. Добавил новый клас и объект и связал свойства с устройством 3. Значение в одном из свойст "1,1,1,1". Я его записываю в IPSensor1.rawSensorStatus
4. В настройках rawSensorStatus стоит вызов метода. Этот метод разбивает строку на 4 значения и записывает в 4 других свойства На данном этапе всё работает отлично. МД пулит значения, метод срабатывает и парсит их. Идём дальше, настраиваем snmp_trap_daemon.php
5. Добавляю бат файл и запускаю (кстати в документации неправильный скрипт указан)
6. Замыкаю контакты на устройсве, вижу что МД ловит трап, вижу в X-Ray изменения rawSensorStatus
Проблема в том что не срабатывает метод который прописан на изменение в rawSensorStatus. Можно ли это как то пофиксить малой кровью?
P.S. Пытаюсь интегрировать девайс IPSensor S4T1 засветившийся на ab-log.
1. Добавид снмп устройство
2. Добавил новый клас и объект и связал свойства с устройством 3. Значение в одном из свойст "1,1,1,1". Я его записываю в IPSensor1.rawSensorStatus
4. В настройках rawSensorStatus стоит вызов метода. Этот метод разбивает строку на 4 значения и записывает в 4 других свойства На данном этапе всё работает отлично. МД пулит значения, метод срабатывает и парсит их. Идём дальше, настраиваем snmp_trap_daemon.php
5. Добавляю бат файл и запускаю (кстати в документации неправильный скрипт указан)
6. Замыкаю контакты на устройсве, вижу что МД ловит трап, вижу в X-Ray изменения rawSensorStatus
Проблема в том что не срабатывает метод который прописан на изменение в rawSensorStatus. Можно ли это как то пофиксить малой кровью?
P.S. Пытаюсь интегрировать девайс IPSensor S4T1 засветившийся на ab-log.
- sergejey
- Site Admin
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Взаимодействие по протоколу SNMP
Это баг системы похоже. Записал себе в список на разбор. В ближайшее время постараюсь посмотреть.
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 80
- Зарегистрирован: Пн апр 01, 2013 10:20 pm
- Откуда: Днепропетровск
- Благодарил (а): 7 раз
- Поблагодарили: 3 раза
Re: Взаимодействие по протоколу SNMP
Дошли руки наконец разобраться с багой. Ато девайс уже 2 месяца валяется без дела.
Итак есть объект со свойством IPSensor1.rawSensorStatus. На изменение свойства висит метод splitStringToBool. Делаем простой юнит тест
Тест падает после второго присваивания значения на проверке
Подебажив метод setProperty класса /modules/objects/objects.class.php видно что мы забываем сбрасывать $property_linked_history[$property][$prop['ONCHANGE']]
Покажу в куске кода
Я если честно не разобрался во всей этой логик с флажками, и нет полных тестов чтоб можно было не опасаясь рефакторить. Помогите разобраться как фофиксить.
p.S. Может заменить концепцию $property_linked_history на обычный стек вызовов методов и свойств. Да, надо будет бежать по этому стеку вместо простой проверки, но такой подход более ясный (IMHO)
Итак есть объект со свойством 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
Покажу в куске кода
Код: Выделить всё
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
- Сообщения: 4286
- Зарегистрирован: Пн сен 05, 2011 6:48 pm
- Откуда: Минск, Беларусь
- Благодарил (а): 76 раз
- Поблагодарили: 1559 раз
- Контактная информация:
Re: Взаимодействие по протоколу SNMP
Можно убрать эту проверку вовсе, хоть и придётся полагаться на то, что логических ошибок пользователь не допустит.
Стек вызовов это хорошо было бы, но когда делал сходу не сообразил как его организовать правильно (чтобы он обнулялся когда нужно), поэтому поставил такой "костыль".
Стек вызовов это хорошо было бы, но когда делал сходу не сообразил как его организовать правильно (чтобы он обнулялся когда нужно), поэтому поставил такой "костыль".
Сергей Джейгало, разработчик MajorDoMo
Идеи, ошибки -- за предложениями по исправлению и развитию слежу только здесь!
Профиль Connect -- информация, сотрудничество, услуги
-
- Сообщения: 80
- Зарегистрирован: Пн апр 01, 2013 10:20 pm
- Откуда: Днепропетровск
- Благодарил (а): 7 раз
- Поблагодарили: 3 раза
Re: Взаимодействие по протоколу SNMP
Не, флажок там всётки нужно потому как сообразить бесконечный цикл на одном свойстве и одном методе тяжело в здравом уме, а вот несколько объектов с перекрётсными ссылками дадут бесконечный цикл. И потом будут топики на форуме что один из циклов уходит в себя по непонятным причинам. И думай потом как унего объекты заведены и события с девайсов приходят. Надеюсь пхп имеет встроеную проверку что стек вызовов не может быть глубже какого то значения.
Сделаю ещё пару юнит тестов и потом поменяю код. Но наверное только на вых. доберусь до этого.
Про стек я ещё потом подумал и решил что этот флажок справится. Ну а вообще при заходе в метод добавляем в стек, при выходе вытягиваем. Посколько это выглядит как рекурсия работа со стеком как FIFO. Но в этом месте нет смысла заморачиваться.
Сделаю ещё пару юнит тестов и потом поменяю код. Но наверное только на вых. доберусь до этого.
Про стек я ещё потом подумал и решил что этот флажок справится. Ну а вообще при заходе в метод добавляем в стек, при выходе вытягиваем. Посколько это выглядит как рекурсия работа со стеком как FIFO. Но в этом месте нет смысла заморачиваться.