snmp中告警消息的处理

[/code]最近一段时间做了一个网管的代理,学习了一些关于snmp的相关消息.刚开始的时候觉得特别地迷惑,还好找到了一些以前别人写的一些例子.觉得给我的帮助很大.现在项目做完了,我也想自己总结一下.给正在学习和彷徨中的人一点指导.欢迎拍砖.
首先说一下消息的发送,让我们来看一下发送的一个例子:
[code="java"]public static void init() {
try {
// 创建一个DaemonTaskServer处理snmp的traps
// 你也可以不用DaemonTaskServer,但使用DaemonTaskServer
// 处理收到的PDU单元,可以更快的腾出来用于接收trap的socket,
// 这样可以减少丢包(trap是udp包)
// 把DaemonTaskServer的线程设置为NORM_PRIORITY,这样
// trap接收的线程可以优先于trap处理的线程
final DaemonTaskServer taskServer = new DaemonTaskServer();
taskServer.start(Thread.NORM_PRIORITY);
// 为snmp的trap包创建分配器(SnmpEventReportDispatcher)和监听器
// SnmpEventReportDispatcher做为一个线程运行,并且在指定的端口监听traps
int listePort = Integer.parseInt(PropertyReader.getValue("listenPort"));

final SnmpEventReportDispatcher trapAgent = new SnmpEventReportDispatcher(listePort,
null, taskServer, null);
// 把TrapListenerImpl作为snmp trap的监听器
// TrapListenerImpl处理trap pdu包
trapAgent.addTrapListener(new TrapListenerImpl());
final Thread trapThread = new Thread(trapAgent);
trapThread.setPriority(Thread.MAX_PRIORITY);
trapThread.start();
} catch (Exception e) {
}
}

上面主要是建立了一个DaemonTaskServer,并在指定的端口进行监听,监听到消息的处理类为TrapListenerImpl.代码如下:
public void processSnmpTrapV1(SnmpPduTrap trap) {
// System.out.println("NOTE: TrapListenerImpl received trap :");
// System.out.println("\tGeneric " + trap.genericTrap);
// System.out.println("\tSpecific " + trap.specificTrap);
// System.out.println("\tTimeStamp " + trap.timeStamp);
// System.out.println("\tAgent adress " + trap.agentAddr.stringValue());
log.info(NAME + "NOTE: Trap V1 not of interest !!!");
}

public void processSnmpTrapV2(SnmpPduRequest trap) {
SnmpVarBindList varbindList = new SnmpVarBindList();
log.info(NAME + "收到TrapV2消息:");
int len = trap.varBindList.length;
for (int i = 0; i < len; i++) {
log.info(NAME + "" + "oid : " + trap.varBindList[i].getOid() + " val : "
+ trap.varBindList[i].getSnmpValue());
SnmpVarBind svb = trap.varBindList[i];
varbindList.add(svb);
}
try {
String sendIP = PropertyReader.getValue("sendIP");
int sendPort = Integer.parseInt(PropertyReader.getValue("sendPort"));
senderTrap.send(varbindList, sendIP, sendPort);
} catch (IOException e) {
log.error(NAME + "发送告警消息失败,原因:", e);
} catch (SnmpStatusException e) {
log.error(NAME + "发送告警消息失败,原因:", e);
}
}

public void processSnmpTrapV3(SnmpScopedPduRequest trap) {
// println("NOTE: TrapListenerImpl received trap V3:");
// println("\tContextEngineId : " + SnmpEngineId.createEngineId(trap.contextEngineId));
// println("\tContextName : " + new String(trap.contextName));
// println("\tVarBind list :");
// for (int i = 0; i < trap.varBindList.length; i++)
// println("oid : " + trap.varBindList[i].getOid() + " val : "
// + trap.varBindList[i].getSnmpValue());
log.info(NAME + "NOTE: Trap V3 not of interest !!!");

}

这个类中主要是处理三个告警消息SnmpTrapV1,SnmpTrapV2,SnmpTrapV3,处理时根据发送消息的类型来进行处理.


再来看看发送的代码吧.
SnmpTrapV1的代码:
public static void main(String args[]) {   

try {

int port = 8085;
snmpAdaptor = new SnmpAdaptorServer(port);

snmpAdaptor.start();

print("NOTE: Sending a coldStart SNMP trap to"
+ " each destination defined in the ACL file...");
snmpAdaptor.setTrapPort(new Integer(port + 1));
snmpAdaptor.snmpV1Trap(0, 0, null);
println("v1 Done.");
} catch (Exception e) {
e.printStackTrace();
}
}
使用snmpAdaptor.snmpV1Trap(0, 0, null)可以像目的端(接收snmp trap的程序)发送一个trap。

SnmpTrapV2的代码:
 public void send(SnmpVarBindList varbindList, String ip, int port) throws IOException,
SnmpStatusException {
sendServer.setTrapPort(port);
SnmpPeer peer = new SnmpPeer(ip);
peer.setDestPort(port);
SnmpOid oid = new SnmpOid(".1.4.1.8596.2.19.1.1");

SnmpTimeticks timeticks = new SnmpTimeticks(System.currentTimeMillis());
try {
sendServer.snmpV2Trap(peer, oid, varbindList, timeticks);
} catch (Exception e) {
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值