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 равно нулю.