`
avery_leo
  • 浏览: 388353 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

snmp4j获取数据实例(二)之SnmpTrap示例

    博客分类:
  • JAVA
阅读更多

snmp4j的jar包可以在它的官方网站http://www.snmp4j.org/上下载。

 

import java.io.IOException; 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.OID; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; public class SnmpUtil { private Snmp snmp = null; private Address targetAddress = null; public void initComm() throws IOException { // 设置Agent方的IP和端口 targetAddress = GenericAddress.parse("udp:192.168.7.203/161"); TransportMapping transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); transport.listen(); } public void sendPDU() throws IOException { // 设置 target CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString("public")); target.setAddress(targetAddress); // 通信不成功时的重试次数 target.setRetries(2); // 超时时间 target.setTimeout(1500); target.setVersion(SnmpConstants.version1); // 创建 PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 5, 0 }))); // MIB的访问方式 pdu.setType(PDU.GET); // 向Agent发送PDU,并接收Response ResponseEvent respEvnt = snmp.send(pdu, target); // 解析Response if (respEvnt != null && respEvnt.getResponse() != null) { Vector<VariableBinding> recVBs = 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 { SnmpUtil util = new SnmpUtil(); util.initComm(); util.sendPDU(); } catch (IOException e) { e.printStackTrace(); } } }

 

 

  上面的这段代码直接参考snmp4j API说明文档中提供的例子,是一个最简单的snmp4j的应用。只要你的机器里安装了snmp通讯组件,上面的代码应该可以运行成功。

在上一个例子中,我们只做了读取的工作,接下来,我们进行一下设置操作,通过Snmp修改读取的机器名。
    public的默认权限是只读,要想进行写操作,我们必须进行手动的设置。具体的做法是:进入管理工具→服务,找到Snmp Service→属性→安全。在这个选项卡中我们可以看到public的权限是只读,你可以修改public的权限,也可以重新创建一个community。从安全角度来讲当然应该新建一个,在这里为了测试方便,我就直接给public添加写入权限了。
    接下来就可以编写代码了,我把上面的例子重构一下,代码如下:

import java.io.IOException; 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.OID; import org.snmp4j.smi.OctetString; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; public class SnmpUtil { private Snmp snmp = null; private Address targetAddress = null; public void initComm() throws IOException { // 设置Agent方的IP和端口 targetAddress = GenericAddress.parse("udp:192.168.7.203/161"); TransportMapping transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); transport.listen(); } public ResponseEvent sendPDU(PDU pdu) throws IOException { // 设置 target CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString("public")); target.setAddress(targetAddress); // 通信不成功时的重试次数 target.setRetries(2); // 超时时间 target.setTimeout(1500); target.setVersion(SnmpConstants.version1); // 向Agent发送PDU,并返回Response return snmp.send(pdu, target); } public void setPDU() throws IOException { // set PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 5, 0 }), new OctetString("SNMPTEST"))); pdu.setType(PDU.SET); sendPDU(pdu); } public void getPDU() throws IOException { // get PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 5, 0 })));//pcName pdu.setType(PDU.GET); readResponse(sendPDU(pdu)); } public void readResponse(ResponseEvent respEvnt) { // 解析Response if (respEvnt != null && respEvnt.getResponse() != null) { Vector<VariableBinding> recVBs = 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 { SnmpUtil util = new SnmpUtil(); util.initComm(); util.setPDU(); util.getPDU(); } catch (IOException e) { e.printStackTrace(); } } }

 

 

   接收trap

snmp4j提供了一个抽象类CommandResponder类用于接收trap,这个类里面有一个必须实现的方法processPdu(),当接收到trap,会自动进入这个方法,因此我们可以将对trap的处理写在这里。

下面修改上例子中的initComm()方法:

 

private TransportMapping transport = null; public void initComm() throws IOException { // 设置Agent方的IP和端口 targetAddress = GenericAddress.parse("udp:192.168.7.203/161"); // 设置接收trap的IP和端口 transport = new DefaultUdpTransportMapping(new UdpAddress( "192.168.7.12/162")); snmp = new Snmp(transport); CommandResponder trapRec = new CommandResponder() { public synchronized void processPdu(CommandResponderEvent e) { // 接收trap PDU command = e.getPDU(); if (command != null) { System.out.println(command.toString()); } } }; snmp.addCommandResponder(trapRec); transport.listen(); }

 

 

 

其中targetAddress指Agent端也就是trap发送,transport指trap接收方,这里就是本机,假设IP是192.168.7.203,但注意不能写成127.0.0.1。

 

因为我们无法得知trap什么时候会发送,所以需要有一个线程等待trap的到来,在这个例子中我们使用wait()来等待trap的到来,具体应用中就要根据实际情况来做了。

 

public synchronized void listen() { System.out.println("Waiting for traps.."); try { this.wait();//Wait for traps to come in } catch (InterruptedException ex) { System.out.println("Interrupted while waiting for traps: " + ex); System.exit(-1); } } public static void main(String[] args) { try { SnmpUtil util = new SnmpUtil(); util.initComm(); util.listen(); } catch (IOException e) { e.printStackTrace(); } }

 

将上面的代码添加到以上的例子中,就可以接收trap了。

 

但是还有一个问题,如何让192.168.7.203发送trap呢?这个也可以使用snmp4j来做。其实发送trap和发送set、get PDU是类似的,同样是发送PDU,只不过类型不一样。我们把前面的例子复制到192.168.7.203,在里面添加一段代码:

 

public void setTrap() throws IOException { // 构造Trap PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.1"), new OctetString("SnmpTrap"))); pdu.setType(PDU.TRAP); sendPDU(pdu); System.out.println("Trap sent successfully."); }

 

 

 

这里PDU的OID和Value可以自己构造,无需使用特定的值。

然后修改地址
targetAddress = GenericAddress.parse("udp:192.168.7.203/162");
transport = new DefaultUdpTransportMapping();

 

另外需要修改target的version,即改为target.setVersion(SnmpConstants.version2c)

接下来修改main()函数,调用setTrap()。

然后回到本机运行刚才的例子,当控制台显示“Waiting for traps..”时,运行Agent端的例子。此时如果192.168.7.12打出我们刚刚设置的PDU的信息,就说明Trap的收发成功了。

分享到:
评论
1 楼 david.org 2010-05-06  
hi, 楼主, 我取了一组IfOutOctets数据, 但怎么算都和Cacti不同呀, 我想算出某网卡流出速度.
不知道你有没有做过.
dongtalk@gmail.com

相关推荐

    SNMP实例大全--snmp4j(get ,trap,set,取mib)

    本文将详细介绍SNMP实例,特别是通过Java库snmp4j实现的GET、GETNEXT、SET操作以及TRAP发送和MIB获取。 1. **SNMP基本概念** SNMP由三个主要组件构成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理...

    snmp4j包来读取snmp协议数据

    在Java环境中,SNMP4J库为开发者提供了便利,可以用来读取和操作SNMP协议的数据。本文将深入探讨如何利用SNMP4j包来读取SNMP协议数据。 首先,理解SNMP4j的基本概念至关重要。SNMP4j是一个开源的Java库,完全实现了...

    snmp4j api文档

    SNMP4J的API文档(如SNMP4J_API_en_s1.chm)包含了详细的类和方法描述,以及示例代码,是学习和使用SNMP4J的重要参考资料。开发者可以通过查阅文档,了解每个类的功能、方法的参数和返回值,以便更有效地使用SNMP4J...

    snmp4j开发包,强烈推荐

    SNMP4j库的核心组件包括Agent、Manager和PDU(协议数据单元)。Agent是网络设备上的软件,负责收集和提供设备的状态信息;Manager则是从Agent获取信息或对设备进行配置的客户端。PDU则是SNMP通信中的信息载体,包含...

    如何利用snmp4j-agent在PC端模拟snmp服务

    本文将深入探讨如何使用SNMP4J-Agent工具在个人计算机上模拟SNMP服务,以便进行测试和开发。 SNMP4J-Agent是SNMP4J项目的一部分,是一个开源的Java库,用于实现SNMP代理功能。它提供了丰富的API,可以方便地构建...

    SNMP4J实例(简单易学的资料)

    在实际应用中,SNMP4J还支持其他高级功能,如陷阱(Trap)处理、同步和异步请求、V3安全模型等。对于更复杂的MIB操作,你需要理解MIB的结构并使用相应的OID来访问和修改设备的管理对象。 总结来说,这个SNMP4J实例...

    snmp4j-2.3.0源码等

    用户可以通过建立一个Session来与SNMP代理通信,并通过Context来处理多实例SNMP环境。 9. **Async SNMP**: SNMP4J还支持异步SNMP操作,允许并发处理多个请求,提高效率。 10. **Code Examples**: 官方网站...

    SNMP4J-API.rar_SNMP4J API中文版_SNMP4J.jar api_snmp4j_snmp4j api ch

    SNMP4J-API.chm文件包含了详细的API文档,对每个类、接口及其方法都有详尽的解释,包括参数、返回值和示例。例如,`Snmp.get`方法用于发送GET请求,它接受`PDU`和`Target`作为参数,返回`PDU`对象。在API文档中,你...

    snmp4j最新开发包

    9. **使用示例**:使用SNMP4J进行设备管理通常涉及以下步骤: - 创建`TransportMapping`实例,如`UdpTransportMapping`,并注册到`MessageDispatcher`。 - 创建`CommunityData`或`UsmUserData`,根据SNMP版本设置...

    SNMP4j.rar_snmp java_snmp4j_snmp4j demo

    在SNMP4j的示例代码中,通常会包含以下关键步骤: 1. 初始化`SNMP`对象,设置通信参数。 2. 创建`Target`对象,指定设备的IP地址、社区字符串(对于SNMPv1和SNMPv2c)或认证和隐私参数(对于SNMPv3)。 3. 创建`PDU...

    snmp4j

    **SNMP4J详解** SNMP4J是一个用于Java平台的简单网络管理协议(SNMP)实现库。它为开发人员提供了一套完整的工具,以便于构建能够与SNMP设备进行通信的应用程序。SNMP是一种广泛使用的网络管理协议,允许系统管理员...

    nmi.rar_NMI java_nmi_snmp4j_snmp4j agent_snmp4j commerci

    要使用SNMP4J-Agent,首先需要了解SNMP协议的基础知识,包括PDU(协议数据单元)类型如GetRequest、SetRequest、Trap等,以及如何处理这些请求。然后,开发者需要定义MIB对象,这通常涉及到定义OID(对象标识符)和...

    UDP的发送接收例子 及SNMP trap

    通过以上代码示例,我们可以学习到如何在实际项目中使用Java实现UDP通信,以及如何利用SNMP4J库来处理SNMP Trap。这些知识对于网络编程和设备管理具有重要的实践意义。在深入理解这些概念后,开发者可以更有效地构建...

    snmp的安装包-在使用snmp4j时

    SNMP4J是Java开发人员的得力工具,它完全实现了SNMPv1、v2c和v3,提供了丰富的API,可以方便地进行SNMP Get、Set、Trap操作。使用SNMP4J,开发者可以构建自己的网络管理系统,实现设备的监控、配置和故障排除。 接...

    SNMP4J JAR 与DOME

    7. **示例代码**:DOME通常指的是示例或演示,可能包含使用SNMP4J进行基本操作的Java代码,如获取设备信息、设置设备配置或监听陷阱(Trap)事件。 为了充分利用SNMP4J,你需要熟悉SNMP协议的基本概念,理解MIB结构...

    snmp4j帮助

    提供的“Snmp4J帮助文档”应包含详细的API参考、示例代码和故障排除指南。这些内容可以帮助你了解每个类和方法的作用,以及如何正确使用它们来构建SNMP应用。 5. **实例应用** - **查询设备状态**:通过Get...

    C++ Snmp实例程序

    在这个“C++ SNMP实例程序”中,我们将会探讨如何在Visual Studio环境下使用C++进行SNMP编程。 首先,SNMP主要由三部分构成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理站负责发送请求,而代理则...

Global site tag (gtag.js) - Google Analytics