Модель обработки сообщений 3 вернула ошибку: Неизвестное имя безопасности

Я получаю Message processing model 3 returned error: Unknown security name ошибку при выполнении команды get / getNext для одного устройства. Ударяю по устройству каждые 2 секунды. Чтобы иметь лучшую производительность, если я хочу получить разные таблицы. Я создаю поток и получаю доступ к каждому потоку параллельно из своего приложения. Когда я получаю доступ к устройству в однопоточном режиме, все запросы работают нормально. Однако, когда я запускаю его в многопоточном режиме, я периодически получаю указанную выше ошибку (2 сбоя в 10 запросах). Вот трассировка стека.

2014-06-11 11:26:10,371 [http-8080-6] INFO  com.kp.SnmpV3Connection - User Target: Security level is: 3Security Name is: user7
2014-06-11 11:26:10,371 [http-8080-3] INFO  com.kp.SnmpV3Connection - User Target: Security level is: 3Security Name is: user7
2014-06-11 11:26:10,373 [http-8080-6] DEBUG org.snmp4j.security.UsmUserTable - Adding user user7 = UsmUser[secName=user7,authProtocol=1.3.6.1.6.3.10.1.1.3,authPassphrase=kp-pass,privProtocol=1.3.6.1.6.3.10.1.2.4,privPassphrase=kp-pass,localizationEngineID=null]
2014-06-11 11:26:10,373 [http-8080-6] DEBUG org.snmp4j.security.UsmUserTable - Adding user user7 = UsmUser[secName=user7,authProtocol=1.3.6.1.6.3.10.1.1.3,authPassphrase=kp-pass,privProtocol=1.3.6.1.6.3.10.1.2.4,privPassphrase=kp-pass,localizationEngineID=null]
2014-06-11 11:26:10,374 [http-8080-6] DEBUG org.snmp4j.security.USM - Security name not found for engineID=, securityName=75:73:65:72:37
2014-06-11 11:26:10,374 [http-8080-6] DEBUG org.snmp4j.security.USM - Security name not found for engineID=, securityName=75:73:65:72:37
2014-06-11 11:26:10,376 [http-8080-6] ERROR org.snmp4j.util.TableUtils - org.snmp4j.MessageException: Message processing model 3 returned error: Unknown security name
2014-06-11 11:26:10,376 [http-8080-6] ERROR org.snmp4j.util.TableUtils - org.snmp4j.MessageException: Message processing model 3 returned error: Unknown security name

Согласно приведенной ссылке здесь I ' m, используя следующую модель безопасности:

USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
                    MPv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm);

Другой вариант noAuthNopriv мне не подходит, мне нужно запустить его в authpriv. Может ли кто-нибудь указать мне правильное направление.

Я считаю, что это проблема с каким-то сеансом snmp или engineId.

********************** РЕДАКТИРОВАТЬ ******************** **

После нескольких недель расследования я наконец обнаружил, что способ создания объекта USM

USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);

Я создавал этот объект для каждого запроса и добавлял его в модель безопасности, что приводило к воссозданию UserTable и таблицы времени пользователя. Я исправил проблему, сделав USM одноэлементным и предотвратив повторное создание таблицы USM. Однако у меня возникла новая проблема, теперь я получаю сообщение об ошибке

2014-06-24 07:11:19,671 [DefaultUDPTransportMapping_10.110.113.75/0] DEBUG org.snmp4j.mp.MPv3 - SNMPv3 header decoded: msgId=1263968764, msgMaxSize=65535, msgFlags=03, secModel=3
2014-06-24 07:11:19,671 [DefaultUDPTransportMapping_10.110.113.75/0] DEBUG org.snmp4j.security.USM - getUser(engineID=80:00:05:49:04:4d:49:4d:49:43, securityName=user10)
2014-06-24 07:11:19,671 [DefaultUDPTransportMapping_10.110.113.75/0] DEBUG org.snmp4j.security.UsmTimeTable - CheckTime: received message outside time window (non authoritative)
2014-06-24 07:11:19,671 [DefaultUDPTransportMapping_10.110.113.75/0] DEBUG org.snmp4j.security.USM - RFC3414 ?3.2.7.a Not in time window; engineID='80:00:05:49:04:4d:49:4d:49:43', engineBoots=5, engineTime=58766
2014-06-24 07:11:19,671 [DefaultUDPTransportMapping_10.110.113.75/0] WARN  org.snmp4j.MessageDispatcherImpl - statusInfo=1.3.6.1.6.3.15.1.1.2.0 = 0, status=1411

После некоторого расследования я обнаружил, что snmp4j не обновляет время ядра как свое, так и время ядра устройства в UserTimeTable.


Помимо этой проблемы, у меня есть еще несколько запросов.

  1. Если я сделаю USM одноэлементной таблицей USM, срок ее службы будет соответствовать моему приложению. Как очистить эту таблицу (у меня могут быть десятки тысяч устройств, что в конечном итоге может привести к нехватке памяти). На каком основании я могу очистить этих пользователей?

  2. Как я могу заставить SNMP4J явно запрашивать загрузку двигателя и время двигателя

  3. Как SNMP4J различает устройство, если у него такое же имя пользователя и имя безопасности, но другая фраза авторизации и фраза конфиденциальности и (возможно, тот же engineId, что и будет) Заранее спасибо.


person Karthik Prasad    schedule 11.06.2014    source источник


Ответы (1)


Когда я сделал USM синглтоном и получил единственный UsmUserTable, проблема с моделью безопасности была решена.

USM usm = USMFactory.getInstance();

И received message outside time window была проблема с устройством, которое я настроил. Все устройства имели одинаковый идентификатор двигателя. Когда я сделал engineId уникальным, проблема была решена.

person Karthik Prasad    schedule 27.06.2014