- 浏览: 387905 次
- 性别:
- 来自: 北京
最新评论
-
liuzhongzhou2721:
不错啊
Snmp4j编程简介之三:Snmp -
ahong520:
我在Keystore.getInstance("JK ...
java实现 SSL双向认证 -
tanghanlin:
好吧,还是支持下
Snmp4j编程简介之三:Snmp -
sjp524617477:
mark
java实现 SSL双向认证 -
dikesky:
您好,看了您的这篇文章学到很多东西。希望您提供一个QQ号(发到 ...
httpclient笔记(二)
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的收发成功了。
- snmp4j-1.9.2.zip (1 MB)
- 下载次数: 187
评论
不知道你有没有做过.
dongtalk@gmail.com
发表评论
-
OpenNMS® 安裝指南
2011-03-10 16:20 1906THIS DOCUMENT IS FOR OpeNNMS 1. ... -
OSGI学习笔记(三)
2010-09-09 11:08 1205OSGi依赖性管理 OSGi允许您把您的应用程序分成多个模 ... -
OSGI学习笔记(二)
2010-09-09 11:03 1537开发一个简单的Hello World的OSGi Bundle( ... -
OSGI学习笔记(一)
2010-09-09 10:43 1200OSGi是什么 OSGi亦称做Java语言的动态模块系统,它 ... -
Javarebel小试
2010-09-07 16:49 34191 Javarebel简介 JavaRebel是一个JV ... -
240多个jQuery插件下载地址
2009-08-11 17:24 12049概述 jQuery 是继 prototype 之后又一个优秀 ... -
关于SNMP的RFC文档号
2009-05-04 16:10 4635一. SMIv1Full Standards: ... -
JavaCard CPU的设计与FPGA实现
2009-05-04 14:28 22581 JavaCard简介 智能 ... -
Java Card 技术(三)
2009-05-04 14:17 2665Java Card 应用程序的元素 请记住,Java ... -
Java Card 技术(二)
2009-05-04 14:13 2764本系列文章的第 1 部分介绍了 Java Card 技术的 ... -
Extjs学习笔记(一)
2008-12-15 13:39 1634下载extj :http://extjs.com/deploy ... -
ftp4j之FTP
2008-12-01 10:11 3739The ftp4j library implements a ... -
James学习笔记
2008-11-25 15:13 3419Apache James 简称 James, 是 Java ... -
非阻塞的Socket链接(来自老紫竹)
2008-11-25 11:10 1749import java.io.IOException; ... -
java实现 SSL双向认证
2008-11-24 16:36 31291实现技术:JSSE(Java Security Socket ... -
编码传说
2008-11-21 17:38 1348很久很久以前,有一群人,他们决定用8个可以开合的晶体管来 ... -
使用Log4j进行日志操作
2008-10-16 11:36 1181使用Log4j进行日志操作1. 概述1.1. 背景在应用程序中 ... -
linux 下cpu 内存 磁盘 jvm的使用监控
2008-07-24 13:50 2986java 监控linux CPU 内存 磁盘 JVM: imp ... -
snmp4j获取数据agent实例(三)
2008-07-03 11:43 6734agent代理端例子: import java.util. ... -
snmp4j获取数据实例(一,Linux SNMP OID’s for CPU,Memory a)
2008-07-03 09:10 9107常用SNMP OID Linux SNMP OID’s f ...
相关推荐
本文将详细介绍SNMP实例,特别是通过Java库snmp4j实现的GET、GETNEXT、SET操作以及TRAP发送和MIB获取。 1. **SNMP基本概念** SNMP由三个主要组件构成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理...
在Java环境中,SNMP4J库为开发者提供了便利,可以用来读取和操作SNMP协议的数据。本文将深入探讨如何利用SNMP4j包来读取SNMP协议数据。 首先,理解SNMP4j的基本概念至关重要。SNMP4j是一个开源的Java库,完全实现了...
SNMP4J的API文档(如SNMP4J_API_en_s1.chm)包含了详细的类和方法描述,以及示例代码,是学习和使用SNMP4J的重要参考资料。开发者可以通过查阅文档,了解每个类的功能、方法的参数和返回值,以便更有效地使用SNMP4J...
SNMP4j库的核心组件包括Agent、Manager和PDU(协议数据单元)。Agent是网络设备上的软件,负责收集和提供设备的状态信息;Manager则是从Agent获取信息或对设备进行配置的客户端。PDU则是SNMP通信中的信息载体,包含...
本文将深入探讨如何使用SNMP4J-Agent工具在个人计算机上模拟SNMP服务,以便进行测试和开发。 SNMP4J-Agent是SNMP4J项目的一部分,是一个开源的Java库,用于实现SNMP代理功能。它提供了丰富的API,可以方便地构建...
在实际应用中,SNMP4J还支持其他高级功能,如陷阱(Trap)处理、同步和异步请求、V3安全模型等。对于更复杂的MIB操作,你需要理解MIB的结构并使用相应的OID来访问和修改设备的管理对象。 总结来说,这个SNMP4J实例...
用户可以通过建立一个Session来与SNMP代理通信,并通过Context来处理多实例SNMP环境。 9. **Async SNMP**: SNMP4J还支持异步SNMP操作,允许并发处理多个请求,提高效率。 10. **Code Examples**: 官方网站...
SNMP4J-API.chm文件包含了详细的API文档,对每个类、接口及其方法都有详尽的解释,包括参数、返回值和示例。例如,`Snmp.get`方法用于发送GET请求,它接受`PDU`和`Target`作为参数,返回`PDU`对象。在API文档中,你...
9. **使用示例**:使用SNMP4J进行设备管理通常涉及以下步骤: - 创建`TransportMapping`实例,如`UdpTransportMapping`,并注册到`MessageDispatcher`。 - 创建`CommunityData`或`UsmUserData`,根据SNMP版本设置...
在SNMP4j的示例代码中,通常会包含以下关键步骤: 1. 初始化`SNMP`对象,设置通信参数。 2. 创建`Target`对象,指定设备的IP地址、社区字符串(对于SNMPv1和SNMPv2c)或认证和隐私参数(对于SNMPv3)。 3. 创建`PDU...
**SNMP4J详解** SNMP4J是一个用于Java平台的简单网络管理协议(SNMP)实现库。它为开发人员提供了一套完整的工具,以便于构建能够与SNMP设备进行通信的应用程序。SNMP是一种广泛使用的网络管理协议,允许系统管理员...
要使用SNMP4J-Agent,首先需要了解SNMP协议的基础知识,包括PDU(协议数据单元)类型如GetRequest、SetRequest、Trap等,以及如何处理这些请求。然后,开发者需要定义MIB对象,这通常涉及到定义OID(对象标识符)和...
通过以上代码示例,我们可以学习到如何在实际项目中使用Java实现UDP通信,以及如何利用SNMP4J库来处理SNMP Trap。这些知识对于网络编程和设备管理具有重要的实践意义。在深入理解这些概念后,开发者可以更有效地构建...
SNMP4J是Java开发人员的得力工具,它完全实现了SNMPv1、v2c和v3,提供了丰富的API,可以方便地进行SNMP Get、Set、Trap操作。使用SNMP4J,开发者可以构建自己的网络管理系统,实现设备的监控、配置和故障排除。 接...
7. **示例代码**:DOME通常指的是示例或演示,可能包含使用SNMP4J进行基本操作的Java代码,如获取设备信息、设置设备配置或监听陷阱(Trap)事件。 为了充分利用SNMP4J,你需要熟悉SNMP协议的基本概念,理解MIB结构...
提供的“Snmp4J帮助文档”应包含详细的API参考、示例代码和故障排除指南。这些内容可以帮助你了解每个类和方法的作用,以及如何正确使用它们来构建SNMP应用。 5. **实例应用** - **查询设备状态**:通过Get...
在这个“C++ SNMP实例程序”中,我们将会探讨如何在Visual Studio环境下使用C++进行SNMP编程。 首先,SNMP主要由三部分构成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理站负责发送请求,而代理则...