snmpGetVariableBindings возвращает ноль и ASN1_ERROR_ERR, когда размер ObjectIDList> 8

Я пытаюсь запросить устройство для конкретных датчиков, и получить ASN1_ERROR_ERR в зависимости от количества oids, которые я указываю. Вот код, где проблема.

target.setObjectIDList(objID);
try {
    resultArray= target.snmpGetVariableBindings();
} catch (Exception ex) {
    logger.logError(ex.getMessage());
}

Переменная 'target' представляет собой com.adventnet.snmp.beans.SnmpTarget, а objID представляет собой массив строк oids. Список oids все взяты из одной таблицы MIB. Когда я указываю 8 из них, это работает: resultArray не является нулевым, содержит ожидаемые значения, а target.getErrorCode() возвращает 0 (без ошибок). Когда я указываю 9 oids, resultArray равен null, а target.getErrorCode() равен 50 (что означает ASN1_ERROR_ERR: "SNMP ASN1Error обнаружен из-за недопустимого пакета SNMP, полученного от [ip моего устройства]). Кажется, не имеет значения, какие oids я указываю, и каждая работа, если указана самостоятельно.

Вот пример oids, которые я отправляю:

.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.1
.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.2
.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.3
.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.4
.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.5
.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.6
.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.7
.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.8

как только я добавлю

.1.3.6.1.4.1.19536.10.1.3.1.1.12.1.9

в список, когда это не работает. Хотя я могу нормально использовать oids 2-9, а затем добавить 10, и это не работает.

Есть мысли о том, что происходит?

1 ответ

Это из-за ответа SNMP с превышенным размером пакета:

  • при вызове с 8 OID ваша библиотека AdventNet создает запрос, сделанный из пакета UDP, инкапсулированного в дейтаграмму IP размером 236 байт;
  • Когда вы добавляете девятый OID, IP-датаграмма имеет еще 22 байта.

Но ответ SNMP больше, чем запрос: он включает значение для каждого запрошенного OID. Затем ваш удаленный агент snmp не может поместить все запрошенные ответы в ответ UDP, когда вы добавляете слишком много OID в один запрос. Таким образом, согласно RFC-1157, он добавляет индикатор ошибки в ответный пакет: если размер GetResponse-PDU, сгенерированного, как описано ниже, будет превышать локальное ограничение, то принимающий объект отправляет отправителю полученного сообщения GetResponse. -PDU идентичной формы, за исключением того, что значение поля error-status равно tooBig, а значение поля error-index равно нулю.

Другие вопросы по тегам