如何利用snmp4j库进行SNMP Trap消息的中文化发送与接收操作
最编程
2024-02-10 18:48:40
...
import cn.sh.ideal.service.NmsService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.snmp4j.*;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.BindException;
import java.time.Duration;
import java.time.Instant;
/**
* 本类用于监听代理进程的Trap信息
* 实现CommandResponder接口的监听器
*/
@Component
public class MultiThreadedTrapReceiver implements CommandResponder {
private MultiThreadedMessageDispatcher dispatcher;
private Snmp snmp = null;
private Address listenAddress;
private ThreadPool threadPool;
@PostConstruct
public void run() {
try {
init();
snmp.addCommandResponder(this);//注册命令响应监听器
System.out.println("开始监听Trap信息!");
} catch (BindException be) {
System.out.println("--初始化snmp本地监听失败,地址/端口无法绑定,请确认本地snmp监听ip和端口配置 "+be.getMessage());
} catch (Exception ex) {
System.out.println("--初始化snmp本地监听端口报错"+ex.getMessage());
ex.printStackTrace();
}
}
private void init() throws IOException {
System.out.println("snmp udp localAddress:"+localAddress);
//创建接收SnmpTrap的线程池,参数: 线程名称及线程数
threadPool = ThreadPool.create("TrapListen", "2");
dispatcher = new MultiThreadedMessageDispatcher(threadPool,
new MessageDispatcherImpl());
//监听端的 ip地址 和 监听端口号
listenAddress = GenericAddress.parse(System.getProperty(
"snmp4j.listenAddress", "udp:127.0.0.1/162"));
TransportMapping<?> transport;
if (listenAddress instanceof UdpAddress) {
transport = new DefaultUdpTransportMapping((UdpAddress) listenAddress);
} else {
transport = new DefaultTcpTransportMapping((TcpAddress) listenAddress);
}
snmp = new Snmp(dispatcher, transport);
snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
//开启Snmp监听,可以接收来自Trap端的信息。
snmp.listen();
}
/**
* 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息
* @param respEvnt
*/
public void processPdu(CommandResponderEvent respEvnt) {
// 解析Response
if (respEvnt != null && respEvnt.getPDU() != null) {
Vector<VariableBinding> recVBs = (Vector<VariableBinding>) respEvnt.getPDU().getVariableBindings();
for (int i = 0; i < recVBs.size(); i++) {
VariableBinding recVB = recVBs.elementAt(i);
System.out.println("OID: "+recVB.getOid() + " `,Variable: " + recVB.getVariable());
}
}
}
}