我在为单个设备运行 get/getNext 命令时收到消息处理模型 3 返回错误:未知安全名称
错误。我每 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 session 或 engineId 的问题。
************************ 编辑 ***************** *****
经过几周的调查,我终于发现我创建 USM 对象的方式
USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
我为每个请求创建这个对象并添加到安全模型中,从而重新创建 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();
并且在时间窗口之外收到消息
是我配置的设备的问题。所有设备都有相同的engineId。当我使engineId唯一时,问题就解决了。
关于java - 消息处理模型3返回错误: Unknown security name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24164701/