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

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


<!--T:2-->
В контроллер Wiren Board добавлен драйвер для ''получения'' данных от SNMP-устройств.
Часто используется для обмена сервисной информацией с устройствами, представляя данные в виде отдельных переменных.
Но вы можете настроить и ''отправку'' данных, для этого нужно [[#Контроллер как источник SNMP | установить и настроить]] демон <code>snmpd</code>.


<!--T:3-->
= Установка и настройка на контроллере =
Поддержка протокола встречается в сетевых коммутаторах, маршрутизаторах, системах бесперебойного питания (UPS), серверах и т.п.
Для установки и настройки подключитесь к контроллеру по [[SSH]].


<!--T:4-->
== Установка ==
В Wiren Board добавлен драйвер для '''получения''' данных от SNMP-устройств.
Сначала нужно установить пакет <code>wb-mqtt-snmp</code>, для этого введите в консоли команды:
Для использования контроллера в качестве '''источника''' - настраивается snmpd/


= Установка и настройка на контроллере = <!--T:5-->
== Установка == <!--T:6-->
<!--T:7-->
Сначала нужно установить пакет wb-mqtt-snmp. В консоли устройства вводим
<!--T:8-->
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
apt update
apt update
Строка 26: Строка 15:
</syntaxhighlight>
</syntaxhighlight>


== Настройка == <!--T:9-->
== Настройка ==  
 
Структура конфигурации похожа на [[Драйвер wb-mqtt-serial | wb-mqtt-serial]].
<!--T:10-->
Структура конфигурации очень похожа на wb-mqtt-serial.


<!--T:11-->
Пример конфигурационного файла <code>/etc/wb-mqtt-snmp.conf</code>:
Пример конфигурационного файла (/etc/wb-mqtt-snmp.conf):


<!--T:12-->
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
Строка 71: Строка 56:
</syntaxhighlight>
</syntaxhighlight>


<!--T:13-->
О структуре файла и назначении параметров читайте ниже.
Рассмотрим его несколько подробней.
 
=== Файл конфигурации === <!--T:14-->
 
<!--T:15-->
* '''debug''' - флаг включения режима отладки. Если true, то в процессе работы демона в лог-файл будет выноситься также отладочная информация (по умолчанию - false);
* '''num_workers''' - максимальное количество одновременно устанавливаемых SNMP-соединений.
** Если опрашивается много SNMP-устройств, то увеличение этого параметра может ускорить опрос. Однако, увеличение этого параметра также увеличивает максимальную нагрузку на сеть. В общем случае можно оставить значение по умолчанию (4).
* '''devices''' - список опрашиваемых устройств.


==== Описание устройства ==== <!--T:16-->
=== Файл конфигурации ===  
* <code>debug</code> — флаг включения режима отладки. Если true, то в процессе работы демона в лог-файл будет выноситься также отладочная информация (по умолчанию — false).
* <code>num_workers</code> — максимальное количество одновременно устанавливаемых SNMP-соединений. Если опрашивается много SNMP-устройств, то увеличение этого параметра может ускорить опрос. Но помните, что увеличение этого параметра также увеличивает максимальную нагрузку на сеть. В большинстве случаев можно оставить значение по умолчанию — 4.
* <code>devices</code> — список опрашиваемых устройств.


<!--T:17-->
==== Описание устройства ====
{| class="wikitable"
{| class="wikitable"
|-
|-
Строка 95: Строка 74:
| '''address''' || string || Сетевой адрес устройства || style="background: #22EE44;" | Да || -
| '''address''' || string || Сетевой адрес устройства || style="background: #22EE44;" | Да || -
|-
|-
| '''device_type''' || string || Тип устройства (нужен для загрузки шаблона) || Нет || -
| '''device_type''' || string || Тип устройства, нужен для загрузки шаблона || Нет || -
|-
|-
| '''enabled''' || bool || Включить устройство в опрос? || Нет || true
| '''enabled''' || bool || Включает или выключает опрос устройства || Нет || true
|-
|-
| '''community''' || string || Имя сообщества SNMP || style="background: #22EE44;" | Да || -
| '''community''' || string || Имя сообщества SNMP || style="background: #22EE44;" | Да || -
|-
|-
| '''oid_prefix''' || string || Префикс (имя MIB) для текстовых OID каналов, где оный не указан явно || Нет || -
| '''oid_prefix''' || string || Префикс (имя MIB) для текстовых OID каналов, где он не указан явно || Нет || -
|-
|-
| '''snmp_version''' || string || Версия SNMP (на сегодняшний день поддерживается только 2с) || Нет || 2c
| '''snmp_version''' || string || Версия SNMP, поддерживается только 2с || Нет || 2c
|-
|-
| '''snmp_timeout''' || integer || Время ожидания ответа (в секундах) || Нет || 5
| '''snmp_timeout''' || integer || Время ожидания ответа, в секундах || Нет || 5
|-
|-
| '''poll_interval''' || integer || Минимальное время опроса для каждого канала по умолчанию || Нет || -
| '''poll_interval''' || integer || Минимальное время опроса для каждого канала по умолчанию || Нет || -
Строка 113: Строка 92:
|}
|}


==== Описание каналов ==== <!--T:18-->
==== Описание каналов ====  
 
<!--T:19-->
{| class="wikitable"
{| class="wikitable"
|-
|-
Строка 124: Строка 101:
| '''oid''' || string || OID в числовом или текстовом виде || style="background: #22EE44;" | Да || -
| '''oid''' || string || OID в числовом или текстовом виде || style="background: #22EE44;" | Да || -
|-
|-
| '''enabled''' || boolean || Включить канал в опрос? || Нет || true
| '''enabled''' || boolean || Включает или выключает опрос устройства || Нет || true
|-
|-
| '''control_type''' || string || Тип данных (согласно [https://github.com/contactless/homeui/blob/contactless/conventions.md Conventions]) || Нет || text
| '''control_type''' || string || Тип данных, согласно [https://github.com/contactless/homeui/blob/contactless/conventions.md Conventions] || Нет || text
|-
|-
| '''units''' || string || Обозначение единиц измерения (для control_type == value) || Нет || -
| '''units''' || string || Обозначение единиц измерения, для <code>control_type == value</code> || Нет || -
|-
|-
| '''scale''' || float || Множитель (для числовых значений) || Нет || 1.0
| '''scale''' || float || Множитель, для числовых значений || Нет || 1.0
|-
|-
| '''poll_interval''' || int || Минимальный интервал опроса канала (в мс) || Нет || poll_interval из описания устройства, либо 1000
| '''poll_interval''' || int || Минимальный интервал опроса канала, в мс || Нет || <code>poll_interval</code> из описания устройства, либо 1000
|-
|-
|}
|}


== Преобразование OID == <!--T:20-->
== Преобразование OID ==  
При запуске демона происходит попытка преобразовать записанные в конфигурации текстовые OID в числовые:
* OID числовой: начинается с точки: <code>.1.2.3.4</code> — преобразование не происходит.
* OID текстовый: например, <code>SNMPv2-MIB::sysName.0</code> — происходит преобразование в числовой. В системе должен быть установлен MIB, который содержит описание этой переменной.


<!--T:21-->
Преобразование имен происходит с помощью вызова утилиты <code>snmptranslate</code>, так что можно проверить наличие MIB вручную с [[#Проверка работы преобразования | помощью команды]].
При запуске демона происходит попытка преобразовать записанные в конфигурации текстовые OID в числовые.


<!--T:22-->
Параметр <code>oid_prefix</code> в описании устройства позволяет опустить имя MIB (префикс: ''SNMPv2-MIB''::sysName.0). В этом случае префикс из <code>oid_prefix</code> будет автоматически присоединён ко всем OID каналам устройства, где он явно не указан. Например, при <code>oid_prefix</code> равном ''SNMPv2-MIB'':
Если OID представлен в числовом виде (начинается с точки: .1.2.3.4), никакого преобразования не происходит.


<!--T:23-->
* sysName.0 → ''SNMPv2-MIB''::sysName.0
Если OID представлен в текстовом виде (например, SNMPv2-MIB::sysName.0), необходимо, чтобы в системе был установлен соответствующий MIB, содержащий описание этой переменной.
* sysLocation.0 → ''SNMPv2-MIB''::sysLocation.0
Преобразование имён происходит с помощью вызова утилиты snmptranslate, так что можно проверить наличие MIB вручную с помощью команды
* 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


<!--T:24-->
=== Установка MIB ===
Если у вас есть нужный MIB-файл, то достаточно скопировать его в директорию <code>/root/.snmp/mibs</code>:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# snmptranslate -On yourOid
# cp your-mibs-file.mib /root/.snmp/mibs
</syntaxhighlight>
</syntaxhighlight>


<!--T:25-->
Если на контроллере нет директории <code>/root/.snmp/mibs</code> — создайте ее:
Параметр '''oid_prefix''' в описании устройства позволяет опустить имя MIB (префикс; '''SNMPv2-MIB'''::sysName.0). В этом случае префикс из '''oid_prefix''' будет автоматически
присоединён ко всем OID каналов устройства, где явно не указан префикс. Например, при '''oid_prefix''' = SNMPv2-MIB:
 
<!--T:26-->
* 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 ==== <!--T:27-->
 
<!--T:28-->
Если у Вас есть требуемый MIB-файл, то достаточно скопировать его в директорию /root/.snmp/mibs, предварительно создав её:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# mkdir -p /root/.snmp/mibs
# mkdir -p /root/.snmp/mibs
# cp your-mibs-file.mib /root/.snmp/mibs
</syntaxhighlight>
</syntaxhighlight>


<!--T:29-->
После копирования MIB-файла [[#Проверка работы преобразования | проверьте правильность преобразования]] <code>snmptranslate</code> с каким-либо известным OID.
После этого проверьте правильность работы snmptranslate с каким-либо известным OID:


<!--T:30-->
=== Проверка работы преобразования ===
Для проверки введите команду, где <code>yourOid</code> — известный вам OID:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
# snmptranslate -On yourOid
# snmptranslate -On yourOid
</syntaxhighlight>
</syntaxhighlight>


== Шаблоны == <!--T:31-->
== Шаблоны ==  
Для описания устройств не обязательно, но удобно использовать ''шаблоны''.


<!--T:32-->
''Шаблон (тип устройства)'' это внешний конфигурационный файл с именем <code>config-[device-type-name].json</code>, который располагается в <code>/usr/share/wb-mqtt-snmp/templates</code>. Например, <code>/usr/share/wb-mqtt-snmp/templates/config-test-snmp.json</code>. В файле шаблона содержится описание устройства: имя сообщества SNMP и базовое описание всех его каналов.
Для описания устройств удобно (хотя и не обязательно) использовать ''шаблоны''. ''Шаблон (тип устройства)'' - это внешний конфигурационный файл (располагается в /usr/share/wb-mqtt-snmp/templates  
и имеет имя config-[device-type-name].json, например, config-test-snmp.json), в котором содержится базовое описание устройства (например, имя сообщества SNMP) и базовое описание всех его каналов.


<!--T:33-->
Для использования шаблона в описании устройства в конфигурационном файле укажите поле <code>device_type</code>. Среди всех представленных шаблонов будет выбран тот, где такое же значение <code>device_type</code> и все неопределенные в конфигурационном файле поля примут значения из шаблона.
Для использования шаблона в описании устройства в конфигурационном файле укажите поле "''device_type''". Среди всех представленных шаблонов будет выбран шаблон с таким же значением ''device_type'', при этом
все поля, которые не были определены в конфигурационном файле, примут значения из шаблона.


<!--T:34-->
Точно так же это работает с каналами. Сравнение каналов происходит по обязательному полю <code>name</code>: если имя канала из конфигурационного файла совпадёт с именем канала в шаблоне, из шаблона будут взяты все неопределенные значения.
Точно так же это работает с каналами. Сравнение каналов происходит по обязательному полю ''name''; если имя канала из конфигурационного файла совпадёт с именем канала в шаблоне, из шаблона будут взяты  
все неуказанные значения.


=== Пример === <!--T:35-->
=== Пример ===  
Шаблон <code>config-my-device.json</code>:


<!--T:36-->
Шаблон config-my-device.json:
<!--T:37-->
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
{
{
Строка 218: Строка 176:
</syntaxhighlight>
</syntaxhighlight>


<!--T:38-->
Конфигурационный файл:
Конфигурационный файл:
<syntaxhighlight lang="json">
<syntaxhighlight lang="json">
Строка 245: Строка 202:
</syntaxhighlight>
</syntaxhighlight>


<!--T:39-->
В примере мы описали один шаблон <code>my-device</code>, по которому определили два разных устройства ''Device 1'' и ''Device 2'' с одинаковым набором каналов.
В данном случае мы описали один шаблон my-device, по которому определили два разных устройства ''Device 1'' и ''Device 2'' с одинаковым набором каналов.
 
<!--T:40-->
Поскольку ''Device 1'' находится в локальной сети, логично выставить ему небольшое значение таймаута, чтобы быстрее определить неисправность устройства. Все остальные настройки берутся из шаблона.


<!--T:41-->
Поскольку ''Device 1'' находится в локальной сети, то логично выставить ему небольшое значение таймаута — это позволит быстрее определить неисправность устройства. Все остальные настройки берутся из шаблона.
''Device 2'' - удалённый сервер, потому для него стоит увеличить таймаут, чтобы не считать устройство неисправным при задержке пакета. Более того, для канала ''Channel 2'' здесь мы переопределяем
интервал опроса на бОльший, чтобы снизить нагрузку на сеть.


<!--T:42-->
''Device 2'' — удалённый сервер, потому для него стоит увеличить таймаут, чтобы не считать устройство неисправным при задержке пакета. Более того, для канала ''Channel 2'' здесь мы переопределяем интервал опроса на б''о''льший — это снизит нагрузку на сеть.
Таким образом, шаблоны очень удобно использовать для описания группы однотипных устройств.


= Список шаблонов = <!--T:43-->
Таким образом, шаблоны удобно использовать для описания группы однотипных устройств.


<!--T:44-->
= Список шаблонов =
В поставке wb-mqtt-snmp прилагается набор шаблонов для типовых устройств (список будет расширяться):
В поставке <code>wb-mqtt-snmp</code> прилагается набор шаблонов для типовых устройств:


<!--T:45-->
{| class="wikitable"
{| class="wikitable"
|-
|-
Строка 272: Строка 221:
| APC UPS || apc-ups || Нет ||  
| APC UPS || apc-ups || Нет ||  
* Требуется локально установленный PowerNet-MIB
* Требуется локально установленный PowerNet-MIB
* Описание устройства такое же, как в wb-mqtt-apcsnmp
* Описание устройства такое же, как в <code>wb-mqtt-apcsnmp</code>
|-
|-
|}
|}
</translate>


= Контроллер как источник SNMP =  
= Контроллер как источник SNMP =  
Иногда нужно подучать с контроллера какие-то параметры по SNMP.
Иногда нужно получать какие-то параметры из контроллера по SNMP, например, значения топиков.
Для того чтобы иметь возможность передавать значения топиков настроим следующую схему:
 
== Установка и предварительная настройка пакетов ==
== Установка и предварительная настройка пакетов ==


Обновим источники и установим требуемое:
Обновите источники и установите пакеты <code>snmp</code> и <code>snmpd</code>:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
apt update && apt-get install snmp snmpd -y
apt update && apt-get install snmp snmpd -y
</syntaxhighlight>
</syntaxhighlight>
Отредктируем основной конфиг демона
 
Отредактируйте основной файл конфигурации демона:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
mcedit /etc/snmp/snmpd.conf
mcedit /etc/snmp/snmpd.conf
</syntaxhighlight>
</syntaxhighlight>


В секцию
В секцию <code>#  ACCESS CONTROL</code> допишите строчку:
"#  ACCESS CONTROL"
дописываем строчку.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
view  systemonly  included  .1.3.6.1.4.1.2021.8
view  systemonly  included  .1.3.6.1.4.1.2021.8
</syntaxhighlight>
</syntaxhighlight>


и в конец файла строчку.
А в конец файла допишите ссылку на скрипт:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
extend .1.3.6.1.4.1.2021.8 tt /var/lib/snmp/mqtt-snmp.sh
extend .1.3.6.1.4.1.2021.8 tt /var/lib/snmp/mqtt-snmp.sh
</syntaxhighlight>
</syntaxhighlight>
== Добавление скрипта ==
== Добавление скрипта ==


Редактируем скрипт
Отредактируйте скрипт <code>/var/lib/snmp/mqtt-snmp.sh</code>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
mcedit /var/lib/snmp/mqtt-snmp.sh
mcedit /var/lib/snmp/mqtt-snmp.sh
</syntaxhighlight>
</syntaxhighlight>


Содерижимое:
B приведите его к виду:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
#!/bin/sh
#!/bin/sh
Строка 319: Строка 267:
</syntaxhighlight>
</syntaxhighlight>


Права на скрипт:
Установите на права:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
chmod a+rx /var/lib/snmp/mqtt-snmp.sh
chmod a+rx /var/lib/snmp/mqtt-snmp.sh
</syntaxhighlight>
</syntaxhighlight>


Соответственно добавляем в этот скрпт нужные топики. Или создаем нескоько скриптов с разными наборами - для ускорения.
Теперь добавляем в этот скрипт нужные топики, или создаем несколько скриптов с разными наборами. Если вы создаете несколько скриптов, не забудьте [[#Установка и предварительная настройка пакетов | дописать ссылки на них в конец файла]] <code>/etc/snmp/snmpd.conf</code>.
перезапускаем демона:
 
После сохранения изменений в скрипте, перезапустите демон <code>snmpd</code>:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
systemctl restart snmpd && systemctl status snmpd
systemctl restart snmpd && systemctl status snmpd
</syntaxhighlight>
</syntaxhighlight>


тестируем:
Можете протестировать:
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
snmpwalk -On -v2c -c public 127.0.0.1 1.3.6.1.4.1.2021.8.4
snmpwalk -On -v2c -c public 127.0.0.1 1.3.6.1.4.1.2021.8.4
</syntaxhighlight>
<syntaxhighlight lang="bash">
</syntaxhighlight>
</syntaxhighlight>

Версия 19:14, 18 января 2021

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

В контроллер Wiren Board добавлен драйвер для получения данных от SNMP-устройств. Но вы можете настроить и отправку данных, для этого нужно установить и настроить демон snmpd.

Установка и настройка на контроллере

Для установки и настройки подключитесь к контроллеру по SSH.

Установка

Сначала нужно установить пакет wb-mqtt-snmp, для этого введите в консоли команды:

apt update
apt install wb-mqtt-snmp

Настройка

Структура конфигурации похожа на wb-mqtt-serial.

Пример конфигурационного файла /etc/wb-mqtt-snmp.conf:

{
    "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"
        }
    ]
}

О структуре файла и назначении параметров читайте ниже.

Файл конфигурации

  • debug — флаг включения режима отладки. Если true, то в процессе работы демона в лог-файл будет выноситься также отладочная информация (по умолчанию — false).
  • num_workers — максимальное количество одновременно устанавливаемых SNMP-соединений. Если опрашивается много SNMP-устройств, то увеличение этого параметра может ускорить опрос. Но помните, что увеличение этого параметра также увеличивает максимальную нагрузку на сеть. В большинстве случаев можно оставить значение по умолчанию — 4.
  • devices — список опрашиваемых устройств.

Описание устройства

Имя параметра Тип Описание Обязательный Значение по умолчанию
name string Имя устройства Нет SNMP [address]_[community]
id string ID устройства в MQTT Нет snmp_[address]_[community]
address string Сетевой адрес устройства Да -
device_type string Тип устройства, нужен для загрузки шаблона Нет -
enabled bool Включает или выключает опрос устройства Нет true
community string Имя сообщества SNMP Да -
oid_prefix string Префикс (имя MIB) для текстовых OID каналов, где он не указан явно Нет -
snmp_version string Версия SNMP, поддерживается только 2с Нет 2c
snmp_timeout integer Время ожидания ответа, в секундах Нет 5
poll_interval integer Минимальное время опроса для каждого канала по умолчанию Нет -
channels array Описание каналов устройства (переменных SNMP) Нет -

Описание каналов

Имя параметра Тип Описание Обязательный Значение по умолчанию
name string Имя канала Да -
oid string OID в числовом или текстовом виде Да -
enabled boolean Включает или выключает опрос устройства Нет true
control_type string Тип данных, согласно 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 вручную с помощью команды.

Параметр 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:

# cp your-mibs-file.mib /root/.snmp/mibs

Если на контроллере нет директории /root/.snmp/mibs — создайте ее:

# mkdir -p /root/.snmp/mibs

После копирования MIB-файла проверьте правильность преобразования snmptranslate с каким-либо известным OID.

Проверка работы преобразования

Для проверки введите команду, где yourOid — известный вам OID:

# snmptranslate -On yourOid

Шаблоны

Для описания устройств не обязательно, но удобно использовать шаблоны.

Шаблон (тип устройства) — это внешний конфигурационный файл с именем config-[device-type-name].json, который располагается в /usr/share/wb-mqtt-snmp/templates. Например, /usr/share/wb-mqtt-snmp/templates/config-test-snmp.json. В файле шаблона содержится описание устройства: имя сообщества SNMP и базовое описание всех его каналов.

Для использования шаблона в описании устройства в конфигурационном файле укажите поле device_type. Среди всех представленных шаблонов будет выбран тот, где такое же значение device_type и все неопределенные в конфигурационном файле поля примут значения из шаблона.

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

Пример

Шаблон config-my-device.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
        }
    ]
}

Конфигурационный файл:

{
    "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
                }
            ]
        }
    ]
}

В примере мы описали один шаблон my-device, по которому определили два разных устройства Device 1 и Device 2 с одинаковым набором каналов.

Поскольку Device 1 находится в локальной сети, то логично выставить ему небольшое значение таймаута — это позволит быстрее определить неисправность устройства. Все остальные настройки берутся из шаблона.

Device 2 — удалённый сервер, потому для него стоит увеличить таймаут, чтобы не считать устройство неисправным при задержке пакета. Более того, для канала Channel 2 здесь мы переопределяем интервал опроса на больший — это снизит нагрузку на сеть.

Таким образом, шаблоны удобно использовать для описания группы однотипных устройств.

Список шаблонов

В поставке wb-mqtt-snmp прилагается набор шаблонов для типовых устройств:

Устройство Имя шаблона Протестировано Комментарии
Тестовый сервер Net-SNMP test-snmp Да адрес тестового сервера test.net-snmp.org
APC UPS apc-ups Нет
  • Требуется локально установленный PowerNet-MIB
  • Описание устройства такое же, как в wb-mqtt-apcsnmp

Контроллер как источник SNMP

Иногда нужно получать какие-то параметры из контроллера по SNMP, например, значения топиков.

Установка и предварительная настройка пакетов

Обновите источники и установите пакеты snmp и snmpd:

apt update && apt-get install snmp snmpd -y

Отредактируйте основной файл конфигурации демона:

mcedit /etc/snmp/snmpd.conf

В секцию # ACCESS CONTROL допишите строчку:

view   systemonly  included   .1.3.6.1.4.1.2021.8

А в конец файла допишите ссылку на скрипт:

extend .1.3.6.1.4.1.2021.8 tt /var/lib/snmp/mqtt-snmp.sh

Добавление скрипта

Отредактируйте скрипт /var/lib/snmp/mqtt-snmp.sh

mcedit /var/lib/snmp/mqtt-snmp.sh

B приведите его к виду:

#!/bin/sh
echo "mosquitto topics"
# voltage Vout
echo $(/usr/bin/mosquitto_sub -C 1 -t "/devices/wb-adc/controls/5Vout")
# voltage Vin
echo $(/usr/bin/mosquitto_sub -C 1 -t "/devices/wb-adc/controls/Vin")

Установите на права:

chmod a+rx /var/lib/snmp/mqtt-snmp.sh

Теперь добавляем в этот скрипт нужные топики, или создаем несколько скриптов с разными наборами. Если вы создаете несколько скриптов, не забудьте дописать ссылки на них в конец файла /etc/snmp/snmpd.conf.

После сохранения изменений в скрипте, перезапустите демон snmpd:

systemctl restart snmpd && systemctl status snmpd

Можете протестировать:

snmpwalk -On -v2c -c public 127.0.0.1 1.3.6.1.4.1.2021.8.4