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

how to init snmp V3 Parameters to get snmpV3 trap using AdventNet

我正在尝试使用 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-Soft 浏览器监视陷阱,则会正确接收到陷阱。 这是我的代码:

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) 也不例外。 但是回调里面什么都没有

欢迎任何建议!!!

事实证明,发送陷阱的设备的时间同步有问题,我的代码运行正常。

可能 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);
        }

    }