不适用于 TCP 的 SNMP 代码

SNMP code that does not work with TCP

我得到了一个 SNMPV3 陷阱的例子,当我使用 DefaultUdpTransportMapping 时它工作正常但是当我使用 DefaultTcpTransportMapping 时,它将 return 空响应事件。

我还在下面附上了代码。

public class SnmpUtilSendTrapV3 {

    private Snmp snmp = null;
    private Address targetAddress = null;

    // private TcpAddress targetAddress = null;

    public void initComm() throws IOException {
        targetAddress = new TcpAddress(Inet4Address.getLocalHost(), 162);
        // targetAddress = GenericAddress.parse("127.0.0.1/162");
        TransportMapping transport = new DefaultTcpTransportMapping();
        snmp = new Snmp(transport);

        snmp.listen();

    }

    /**
     * send trap
     *
     * @throws IOException
     */
    public void sendPDU() throws IOException {
        UserTarget target = new UserTarget();
        target.setAddress(targetAddress);
        target.setRetries(2);
        target.setTimeout(1500);
        // snmp version
        target.setVersion(SnmpConstants.version3);

        // target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);
        target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
        target.setSecurityName(new OctetString("MD5DES"));

        USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
                MPv3.createLocalEngineID()), 0);
        usm.setEngineDiscoveryEnabled(true);
        SecurityModels.getInstance().addSecurityModel(usm);

        UsmUser user = new UsmUser(new OctetString("MD5DES"), AuthMD5.ID,
                new OctetString("MD5DESUserAuthPassword"), PrivDES.ID,
                new OctetString("MD5DESUserPrivPassword"));
        snmp.getUSM().addUser(new OctetString("MD5DES"), user);

        // create PDU
        ScopedPDU pdu = new ScopedPDU();
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.3.0"),
                new OctetString("DemoTrapv3")));
        pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"),
                new OctetString("Demo")));
        pdu.setType(PDU.TRAP);

        // send PDU to Agent and recieve Response
        ResponseEvent respEvnt = snmp.send(pdu, target);

        // analyze Response
        if (respEvnt != null && respEvnt.getResponse() != null) {
            Vector<VariableBinding> variableBindings = (Vector<VariableBinding>) respEvnt
                    .getResponse().getVariableBindings();
            Vector<VariableBinding> recVBs = variableBindings;
            for (int i = 0; i < recVBs.size(); i++) {
                VariableBinding recVB = recVBs.elementAt(i);
                System.out
                        .println(recVB.getOid() + " : " + recVB.getVariable());
            }
        }
        snmp.close();
    }

    public static void main(String[] args) {
        try {
            SnmpUtilSendTrapV3 util = new SnmpUtilSendTrapV3();
            util.initComm();
            util.sendPDU();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}



public class MultiThreadedTrapReceiver implements CommandResponder {

    private Address address = GenericAddress.parse("0.0.0.0/162");
    private int numDispatcherThreads = 2;
    private OID authProtocol = AuthMD5.ID;
    private OID privProtocol = PrivDES.ID;
    private OctetString securityName = new OctetString("MD5DES");
    private OctetString privPassphrase = new OctetString(
            "MD5DESUserPrivPassword");
    private OctetString authPassphrase = new OctetString(
            "MD5DESUserAuthPassword");

    public MultiThreadedTrapReceiver() {
        try {
            listen();
        } catch (IOException ex) {
            System.out.println(ex);

        }
    }

    public synchronized void listen() throws IOException {
        AbstractTransportMapping transport;
        if (address instanceof TcpAddress) {
            transport = new DefaultTcpTransportMapping((TcpAddress) address);
        } else {
            transport = new DefaultUdpTransportMapping((UdpAddress) address);
        }
        ThreadPool threadPool = ThreadPool.create("DispatcherPool",
                numDispatcherThreads);
        MessageDispatcher mtDispatcher = new MultiThreadedMessageDispatcher(
                threadPool, new MessageDispatcherImpl());

        // add message processing models
        mtDispatcher.addMessageProcessingModel(new MPv1());
        mtDispatcher.addMessageProcessingModel(new MPv2c());
        mtDispatcher.addMessageProcessingModel(new MPv3(new OctetString(MPv3
                .createLocalEngineID()).getValue()));

        // add all security protocols
        SecurityProtocols.getInstance().addDefaultProtocols();
        SecurityProtocols.getInstance().addPrivacyProtocol(new Priv3DES());

        Snmp snmp = new Snmp(mtDispatcher, transport);
        USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
                MPv3.createLocalEngineID()), 0);
        SecurityModels.getInstance().addSecurityModel(usm);
        // Add the configured user to the USM
        addUsmUser(snmp);

        snmp.addCommandResponder(this);

        transport.listen();

        try {
            this.wait();
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
        }
    }

    private void addUsmUser(Snmp snmp) {
        snmp.getUSM().addUser(
                securityName,
                new UsmUser(securityName, authProtocol, authPassphrase,
                        privProtocol, privPassphrase));
    }

    @Override
    public void processPdu(CommandResponderEvent respEvnt) {
        System.out.println(respEvnt.getPDU());
        InetAddress pduAgentAddress = null;
        // System.out.println(respEvnt.getPDU() + " recieved;");
        // this.setPdu(respEvnt.getPDU());
        OctetString community = new OctetString(respEvnt.getSecurityName());
        System.out.println("community: " + community.toString());

        // handle the SNMP v1
        if (respEvnt.getPDU().getType() == PDU.V1TRAP) {
            Address address = respEvnt.getPeerAddress();
            String hostName = address.toString().split("/")[0];
            int nPort = Integer.parseInt(address.toString().split("/")[1]);
            try {
                pduAgentAddress = InetAddress.getByName(hostName);
            } catch (UnknownHostException ex) {

            }
            System.out.println("hostname: " + pduAgentAddress.getHostAddress()
                    + "; port: " + nPort);
        } else {
            Address address = respEvnt.getPeerAddress();
            String hostName = address.toString().split("/")[0];
            int nPort = Integer.parseInt(address.toString().split("/")[1]);
            try {
                pduAgentAddress = InetAddress.getByName(hostName);
            } catch (UnknownHostException ex) {

            }
            System.out.println("hostname: " + pduAgentAddress.getHostAddress()
                    + "; port: " + nPort);
        }
    }

    public static void main(String[] args) {
        MultiThreadedTrapReceiver trap = new MultiThreadedTrapReceiver();
    }
}

我在 SnmpUtilSendTrapV3 class,

中进行了更改
  1. .使用TcpAddress targetAddress代替Address targetAddress

  2. 使用targetAddress = new TcpAddress(Inet4Address.getLocalHost(), 162);代替targetAddress = GenericAddress.parse("127.0.0.1/164");

  3. TransportMapping transport = new DefaultTcpTransportMapping(); 而不是 TransportMapping transport = new DefaultUdpTransportMapping();

此实现错误解决后,但在使用 snmp.send(pdu, target) 发送 pdu 后,每次 ResponseEvent 都有空值。

谁有解决这个问题的方法,请帮助我