2015-06-02 152 views
0

我在同時運行SNMP管理器和接收器的應用程序中使用SNMP4j 1.11.3。在這種情況下,當Java進程啓動時,V3陷阱接收器正在從配置中正常加載所有v3用戶,但是一旦SNMP v3管理器開始向設備發出獲取/設置請求,陷阱接收器就會停止接收陷阱並說「RFC3414§3.2。 4未知安全名稱「,當它試圖解密v3陷阱時。管理員清除SNMP v3陷阱用戶

由於看起來snmp4j使用單體SecurityModels來保存USM用戶集合,因此當管理器創建新的snmp會話和addusmuser時,它將清除USM用戶的陷阱,這就是爲什麼陷阱接收器無法處理陷阱。

SNMP管理器請求代碼的初始化是如下

Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); 
USM usm = new USM(SecurityProtocols.getInstance(), 
        new OctetString(MPv3.createLocalEngineID()), 0); 
SecurityModels.getInstance().addSecurityModel(usm); 
snmp.getUSM().addUser(securityName, new UsmUser(securityName, 
                authProtocol, 
                authPassphrase, 
                privProtocol, 
                privPassphrase)); 

我怎麼能避免這個問題,我在想什麼?經濟運行管理器和接收器運行在不同的線程上。

乾杯, Reddy。

回答

1

現在更改爲以下代碼後,管理器每個SNMP請求將具有自己的USM usertable陷阱接收器正常工作。罪魁禍首是在Global SecuirtyModels Singleton USM上添加新的安全模型。

Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); 
USM usm = new USM(SecurityProtocols.getInstance(), 
        localEngineID, 
        engineBootCount); 
usm.addUser(securityName, new UsmUser(securityName, 
       authProtocol, 
       authPassphrase, 
       privProtocol, 
       privPassphrase)); 
MessageProcessingModel oldModel = snmp.getMessageDispatcher().getMessageProcessingModel(MessageProcessingModel.MPv3); 
if (oldModel != null) {  
    snmp.getMessageDispatcher().removeMessageProcessingModel(oldModel); 
} 
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3(usm));