SNMP: различия между версиями

Материал из Wiren Board
(Отформатировал)
 
(не показано 27 промежуточных версий 7 участников)
Строка 1: Строка 1:
'''SNMP (Simple Network Management Protocol)''' - стандартный протокол для управления сетевыми устройствами в IP-сетях.
{{DISPLAYTITLE: SNMP}}


Часто используется для обмена сервисной информацией с устройствами, представляя данные в виде отдельных переменных.
'''SNMP (Simple Network Management Protocol)''' — стандартный протокол для управления сетевыми устройствами в IP-сетях. Он часто используется для обмена сервисной информацией с устройствами и представляет данные в виде отдельных переменных. Поддержка протокола встречается в сетевых коммутаторах, маршрутизаторах, системах бесперебойного питания (UPS), серверах и т.п. Подробнее о протоколе читайте в [https://ru.wikipedia.org/wiki/SNMP Wikipedia].


Поддержка протокола встречается в сетевых коммутаторах, маршрутизаторах, системах бесперебойного питания (UPS), серверах и т.п.
Контроллер может:<br>
 
* '''собирать''' информацию по SNMP с других устройств с помощью [[Драйвер_SNMP |Драйвера SNMP]] <br>
В Wiren Board добавлен драйвер для получения данных от SNMP-устройств. Драйвер написан на Go.
* '''отправлять''' данные другим устройствам с помощью [[Агент_SNMP |Агента SNMP]].
 
= Установка и настройка на контроллере =
 
== Установка ==
 
Сначала нужно установить пакет wb-mqtt-snmp. В консоли устройства вводим
 
<syntaxhighlight lang="bash">
# apt-get update && apt-get install wb-mqtt-snmp
</syntaxhighlight>
 
== Настройка ==
 
Структура конфигурации очень похожа на wb-mqtt-serial.
 
Пример конфигурационного файла (/etc/wb-mqtt-snmp.conf):
 
<syntaxhighlight lang="json">
{
    "debug": false,
    "num_workers": 4,
    "devices": [
        {
            "address": "192.168.0.1",
            "name": "My SNMP server",
            "community": "public",
            "oid_prefix": "SNMPv2-MIB",
            "channels": [
                {
                    "name": "Number of services",
                    "oid": "sysServices.0",
                    "poll_interval": 1000
                },
                {
                    "name": "Boot string",
                    "oid": "HOST-RESOURCES-MIB::hrSystemInitialLoadParameters.0",
                    "poll_interval": 10000
                },
                {
                    "name": "System location",
                    "oid": ".1.3.6.1.2.1.1.6.0"
                }
            ]
        },
        {
            "address": "test.net-snmp.org",
            "name": "Test SNMP server",
            "device_type": "test-snmp"
        }
    ]
}
</syntaxhighlight>
 
Рассмотрим его несколько подробней.
 
=== Файл конфигурации ===
 
* '''debug''' - флаг включения режима отладки. Если true, то в процессе работы демона в лог-файл будет выноситься также отладочная информация (по умолчанию - false);
* '''num_workers''' - максимальное количество одновременно устанавливаемых SNMP-соединений.
** Если опрашивается много SNMP-устройств, то увеличение этого параметра может ускорить опрос. Однако, увеличение этого параметра также увеличивает максимальную нагрузку на сеть. В общем случае можно оставить значение по умолчанию (4).
* '''devices''' - список опрашиваемых устройств.
 
==== Описание устройства ====
 
{| class="wikitable"
|-
! Имя параметра !! Тип !! Описание !! Обязательный !! Значение по умолчанию
|-
| '''name ''' || string || Имя устройства || Нет || SNMP [address]_[community]
|-
| '''id''' || string || ID устройства в MQTT || Нет || snmp_[address]_[community]
|-
| '''address''' || string || Сетевой адрес устройства || style="background: #22EE44;" | Да || -
|-
| '''device_type''' || string || Тип устройства (нужен для загрузки шаблона) || Нет || -
|-
| '''enabled''' || bool || Включить устройство в опрос? || Нет || true
|-
| '''community''' || string || Имя сообщества SNMP || style="background: #22EE44;" | Да || -
|-
| '''oid_prefix''' || string || Префикс (имя MIB) для текстовых OID каналов, где оный не указан явно || Нет || -
|-
| '''snmp_version''' || string || Версия SNMP (на сегодняшний день поддерживается только 2с) || Нет || 2c
|-
| '''snmp_timeout''' || integer || Время ожидания ответа (в секундах) || Нет || 5
|-
| '''poll_interval''' || integer || Минимальное время опроса для каждого канала по умолчанию || Нет || -
|-
| '''channels''' || array || Описание каналов устройства (переменных SNMP) || Нет || -
|-
|}
 
==== Описание каналов ====
 
{| class="wikitable"
|-
! Имя параметра !! Тип !! Описание !! Обязательный !! Значение по умолчанию
|-
| '''name''' || string || Имя канала || style="background: #22EE44;" | Да || -
|-
| '''oid''' || string || OID в числовом или текстовом виде || style="background: #22EE44;" | Да || -
|-
| '''control_type''' || string || Тип данных (согласно [https://github.com/contactless/homeui/blob/contactless/conventions.md Conventions]) || Нет || text
|-
| '''units''' || string || Обозначение единиц измерения (для control_type == value) || Нет || -
|-
| '''scale''' || float || Множитель (для числовых значений) || Нет || 1.0
|-
| '''poll_interval''' || int || Минимальный интервал опроса канала (в мс) || Нет || poll_interval из описания устройства, либо 1000
|-
|}
 
== Преобразование OID ==
 
При запуске демона происходит попытка преобразовать записанные в конфигурации текстовые OID в числовые.
 
Если OID представлен в числовом виде (начинается с точки: .1.2.3.4), никакого преобразования не происходит.
 
Если OID представлен в текстовом виде (например, SNMPv2-MIB::sysName.0), необходимо, чтобы в системе был установлен соответствующий MIB, содержащий описание этой переменной.
Преобразование имён происходит с помощью вызова утилиты snmptranslate, так что можно проверить наличие MIB вручную с помощью команды
 
<syntaxhighlight lang="bash">
# snmptranslate -On yourOid
</syntaxhighlight>
 
Параметр '''oid_prefix''' в описании устройства позволяет опустить имя MIB (префикс; '''SNMPv2-MIB'''::sysName.0). В этом случае, префикс из '''oid_prefix''' будет автоматически
присоединён ко всем OID каналов устройства, где явно не указан префикс. Например, при '''oid_prefix''' = SNMPv2-MIB:
 
* sysName.0 -> '''SNMPv2-MIB::'''sysName.0
* sysLocation.0 -> '''SNMPv2-MIB::'''sysLocation.0
* HOST-RESOURCES-MIB::hrSystemUptime.0 -> HOST-RESOURCES-MIB::hrSystemUptime.0
* .1.3.6.1.2.1.1.6.0 -> .1.3.6.1.2.1.1.6.0
 
==== Установка MIB ====
 
Если у Вас есть требуемый MIB-файл, то достаточно скопировать его в директорию /root/.snmp/mibs, предварительно создав её:
<syntaxhighlight lang="bash">
# mkdir -p /root/.snmp/mibs
# cp your-mibs-file.mib /root/.snmp/mibs
</syntaxhighlight>
 
После этого проверьте правильность работы snmptranslate с каким-либо известным OID:
 
<syntaxhighlight lang="bash">
# snmptranslate -On yourOid
</syntaxhighlight>
 
== Шаблоны ==
 
Для описания устройств удобно (хотя и не обязательно) использовать ''шаблоны''. ''Шаблон (тип устройства)'' - это внешний конфигурационный файл (располагается в /usr/share/wb-mqtt-snmp/templates
и имеет имя config-[device-type-name].json, например, config-test-snmp.json), в котором содержится базовое описание устройства (например, имя сообщества SNMP) и базовое описание всех его каналов.
 
Для использования шаблона в описании устройства в конфигурационном файле укажите поле "''device_type''". Среди всех представленных шаблонов будет выбран шаблон с таким же значением ''device_type'', при этом
все поля, которые не были определены в конфигурационном файле, примут значения из шаблона.
 
Точно так же это работает с каналами. Сравнение каналов происходит по обязательному полю ''name''; если имя канала из конфигурационного файла совпадёт с именем канала в шаблоне, из шаблона будут взяты
все неуказанные значения.
 
=== Пример ===
 
Шаблон config-my-device.json:
 
<syntaxhighlight lang="json">
{
    "device_type": "my-device",
    "community": "public",
    "channels": [
        {
            "name": "Channel 1",
            "oid": ".1.2.3.4.1"
        },
        {
            "name": "Channel 2",
            "oid": ".1.2.3.4.2",
            "poll_interval": 3000
        }
    ]
}
</syntaxhighlight>
 
Конфигурационный файл:
<syntaxhighlight lang="json">
{
    "devices": [
        {
            "name": "Device 1",
            "device_type": "my-device",
            "address": "192.168.0.5",
            "snmp_timeout": 1
        },
        {
            "name": "Device 2",
            "device_type": "my-device",
            "address": "my-device.example.org",
            "snmp_timeout": 5,
            "channels": [
                {
                    "name": "Channel 2",
                    "poll_interval": 10000
                }
            ]
        }
    ]
}
</syntaxhighlight>
 
В данном случае мы описали один шаблон my-device, по которому определили два разных устройства ''Device 1'' и ''Device 2'' с одинаковым набором каналов.
 
Поскольку ''Device 1'' находится в локальной сети, логично выставить ему небольшое значение таймаута, чтобы быстрее определить неисправность устройства. Все остальные настройки берутся из шаблона.
 
''Device 2'' - удалённый сервер, потому для него стоит увеличить таймаут, чтобы не считать устройство неисправным при задержке пакета. Более того, для канала ''Channel 2'' здесь мы переопределяем
интервал опроса на бОльший, чтобы снизить нагрузку на сеть.
 
Таким образом, шаблоны очень удобно использовать для описания группы однотипных устройств.
 
В поставке wb-mqtt-snmp прилагается набор шаблонов для типовых устройств (список будет расширяться):
 
{| class="wikitable"
|-
! Устройство !! Имя шаблона !! Протестировано !! Комментарии
|-
| Тестовый сервер Net-SNMP || test-snmp || style="background: #22EE44;" | Да || адрес тестового сервера test.net-snmp.org
|-
| APC UPS || apc-ups || Нет ||
* Требуется локально установленный PowerNet-MIB
* Описание устройства такое же, как в wb-mqtt-apcsnmp
|-
|}

Текущая версия на 16:09, 2 февраля 2021


SNMP (Simple Network Management Protocol) — стандартный протокол для управления сетевыми устройствами в IP-сетях. Он часто используется для обмена сервисной информацией с устройствами и представляет данные в виде отдельных переменных. Поддержка протокола встречается в сетевых коммутаторах, маршрутизаторах, системах бесперебойного питания (UPS), серверах и т.п. Подробнее о протоколе читайте в Wikipedia.

Контроллер может:

  • собирать информацию по SNMP с других устройств с помощью Драйвера SNMP
  • отправлять данные другим устройствам с помощью Агента SNMP.