2016-04-25 14 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()); 
} 

}

答えて

1

CommandResponderEventはgetPeerAddress()メンバー内の送信者アドレスが含まれています トラップはプロキシによって転送された場合http://www.snmp4j.org/doc/org/snmp4j/CommandResponderEvent.html#getPeerAddress()

を参照してください、 snmpTrapAddress.0変数バインディング(SNMP-COMMUNITY-MIB、RFC3584で定義)には、元のトラップ送信者のアドレスが含まれます。

関連する問題