近期项目和华为的接口有要求用SNMP做实时告警的上送,在网上查找了些资料,整理了下
SNMP分为:SNMP TRAP\SNMP GET\SNMP SET
1.SNMP TRAP简单说一般就是Manager和agent之间拿来传输数据,Manager会一直监听着代理进程发送 TRAP消息
2.SNMP GET看到GET就知道就是从SNMP服务端获取某个节点的数据
3.SNMP SET就是设置SNMP服务端的某个节点的数据
实现SNMPTRAP需SNMP4J JAR包 http://www.snmp4j.org/html/download.html官网下载
1.首先实现SNMP TRAP接收消息服务端,监听Agent发来的TRAP消息
package com.eshore.snmptrap; import java.io.IOException; import java.net.UnknownHostException; import java.util.Vector; import org.snmp4j.CommandResponder; import org.snmp4j.CommandResponderEvent; import org.snmp4j.MessageDispatcherImpl; import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.mp.MPv1; import org.snmp4j.mp.MPv2c; import org.snmp4j.mp.MPv3; import org.snmp4j.security.SecurityModels; import org.snmp4j.security.SecurityProtocols; import org.snmp4j.security.USM; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.TcpAddress; import org.snmp4j.smi.UdpAddress; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultTcpTransportMapping; import org.snmp4j.transport.DefaultUdpTransportMapping; import org.snmp4j.util.MultiThreadedMessageDispatcher; import org.snmp4j.util.ThreadPool; /** * 本类用于监听代理进程的Trap信息 * * @author zhanjia * */ public class MultiThreadedTrapReceiver implements CommandResponder { private MultiThreadedMessageDispatcher dispatcher; private Snmp snmp = null; private Address listenAddress; private ThreadPool threadPool; public MultiThreadedTrapReceiver() { // BasicConfigurator.configure(); } private void init() throws UnknownHostException, IOException { threadPool = ThreadPool.create("Trap", 2); dispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl()); listenAddress = GenericAddress.parse(System.getProperty( "snmp4j.listenAddress", "udp:127.0.0.1/162")); // 本地IP与监听端口 TransportMapping transport; // 对TCP与UDP协议进行处理 if (listenAddress instanceof UdpAddress) { transport = new DefaultUdpTransportMapping( (UdpAddress) listenAddress); } else { transport = new DefaultTcpTransportMapping( (TcpAddress) listenAddress); } snmp = new Snmp(dispatcher, transport); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1()); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c()); snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3()); USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3 .createLocalEngineID()), 0); SecurityModels.getInstance().addSecurityModel(usm); snmp.listen(); } public void run() { try { init(); snmp.addCommandResponder(this); System.out.println("开始监听Trap信息!"); } catch (Exception ex) { ex.printStackTrace(); } } /** * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息 * 当接收到trap时,会自动进入这个方法 * * @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(recVB.getOid() + " : " + recVB.getVariable()); } } } public static void main(String[] args) { MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver(); multithreadedtrapreceiver.run(); } }
2.再写个Agent向服务端发送TRAP消息
package com.eshore.snmptrap; import java.io.IOException; import java.util.Date; import java.util.Vector; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.TransportMapping; import org.snmp4j.event.ResponseEvent; import org.snmp4j.mp.SnmpConstants; import org.snmp4j.smi.Address; import org.snmp4j.smi.GenericAddress; import org.snmp4j.smi.Integer32; import org.snmp4j.smi.OID; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; /** * 本类用于向管理进程发送Trap信息 * * @author zhanjia * */ public class SnmpUtilSendTrap { private Snmp snmp = null; private Address targetAddress = null; public void initComm() throws IOException { // 设置管理进程的IP和端口 targetAddress = GenericAddress.parse("udp:127.0.0.1/162"); TransportMapping transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); transport.listen(); } /** * 向管理进程发送Trap报文 * * @throws IOException */ public void sendPDU() throws IOException { // 设置 target CommunityTarget target = new CommunityTarget(); target.setAddress(targetAddress); // 通信不成功时的重试次数 target.setRetries(2); // 超时时间 target.setTimeout(1500); // snmp版本 target.setVersion(SnmpConstants.version2c); // 创建 PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.1"), new OctetString("SNMPTEST"))); pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.2"), new Integer32(10))); pdu.add(new VariableBinding(new OID(".1.3.6.1.4.1.2011.2.15.2.1.2.1.1.1.3"), new OctetString(new Date().toString()))); pdu.setType(PDU.TRAP); // 向Agent发送PDU,并接收Response ResponseEvent respEvnt = snmp.send(pdu, target); // 解析Response if (respEvnt != null && respEvnt.getResponse() != null) { Vector<VariableBinding> recVBs = (Vector<VariableBinding>) respEvnt.getResponse() .getVariableBindings(); for (int i = 0; i < recVBs.size(); i++) { VariableBinding recVB = recVBs.elementAt(i); System.out.println(recVB.getOid() + " : " + recVB.getVariable()); } } } public static void main(String[] args) { try { SnmpUtilSendTrap util = new SnmpUtilSendTrap(); util.initComm(); util.sendPDU(); } catch (IOException e) { e.printStackTrace(); } } }
相关推荐
Java使用SNMP4J实现snmp trap接口发送消息_20170808_LK
snmp4j 实现snmp trap发送与接收
利用SNMP4J实现Snmp Trap完整例子 - 企业应用 - Java - JavaEye论坛.mht
用JAVA语言利用SNMP4J的开源的开发包实现的Trap功能的源代码。
利用snmp4j实现snmp协议三个版本的get、getnext、set、trap操作的源代码,帮助你快速上手snmp协议的实现
eclipse工程(编译通过,能运行) snmp4j API get,getnext,set,trap,取mib值 实例
使用snmp++在mfc下简单实现Trap接收,监视接口状态为DOWN或UP。
snmp4j的发送和接收trap
用net-snmp的c apis实现trap的接收,类似于snmptrapd工具的实现,但是更为简单。
windows平台下,用于接收snmp协议的trap消息的小软件,可以测试你编写的trap命令是否发送成功了
监听SNMPtrap消息的小工具,自带解析功能
最近调试SNMP协议,要调试设备上的trap发送功能,需要在windows端接收,,也支持Linux和unix,需要java环境,找来找去很辛苦终于找到这款软件,挺不错的
C语言中net-snmp-trap发送代码,测试可行。
SNMP学习资料,对学SNMP的非常有帮助: 在不同操作系统中安装SNMP代理.mht SNMP的5种协议数据单元.mht SNMP基础简介.mht SNMP Informant How-To - OpenNMS.mht SnmpTrap工具的用法.txt
vc++ snmp trap例子 源码
linux下基于netsnmp写的trap服务器,纯C代码,可解析出trap发送方的地址及trap消息内容,可直接编译和测试。编译方法为: gcc trap.c -lnetsnmp
用net-snmp api开发实现snmptrapd功能
snmp trap 接收
WINDOWS下SNMP TRAP接收调试软件,可显示TRAP信息列表和TRAP信息的编码内容,非常适合嵌入式SNMP协议开发者使用。
SNMP TRAP消息其实就是UDP报文,TRAP服务器就是UDP服务器(即接收方,UDP端口为162),发送TRAP消息的其实就是UDP客户端。 本demo包含TRAP接收的服务器和发送TRAP消息的UDP客户端两个部分,基于SnmpSharpNet做的,...