代码之家  ›  专栏  ›  技术社区  ›  yogev levi

如何使用AdventNet初始化snmp V3参数以获取snmpV3陷阱

  •  1
  • yogev levi  · 技术社区  · 8 年前

    我正在尝试使用Adventnet从设备接收SNMP v3陷阱。


    在获取陷阱时,我看到抛出以下AdventNet异常:

    Exception while constructing message after receiving PDU. Dropping this PDU received from xxx.xxx.xxx.xxx.  com.adventnet.snmp.snmp2.SnmpException: Parse Header: Incorrect Scoped data
    

    如果我使用NG软浏览器监控陷阱,陷阱将被正确接收。 这是我的代码:

    private void initV3Parameters(NEData neData) throws InterruptedException
    {
        logger.debug("in.");
        try
        {
            logger.debug(".in");
    
            SnmpAPI m_api = new SnmpAPI();
            m_api.setDebug( true );
            SnmpSession m_session = new SnmpSession(m_api);
            m_session.addSnmpClient(this);
            UDPProtocolOptions m_udpOpt = new UDPProtocolOptions();
            m_udpOpt.setRemoteHost(neData.m_szIpAddress);
            m_session.setProtocolOptions(m_udpOpt);
            try
            {
                m_session.open();
                String message="Succes to bind port: "+session.getLocalPort();
                logger.info(message);
                System.out.println(message);
            }
            catch (Exception ex)
            {
                String message = "Failed to open session - Port in use or permission denied. \n Message-  "+ ex.getMessage() + "\n Will exit from Trap process. ";
                logger.error(message, ex);
                System.err.println(message);
                throw new RuntimeException(message);
            }   
    
            SnmpEngineEntry engineentry = new SnmpEngineEntry(neData.m_szIpAddress, m_udpOpt.getRemotePort());
            SnmpEngineTable enginetable = m_api.getSnmpEngine();
            enginetable.addEntry(engineentry);
            try
            {
                engineentry.discoverSnmpEngineID(m_session,10000,3);
            }
            catch (Exception e)
            {
                logger.error("Failed to discover snmp EngineID. " + e.getMessage());
                printToLog("failed",neData);
                return;
            }
            USMUserEntry entry = new USMUserEntry(neData.usmUser.getBytes(), engineentry.getEngineID());
            entry.setAuthProtocol(Integer.parseInt(neData.authProtocol));
            entry.setAuthPassword(neData.authPassword.getBytes());
            entry.setPrivProtocol(Integer.parseInt(neData.privProtocol));
            entry.setPrivPassword(neData.privPassword.getBytes());
    
            byte[] authKey = USMUtils.password_to_key(entry.getAuthProtocol(),
                                                      neData.authPassword.getBytes(),
                                                      neData.authPassword.getBytes().length,
                                                      engineentry.getEngineID());
            entry.setAuthKey(authKey);
            byte[] privKey = USMUtils.password_to_key(entry.getAuthProtocol(),
                                                      neData.privPassword.getBytes(),
                                                      neData.privPassword.getBytes().length,
                                                      engineentry.getEngineID());
            entry.setPrivKey(privKey);
            entry.setEngineEntry(engineentry);
            entry.setSecurityLevel(Snmp3Message.AUTH_PRIV);
    
            SecurityProvider provider = m_api.getSecurityProvider();
            USMUserTable userTable = (USMUserTable) provider.getTable(3);
            userTable.addEntry(entry);
            entry.timeSynchronize(m_session, m_udpOpt);
            printToLog("success",neData);
        }
        catch (Exception exp)
        {
            logger.error(exp.getMessage()+" for ip = "+neData.m_szIpAddress,exp);
            discoveredDeque.put(neData);
            printToLog("failed",neData);
        }
    
    }
    

    我也尝试过使用高级API

    USMUtils.init_v3_parameters(
                        neData.usmUser,
                        null,
                        Integer.valueOf(neData.authProtocol),
                        neData.authPassword,
                        neData.privPassword,
                        udpOptions,
                        session,
                        false,
                        Integer.valueOf(neData.privProtocol));
    

    在这种情况下,我看到陷阱使用 public void debugPrint (String debugOutput) 抛出也不例外。 但回调中没有任何内容

    欢迎任何建议!!!

    1 回复  |  直到 8 年前
        1
  •  0
  •   yogev levi    8 年前

    事实证明,发送陷阱的设备的时间同步有问题,我的代码工作得非常好。

    可能NG Soft不在乎时间同步。。。

    我在这里附上我的代码,以防你们中的任何人将来需要它。。。

    private SnmpSession session;
    
    /**
    * Create a listener for trap version 1-2 
    */
            public void trapsListener ()
            {
                logger.debug(".in");
    
                SnmpAPI api = new SnmpAPI();
        //      api.setDebug( true );
                session = new SnmpSession(api);
                session.addSnmpClient(this);
                UDPProtocolOptions udpOpt = new UDPProtocolOptions();
                udpOpt.setLocalPort(TRAP_PORT);
                session.setProtocolOptions(udpOpt);
                try
                {
                    session.open();
                    String message="Succes to bind port: "+session.getLocalPort();
                    logger.info(message);
                    System.out.println(message);
                }
                catch (Exception ex)
                {
                    String message = "Failed to open session - Port in use or permission denied. \n Message-  "+ ex.getMessage() + "\n Will exit from Trap process. ";
                    logger.error(message, ex);
                    System.err.println(message);
                    throw new RuntimeException(message);
                }   
            }
    
    
    /**
    * For each new device
    * 1) discover the snmp engineID 
    * 2) create SnmpEngineEntry and add it to SnmpEngineTable
    * 3) create USMUserEntry  and add it to USMUserTable 
    * 4) performs time synchronization
    **/
        private void initV3Parameters(Device data) throws InterruptedException
        {
            logger.debug("in.");
            try
            {
                UDPProtocolOptions udpOptions = new UDPProtocolOptions();
                udpOptions.setLocalPort(TRAP_PORT);
                udpOptions.setRemoteHost(data.getIpAddress());
    
                USMUtils.init_v3_parameters(
                        data.getUsmUser(),
                        null,// null means that the SNMPv3 discovery will be activated
                        Integer.valueOf(data.getAuthProtocol()),
                        data.getAuthPassword(),
                        data.getPrivPassword(),
                        udpOptions,
                        session,
                        false,
                        Integer.valueOf(data.getPrivProtocol()));
                printToLog("secsses",data);
            }
            catch (SnmpException exp) {
                logger.error(exp.getMessage()+" for ip = "+data.getIpAddress(),exp);
                printToLog("failed",data);
            }
    
        }