Как получить несколько значений OID в SNMP?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как получить несколько значений OID в SNMP?

Сообщение Anonymous »

Я использую pysnmp, установленный с помощью pysnmp-lextudio. Я выбрал этот пакет, потому что он является чистым Python и, следовательно, кроссплатформенным. Другие библиотеки были либо слишком сложны для моего понимания, либо не были кросс-платформенными, либо требовали установки внешних системных зависимостей.
В настоящее время я говорю о CyberPower PDU, который по сути является мощным снабжение управляемыми розетками с помощью следующей команды get_data:

Код: Выделить всё

def get_data(ip_address: str, object_identity: str) -> int | str:
"""Get the OID's value. Only integer and string values are currently supported."""
iterator = getCmd(
SnmpEngine(),
CommunityData("public", mpModel=0),
UdpTransportTarget(transportAddr=(ip_address, 161), timeout=1, retries=0),
ContextData(),
ObjectType(ObjectIdentity(object_identity)),
)

error_indication, error_status, error_index, variable_bindings = next(iterator)

if error_indication:
raise RuntimeError(str(error_indication))
elif error_status:
raise RuntimeError(str(error_status))
else:
[variable_binding] = variable_bindings
[_oid, value] = variable_binding
return convert_snmp_type_to_python_type(value)
Для 16-портового PDU вызов get_data 16 раз занимает чуть больше секунды. Каждый вызов get_data занимает около 70 мс. Это проблематично, поскольку затрудняет реагирование графического пользовательского интерфейса на фактическое состояние розетки. Я хочу, чтобы подпроцесс эффективно работал с частотой от 1 до 2 Гц и получал состояние всех розеток. Это связано с тем, что розетка может быть выключена или включена чем-то внешним по отношению к графическому интерфейсу, поэтому она должна иметь возможность точно отображать фактическое состояние.
Поэтому я попытался изменить свою команду на что-нибудь. вот так:

Код: Выделить всё

def get_multiple_data(ip_address: str, object_identities: list[str]) -> int | str:
"""Get the OID's value. Only integer and string values are currently supported."""
# The OID for retrieving an outlet's state is hardcoded for debugging purposes
ids = [".1.3.6.1.4.1.3808.1.1.3.3.5.1.1.4.{}".format(outlet) for outlet in range(1, 17)]
oids = [ObjectType(ObjectIdentity(id)) for id in ids]
print("OIDs: " + str(oids))
iterator = getCmd(
SnmpEngine(),
CommunityData("public", mpModel=0),
UdpTransportTarget(transportAddr=(ip_address, 161), timeout=10, retries=0),
ContextData(),
*oids,
)

error_indication, error_status, error_index, variable_bindings = next(iterator)

...
Похоже, это работает, когда список oids состоит только из одного или двух элементов, но время ожидания полного списка из 16 OID для 16 выходов истекает. И время ожидания истекает, даже если я подожду около 5 секунд. Так что я не совсем понимаю, что происходит.
Я знаю, что существует также BulkCmd, но я не совсем уверен, как его использовать, поскольку SNMP для меня новый. и довольно загадочно.

Резюме: у меня есть список OID:

Код: Выделить всё

ids = [".1.3.6.1.4.1.3808.1.1.3.3.5.1.1.4.{}".format(outlet) for outlet in range(1, 17)]
Я ищу самый быстрый способ их запроса, чтобы время ответа было значительно меньше секунды для состояния всех 16 торговых точек. В идеале решение использует пакет pysnmp, но я открыт для других пакетов, если они являются кроссплатформенными и не требуют зависимостей от внешней системы.


Подробнее здесь: https://stackoverflow.com/questions/780 ... es-in-snmp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Динамическое увеличение OID на стороне агента SNMP
    Anonymous » » в форуме Python
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Слой [<класс 'scapy.layers.snmp.SNMP'>] не найден
    Anonymous » » в форуме Python
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Исключение SNMP GET snmp, когда ответ в V1 имеет конечные байты данных при использовании SharpSnmp
    Anonymous » » в форуме C#
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как получить несколько значений OID в PySNMP?
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Каков наиболее эффективный способ очистки нескольких одиночных и ветвящихся OID?
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»