SNMP
Опрос ресурсов, управление сценариями и уведомления SNMP
SNMP позволяет читать состояние контроллера, изменять доступные для записи ресурсы и запускать сохранённые сценарии. Контроллер принимает запросы SNMPv1 и SNMPv2c на UDP-порту 161. Для обхода таблиц доступны GETNEXT и, в SNMPv2c, GETBULK. Уведомления отправляются в формате SNMPv1 Trap на UDP-порт 162.
Настройка доступа
В настройках контроллера включите SNMP. Для чтения, записи и исходящих trap используются отдельные строки community:
| Назначение | Community по умолчанию |
|---|---|
| Чтение GET / GETNEXT / GETBULK | public |
| Запись SET | private |
| Уведомления trap | public |
Собственная community применяется, когда включена соответствующая парольная защита и заполнено её поле. Иначе используется значение по умолчанию. Максимальная длина собственной строки — 8 байт; для предсказуемой длины используйте ASCII. Community чтения не даёт права записи, если строки для чтения и записи различаются. SNMPv1/v2c передаёт community и данные без шифрования.
Для каждого ресурса отдельно задаётся внешний доступ (ext, в сценариях — второй символ access):
| Значение | Доступ по SNMP |
|---|---|
0 | Строка ресурса скрыта |
1 | Чтение |
2 | Чтение и запись для Reg, Do, Ao; только чтение для Di и Ai |
Скрытые строки пропускаются при обходе. Чтение скрытой или несуществующей строки в SNMPv2c возвращает noSuchInstance; в SNMPv1 — ошибку noSuchName. Настройки доступа через веб-интерфейс и внешние протоколы независимы.
Подключение к Zabbix
Для X0 и X1 подготовлен шаблон Zabbix 7.0 LTS и инструкция подключения. Он автоматически обнаруживает доступные ресурсы и собирает показатели по SNMP.
MIB и адреса объектов
Скачайте MIB для своей модели:
Оба файла описывают модуль TELEMATIC-MIB и одинаковые числовые OID. Они отличаются допустимым числом выходов Do. Загружайте в программу мониторинга один файл, соответствующий модели, а не оба одновременно. Имена объектов, например TELEMATIC-MIB::model.0, можно использовать после импорта MIB. Без импорта доступны числовые OID из примеров ниже.
Ветка производителя — 1.3.6.1.4.1.57777, ветка объектов контроллера — 1.3.6.1.4.1.57777.1.1. Далее она обозначена как B. Модель X1 использует ту же ветку, что и X0.
Скалярные объекты
В OID скалярного экземпляра обязательно добавляется завершающий .0. Например, model имеет адрес B.1.0.
| OID экземпляра | Имя | Доступ | Значение |
|---|---|---|---|
B.1.0 | model | Чтение | Строка x0 или x1 |
B.2.0 | fwVersion | Чтение | Числовая версия прошивки |
B.3.0 | srvConnect | Чтение | 1 — подключён к серверу, 0 — соединение не установлено |
B.4.0 | sysAlarms | Чтение | Битовая маска системных аварий |
B.5.0 | alarms | Чтение | Битовая маска пользовательских аварий |
B.6.0 | scriptCode | Чтение/запись | Чтение — код текущего или последнего сценария; запись — выбор сохранённого сценария для следующего запуска |
B.7.0 | scriptName | Чтение | Имя текущего или последнего сценария без расширения |
B.8.0 | scriptStatus | Чтение/запись | Чтение: 0 — сценарий ещё не запускался, 1 — выполняется, 2 — остановлен. Запись: 0 — остановить, 1 — запустить выбранный сценарий |
B.9.0 | scriptType | Чтение | 0 — отсутствует, 1 — MicroPython, 2 — C, 3 — бинарный C-сценарий |
B.10.0 | scriptReasonStart | Чтение | Причина последнего запуска |
B.11.0 | scriptReasonStop | Чтение | Причина последней остановки |
B.12.0 | scriptUptime | Чтение | Время выполнения в целых секундах; после остановки — продолжительность последнего запуска |
Код 0 обозначает сценарий из оперативной памяти. Код и имя не обязаны обнуляться при остановке: состояние проверяйте по scriptStatus. Запись scriptCode лишь выбирает сценарий; чтение этого объекта до запуска продолжает показывать код текущего или последнего сценария. Для запуска выбирайте существующий сохранённый сценарий с кодом 1..65534. Значение 2 у scriptStatus доступно только при чтении и не является командой SET.
Причины запуска/остановки:
| Код | Причина |
|---|---|
0 | Нет |
1 | Ошибка |
2 | Автоматическое действие |
3 | Действие пользователя |
4 | Успешное завершение |
5 | Алгоритм |
6 | Планировщик |
7 | Веб-интерфейс |
8 | Внешний запрос, в том числе SNMP |
9 | Пульт управления |
В масках аварий младший бит соответствует аварии с индексом 0, следующий — с индексом 1 и т. д. Маска alarms содержит до 32 бит и передаётся как знаковый Integer32: при установленном бите 31 программа мониторинга может показать отрицательное число. Для побитового разбора восстановите беззнаковое представление: mask = value & 0xffffffff.
Стандартный объект SNMPv2-MIB::sysUpTime.0 (1.3.6.1.2.1.1.3.0) содержит время работы контроллера в сотых долях секунды (TimeTicks). Его единицы отличаются от scriptUptime. Стандартный sysObjectID.0 (1.3.6.1.2.1.1.2.0) возвращает 1.3.6.1.4.1.57777.
Таблицы ресурсов
Все индексы начинаются с нуля. OID ячейки имеет вид B.<таблица>.1.<столбец>.<индекс>; дополнительный .0 к нему не добавляется.
| Таблица | Номер | Индексы X0 | Индексы X1 | Запись значения |
|---|---|---|---|---|
regTable | 13 | 0..regCount-1, максимум 31 | То же | Да, при разрешённом внешнем доступе |
doTable | 14 | 0..2 | 0..4 | Да, при разрешённом внешнем доступе |
diTable | 15 | 0..4 | 0..4 | Нет |
aoTable | 16 | 0..2 | 0..2 | Да, при разрешённом внешнем доступе |
aiTable | 17 | 0..2 | 0..2 | Нет |
Наличие строки при опросе зависит от настроек внешнего доступа. Таблицы описывают физические входы и выходы; количество Reg задаётся конфигурацией.
Во всех таблицах четыре столбца:
| Столбец | Назначение | Тип SNMP | Доступ |
|---|---|---|---|
1 | Индекс ресурса | Integer32 | Чтение |
2 | Значение | Integer32 | По таблице и настройкам доступа |
3 | Тип ресурса | Integer32 | Чтение |
4 | Имя ресурса | OCTET STRING | Чтение |
Имена могут содержать UTF-8. При отсутствии имени возвращается пустая строка. Через SNMP нельзя переименовывать ресурсы или изменять их конфигурацию.
Reg. Типы: 0 — bool, 1 — int, 2 — uint, 3 — float, 4 — enum. Значение передаётся как исходное 32-битное содержимое регистра, без форматирования:
- bool —
0или1, enum — индекс варианта с нуля; - int/uint — целое с масштабом из настройки
dec: например,125приdec=1означает12.5; - uint с установленным старшим битом выглядит как отрицательный
Integer32; используйтеvalue & 0xffffffff; - float — битовое представление IEEE 754 binary32, а не округлённое целое. Например,
1.0передаётся целым1065353216.
Для SET также передавайте исходное представление. Контроллер проверяет допустимые значения bool/enum и включённые ограничения минимума/максимума. Шаг регистра при SET не проверяется и не используется для округления. dec, границы, шаг и список enum через эти таблицы не передаются: программа мониторинга должна знать конфигурацию регистра.
Do и Di. Значение — логическое 0 или 1. Тип Do: 0 — обычный выход, 1 — PWM. Тип Di: 0 — нормально закрытый (nz), 1 — нормально открытый (no); значение уже учитывает выбранный тип. Коэффициент заполнения PWM через таблицу Do не передаётся и не задаётся.
Ao. Значение 0..1000 соответствует 0..100 %, то есть единица SNMP равна 0.1 процентного пункта. Например, 500 задаёт 50 %. Столбец типа возвращает код конфигурации канала и не меняет этот масштаб.
Ai. Значение — знаковое целое. Тип 0 означает исходное измерение АЦП (raw), тип 1 — обработанное значение. Для температурных каналов обработанное значение измеряется в десятых долях °C: -125 означает -12.5 °C, а 32767 обозначает ошибку измерения. На X0 все три входа температурные; на X1 входы 0 и 1 температурные, вход 2 в обработанном режиме измеряет напряжение в сотых долях вольта. Режим raw возвращает отсчёт АЦП, а не готовое напряжение или температуру.
Примеры запросов
Примеры используют утилиты Net-SNMP. Замените 192.168.0.101 адресом своего контроллера и community — своими значениями.
# Модель и состояние подключения к серверу
snmpget -v2c -c public 192.168.0.101 1.3.6.1.4.1.57777.1.1.1.0 1.3.6.1.4.1.57777.1.1.3.0
# Значение Reg с индексом 0
snmpget -v2c -c public 192.168.0.101 1.3.6.1.4.1.57777.1.1.13.1.2.0
# Обход доступных ресурсов
snmpwalk -v2c -c public 192.168.0.101 1.3.6.1.4.1.57777.1.1
# Установить Ao[0] = 50 % (требуется внешний доступ на запись)
snmpset -v2c -c private 192.168.0.101 1.3.6.1.4.1.57777.1.1.16.1.2.0 i 500
Для запуска сохранённого сценария выполните два последовательных запроса: сначала выберите код, затем отправьте команду запуска. Здесь 123 — пример кода существующего сценария.
snmpset -v2c -c private 192.168.0.101 1.3.6.1.4.1.57777.1.1.6.0 i 123
snmpset -v2c -c private 192.168.0.101 1.3.6.1.4.1.57777.1.1.8.0 i 1
snmpget -v2c -c public 192.168.0.101 1.3.6.1.4.1.57777.1.1.8.0
# Остановка сценария
snmpset -v2c -c private 192.168.0.101 1.3.6.1.4.1.57777.1.1.8.0 i 0
Проверяйте ответ каждого SET. Если сценарий отсутствует или операция невозможна в текущем состоянии, контроллер возвращает ошибку. Выбор кода общий для клиентов SNMP: не запускайте параллельно команды выбора и запуска из разных программ.
Уведомления trap
Можно задать два IPv4-адреса получателей. Каждый получатель включается отдельно; также должен быть включён сам SNMP. На принимающем компьютере разрешите входящий UDP 162 и настройте обработку SNMPv1 с community для trap.
Для пользовательских trap поле enterprise равно 1.3.6.1.4.1.57777.1.1, поле generic-trap — 6 (enterpriseSpecific). Поле specific-trap определяет событие:
| Specific | Событие | Переменные в уведомлении |
|---|---|---|
100 | Изменение или сброс аварий | sysAlarms.0 (B.4.0), alarms.0 (B.5.0) |
101 | Запуск сценария | scriptCode.0 (B.6.0), scriptReasonStart.0 (B.10.0) |
102 | Остановка сценария | scriptCode.0 (B.6.0), scriptReasonStop.0 (B.11.0) |
Значения относятся к моменту события. Например, запуск через SNMP передаёт код сохранённого сценария и причину 8. Уведомление об авариях содержит обе маски, в том числе при сбросе последней аварии в ноль.
MIB описывает эти события как alarmsChanged, scriptStarted и scriptStopped. При отображении SNMPv1 trap как SNMPv2 notification программа мониторинга использует OID B.0.100, B.0.101 и B.0.102 соответственно: нулевой компонент перед номером события обязателен. Это стандартное преобразование форматов SNMP, а не отправка SNMPv2 Trap самим контроллером.
Trap передаются по UDP без подтверждения доставки. При потере сети или большом числе событий часть уведомлений может быть потеряна. Для контроля текущего состояния дополняйте их периодическим чтением масок аварий и состояния сценария.