2016-04-25 45 views
2

我使用snmp4j從多個路由器捕獲陷阱數據,但我不知道如何從這些路由器接收源IP地址,哪個路由器是發送者。這就是我下面的代碼,也許是有用的:如何使用snmp4j從多個snmp陷阱接收源IP地址

public class SNMPTrapReceiver implements CommandResponder { 

private MultiThreadedMessageDispatcher dispatcher; 
private Snmp snmp = null; 
private Address listenAddress; 
private ThreadPool threadPool; 
private int n = 0; 

public SNMPTrapReceiver() { 
} 

public static void main(String[] args) { 
    new SNMPTrapReceiver().run(); 
} 

private void run() { 
    try { 
     init(); 
     snmp.addCommandResponder(this); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

private void init() throws UnknownHostException, IOException { 
    threadPool = ThreadPool.create("Trap", 10); 
    dispatcher = new MultiThreadedMessageDispatcher(threadPool, 
      new MessageDispatcherImpl()); 
    listenAddress = GenericAddress.parse(System.getProperty(
      "snmp4j.listenAddress", "udp:0.0.0.0/162")); 
    TransportMapping<?> transport; 
    if (listenAddress instanceof UdpAddress) { 
     transport = new DefaultUdpTransportMapping(
       (UdpAddress) listenAddress); 
    } else { 
     transport = new DefaultTcpTransportMapping(
       (TcpAddress) listenAddress); 
    } 
    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(
      MPv3.createLocalEngineID()), 0); 
    usm.setEngineDiscoveryEnabled(true); 

    snmp = new Snmp(dispatcher, transport); 
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1()); 
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); 
    snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3(usm)); 
    SecurityModels.getInstance().addSecurityModel(usm); 
    snmp.getUSM().addUser(
      new OctetString("MD5DES"), 
      new UsmUser(new OctetString("MD5DES"), AuthMD5.ID, 
        new OctetString("UserName"), PrivDES.ID, 
        new OctetString("PasswordUser"))); 
    snmp.getUSM().addUser(new OctetString("MD5DES"), 
      new UsmUser(new OctetString("MD5DES"), null, null, null, null)); 

    snmp.listen(); 
} 

public void processPdu(CommandResponderEvent event) { 
    StringBuffer msg = new StringBuffer(); 
    msg.append(event.toString()); 
    Vector<? extends VariableBinding> varBinds = event.getPDU() 
      .getVariableBindings(); 
    if (varBinds != null && !varBinds.isEmpty()) { 
     Iterator<? extends VariableBinding> varIter = varBinds.iterator(); 
     while (varIter.hasNext()) { 
      VariableBinding var = varIter.next(); 
      msg.append(var.toString()).append(";"); 
     } 
    } 
    System.out.println("Message Received: " + msg.toString()); 
} 

}

回答