java - 如何使用 snmp4j 从多个 snmp 陷阱接收源 IP 地址

标签 java snmp snmp4j

我正在使用 snmp4j 从多个路由器捕获陷阱数据,但我不知道如何从这些路由器接收源 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());
}

最佳答案

CommandResponderEvent 在 getPeerAddress() 成员中包含发件人地址: 参见 http://www.snmp4j.org/doc/org/snmp4j/CommandResponderEvent.html#getPeerAddress()

如果陷阱由代理转发,snmpTrapAddress.0 变量绑定(bind)(在 SNMP-COMMUNITY-MIB,RFC3584 中定义)将包含原始陷阱发送者的地址。

关于java - 如何使用 snmp4j 从多个 snmp 陷阱接收源 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36844017/

相关文章:

java - 在Hibernate中,除了如何处理坏ID之外,session.get()和session.load()之间还有什么区别吗?

java - 如何为多个 JVM 使用一个 JMX 代理?

java - 替代 SNMP4J(发送陷阱)

javascript - 正确嵌套 Redis 回调

go - 对 SNMP 消息进行编码并从代理读取响应

java - SNMP 构造函数需要几秒钟才能返回

jvm - 使用 SNMP 监控 JVM

java - 如何使用 TextView 或任何布局制作横幅或功能区

java - 通过java代码运行.dmg文件

java - 奇怪的 FileInputStream/Data FileInputStream 行为 : seek()ing to odd positions