在单个设备上运行get / getNext命令时出现Message processing model 3 returned error: Unknown security name错误。我每2秒点击一次设备。为了有更好的性能,如果我想得到不同的表。我创建线程并从我的应用程序并行访问每个线程。当我以单线程模式访问设备时,所有请求都可以正常工作。但是,当我在多线程模式下运行它时,我会间歇性地遇到错误(10个请求中有2个失败)。这是堆栈跟踪。

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


根据here给定的链接,我正在使用以下安全性模型:

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);


我正在为每个请求创建此对象,并将其添加到securitymodel中,从而重新创建了UserTable和usertime表。我通过使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中同时更新引擎时间和设备时间。



除了这个问题,我还有其他一些查询。


如果我将USM做成单例USM表,则其寿命取决于我的应用程序。如何清除该表(我可能有数万个设备,最终可能导致内存不足)。在什么基础上我可以清除此用户?
如何使SNMP4J明确要求引擎启动和引擎时间
如果SNMP4J具有相同的用户名和安全名称,但具有不同的身份验证短语和隐私短语以及(可能具有相同的engineId),则如何区分设备
提前致谢。

最佳答案

当我将USM设置为一个单例并通过一个UsmUserTable时,解决了安全模型问题。

USM usm = USMFactory.getInstance();


received message outside time window是我配置的设备的问题。所有设备都具有相同的engineId。当我使engineId唯一时,问题就解决了。

关于java - 消息处理模型3返回错误:未知的安全名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24164701/

10-10 09:17