- 浏览: 388285 次
- 性别:
- 来自: 北京
最新评论
-
liuzhongzhou2721:
不错啊
Snmp4j编程简介之三:Snmp -
ahong520:
我在Keystore.getInstance("JK ...
java实现 SSL双向认证 -
tanghanlin:
好吧,还是支持下
Snmp4j编程简介之三:Snmp -
sjp524617477:
mark
java实现 SSL双向认证 -
dikesky:
您好,看了您的这篇文章学到很多东西。希望您提供一个QQ号(发到 ...
httpclient笔记(二)
Class Snmp
java.lang.Object org.snmp4j.Snmp
snmp类是SNMP4J的核心,它提供了发送和接收SNMP PDUs的方法,所有的SNMP PDU 类型都可以采用同步或者异步的方式被发送。
Snmp采用独立的传输协议,通过TransportMapping
接口调用addTransportMapping(TransportMapping transportMapping)
方法或者采用默认的构造函数来实现传输映射,以此来实现信息的传输。
下面的代码片段是采用UDP传输方式来实现一个SNMPv3的SNMP session :
Address targetAddress = GenericAddress.parse("udp:127.0.0.1/161"); TransportMapping transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0); SecurityModels.getInstance().addSecurityModel(usm); transport.listen();
如何实现SNMPv3信息的同步发送,下面举例说明:
// add user to the USM snmp.getUSM().addUser(new OctetString("MD5DES"), new UsmUser(new OctetString("MD5DES"), AuthMD5.ID, new OctetString("MD5DESUserAuthPassword"), PrivDES.ID, new OctetString("MD5DESUserPrivPassword"))); // create the target UserTarget target = new UserTarget(); target.setAddress(targetAddress); target.setRetries(1); target.setTimeout(5000); target.setVersion(SnmpConstants.version3); target.setSecurityLevel(SecurityLevel.AUTH_PRIV); target.setSecurityName(new OctetString("MD5DES")); // create the PDU PDU pdu = new ScopedPDU(); pdu.add(new VariableBinding(new OID("1.3.6"))); pdu.setType(PDU.GETNEXT); // send the PDU ResponseEvent response = snmp.send(pdu, target); // extract the response PDU (could be null if timed out) PDU responsePDU = response.getResponse(); // extract the address used by the agent to send the response: Address peerAddress = response.getPeerAddress(); An asynchronous SNMPv1 request is sent by the following code: // setting up target CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString("public")); target.setAddress(targetAddress); target.setRetries(2); target.setTimeout(1500); target.setVersion(SnmpConstants.version1); // creating PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(new int[] {1,3,6,1,2,1,1,1}))); pdu.add(new VariableBinding(new OID(new int[] {1,3,6,1,2,1,1,2}))); pdu.setType(PDU.GETNEXT); // sending request ResponseListener listener = new ResponseListener() { public void onResponse(ResponseEvent event) { // Always cancel async request when response has been received // otherwise a memory leak is created! Not canceling a request // immediately can be useful when sending a request to a broadcast // address. ((Snmp)event.getSource()).cancel(event.getRequest(), this); System.out.println("Received response PDU is: "+event.getResponse()); } }; snmp.sendPDU(pdu, target, null, listener); //Traps (notifications) and other SNMP PDUs can be received by adding the folling code to the first code snippet above: CommandResponder trapPrinter = new CommandResponder() { public synchronized void processPdu(CommandResponderEvent e) { PDU command = e.getPDU(); if (command != null) { System.out.println(command.toString()); } } }; snmp.addCommandResponder(trapPrinter); Version: 1.8 Author: Frank Fock translate:avery_leo
Snmp类提供了一套有关Snmp的功能接口。具体来讲,就是发送、接受、创建Snmp消息。
一个Snmp对象是一个Session,而在Snmp4j中,一个Session可以同多个远程设备通信。
(1) Snmp、Target、PDU三者的关系
Target代表远程设备或者远程实体、PDU代表管理端同Target通信的数据,Snmp就代表管理者管理功能(其实就是数据的收发)的具体执行者。
打个比方:Target就是你远方的恋人,PDU就是你们之间传递的情书、而Snmp就是负责帮你寄信收信的邮差。
(2)Snmp收发数据的两种方式
Snmp可以同步、也可异步收发数据。详细见代码示例说明。
(3)Snmp与传输层协议
Snmp可以定制传输层协议,一般选择udp,也可以选择tcp。详细见代码示例说明。
(4)Snmp与Usm
创建Snmp用来发送Snmpv3版本的消息时候,一般还要创建USM,将它添加至安全模型管理器(SecriryModels)中,同时还需要向Usm中添加相应的USM用户(UsmUser)。详细见代码示例说明。
代码示例:(摘自Snmp4j的API文档)
(1)创建Snmp
1)使用UDP传输协议
TransportMapping transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport);
2)使用TCP传输协议
TransportMapping transport = new DefaultTcpTransportMapping(); snmp = new Snmp(transport);
3)创建用于Snmpv3的Snmp
// 创建Snmp TransportMapping transport = new DefaultUdpTransportMapping(); Snmp snmp = new Snmp(transport); if (version == SnmpConstants.version3) { byte[] localEngineID = ((MPv3)snmp.getMessageProcessingModel(MessageProcessingModel.MPv3)).createLocalEngineID(); // 创建USM USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(localEngineID), 0); // 将USM添加至安全模式管理器中 // 安全模型管理器采用了单例模式,它内部可以维护为3个安全模型,分别对应Snmp三个版本 SecurityModels.getInstance().addSecurityModel(usm); snmp.setLocalEngine(localEngineID, 0, 0); // 添加用户 snmp.getUSM().addUser(securityName,new UsmUser(securityName,authProtocol, authPassphrase,privProtocol,privPassphrase)); }
(2)同步收发消息
import org.snmp4j.*; ... Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); ... ResponseEvent response = snmp.send(requestPDU, target); if (response.getResponse() == null) { // request timed out ... }else { System.out.println("Received response from: "+ response.getPeerAddress()); // dump response PDU System.out.println(response.getResponse().toString()); }
(3)异步收发消息
import org.snmp4j.*; import org.snmp4j.event.*; ... Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); ... // 增加监听器 ResponseListener listener = new ResponseListener() { public void onResponse(ResponseEvent event) { PDU response = event.getResponse(); PDU request = event.getRequest(); if (response == null) { System.out.println("Request "+request+" timed out"); } else { System.out.println("Received response "+response+" on request "+ request); } }; snmp.sendPDU(request, target, null, listener); ...
(4)实现trap
实现trap需要三步:
1)创建Snmp;
2)对于listen()使处于网络监听(实际上是同于网络编程中的Socket监听);
3)实现CommandResponder
接口的监听器,并且调用Snmp.addCommandResponder(CommandResponder)
注册监听器。
import org.snmp4j.*;
import org.snmp4j.smi.*;
import org.snmp4j.mp.SnmpConstants;
...
TransportMapping transport =
new DefaultUdpTransportMapping(new UdpAddress("0.0.0.0/161"));
Snmp snmp = new Snmp(transport);
if (version == SnmpConstants.version3) {
byte[] localEngineID =
((MPv3)snmp.getMessageProcessingModel(MessageProcessingModel.MPv3)).createLocalEngineID();
USM usm = new USM(SecurityProtocols.getInstance(),
new OctetString(localEngineID), 0);
SecurityModels.getInstance().addSecurityModel(usm);
snmp.setLocalEngine(localEngineID, 0, 0);
// Add the configured user to the USM
...
}
// 注册命令响应监听器
snmp.addCommandResponder(this);
transport.listen();
...
// 实现CommandResponder接口
public synchronized void processPdu(CommandResponderEvent e) {
PDU command = e.getPdu();
if (command != null) {
...
}
}
总结
Snmp内含了一个消息分发器,消息分发器中内含了处理网络的线程,在使用完后最好调用close(),将其资源回归处理。
掌握了上面所说的三个概念,基本上可以使用Snmp4j编写Snmp的程序了。
有关Snmp4j编程最好也最详细的资料:API文档和源代码。关于使用Snmp4j编写Snmp程序的例子,多线程的例子可以参看源代码中:org.snmp4j.test包下的MultiThreadedTrapReceiver.java,完整的例子可以参看 org.snmp4j.tools.console包下的SnmpRequest(一个命令行的Snmp管理器)。
不过,要想快速和深入掌握Snmp编程,最好的办法一定是先弄懂Snmp协议,这方面的资料最权威的就是RFC协议了。
评论
发表评论
-
你可能不知道的10个JavaScript小技巧
2010-09-07 17:05 1076“梦想天空”(网名)曾发表一篇博文,为我们介绍了10个Java ... -
监控利器nagios
2009-04-01 17:32 3070我的Nagios的艰辛.....网络监控之神(一)本贴原创,转 ... -
Tomcat配置指南(转载)
2009-03-11 10:54 1150Tomcat配置指南(转载) 一 ... -
谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
2009-02-27 14:33 1244这是一篇程序员写给程 ... -
SnmpHibernate
2008-12-18 14:44 1793SnmpHibernate is a MIB/Object ... -
常用的数字编码格式
2008-12-17 17:39 2601常用数字编码1.BCD编码 在数字系统中,各种数据要转换为二进 ... -
Java中四种XML解析技术之不完全测试
2008-12-16 11:00 1016测试环境: AMD毒龙1.4G ... -
Javascript闭包技术
2008-11-24 09:46 1386一、什么是闭包?“官 ... -
多线程
2008-07-25 16:35 1480线程:是指进程中的 ... -
Apache,Resin,JVM 状态监控
2008-07-24 13:21 3261不管你是网站系统管理员,还是WEB开发人员,了解你的WEB应用 ... -
使用Jconsole对java的内存使用情况(JVM)进行监控
2008-07-24 11:26 2818JDK1.5提供JMX remote的管理工具Jconsole ... -
Linux下网络流量监控
2008-07-24 10:23 2018(一) 系统环境:redhat9.0 必备软件: (这些软件都 ... -
net-snmp安装手记
2008-07-23 11:45 4769对于更多的net-snmp的资料,可以去www.net-snm ... -
net-snmp安装手记
2008-07-23 11:36 7563Installing /usr/share/man/man3/ ... -
RFC1155基于TCP/IP网络的管理结构和标记
2008-07-10 10:37 2305组织:中国互动出版网(http://www.china-pub ... -
Snmp4j编程简介之二:PDU
2008-07-03 13:00 6707PDU(协议数据单元),用来表示管理站跟代理站点进行通信的数据 ... -
Snmp4j编程简介之一:Target
2008-07-03 12:57 4744关于Snmp4j包,最重要三个概念,也是三个类:Snmp、Ta ... -
Java远程通讯可选技术及原理
2008-06-23 11:45 1352Java远程通讯可选技术及原理 在分布式服务框架中 ... -
基于Spring的远程访问与Web Service(二)
2008-06-20 16:33 5016Spring框架对远程访问技 ... -
通过Spring使用远程访问和web服务
2008-06-20 13:47 1983Spring提供类用于集成各种远程访问技术。这种对远程访问的支 ...
相关推荐
SNMP4J 编程入门 SNMP4J 是一个 Java 库,用于实现 SNMP(Simple Network Management Protocol)协议。SNMP 是一个标准的网络管理协议,用于管理和监控网络设备。在 SNMP4J 中,有三个核心概念:Snmp、Target 和 ...
SNMP4J是一个Java库,为SNMP协议提供了全面的支持,包括v1、v2c和v3这三个版本。本文将深入探讨如何使用SNMP4J来实现SNMP的基本操作,包括GET、GETNEXT、SET和TRAP。 1. SNMP协议基础: SNMP协议主要由管理站...
在使用Snmp4j进行编程时,有三个核心概念:Snmp、Target和PDU。 1. Snmp:这是SNMP协议的接口,负责实际的通信工作。它包含了发送请求(Trap、Get、Set等操作)和接收响应的方法。Snmp对象通常通过一个...
这个压缩包中的"snmp4j-2.0.3.jar"就是SNMP4J库的特定版本,它支持SNMPv1、SNMPv2c以及SNMPv3这三种版本的协议。其中,SNMPv1是最基础的版本,主要关注设备的配置和性能数据;SNMPv2c增加了错误处理和报告能力;而...
Java中的SNMP编程是网络管理员和服务器监控人员常用的技术之一。SNMP(简单网络管理协议)是一种用于收集和组织关于计算机网络中设备状态信息的协议,它能够帮助网络管理员监测网络性能、发现设备问题、管理网络配置...
开发者可以通过查阅文档,了解每个类的功能、方法的参数和返回值,以便更有效地使用SNMP4J进行SNMP编程。 总之,SNMP4J为Java开发者提供了一个强大且灵活的框架,用于构建SNMP应用程序。通过理解和掌握SNMP4J API,...
在这个项目中,"用SNMP4J实现的Trap源码"是基于JAVA语言利用SNMP4J库编写的,旨在帮助开发者理解和实践如何通过编程方式实现SNMP Trap的功能。下面将详细解释相关的知识点: 1. **SNMP4J库**:SNMP4J是一个开源的...
SNMP4J是一个基于Java语言实现的简单网络...总之,SNMP4J是Java开发者进行SNMP编程的重要工具,它提供了完整的SNMP协议实现,同时具有良好的文档支持,使得开发者能够轻松地构建SNMP应用,实现对网络设备的管理与监控。
SNMP4J是一个Java实现的简单网络管理协议(SNMP)的应用编程接口(API),它提供了全面的功能,用于开发SNMP应用。SNMP是网络管理领域的重要标准,用于监控和管理网络设备,如路由器、交换机和服务器。下面将详细...
SNMP4J是一个开源的Java库,专门设计用于实现SNMP协议的客户端功能,使得开发者能够从网络设备中读取或设置管理信息。本篇文章将详细探讨如何使用SNMP4j库在Java中读取SNMP协议数据。 首先,了解SNMP是必要的。SNMP...
SNMP4J是一个Java实现的简单网络管理协议(SNMP)的应用编程接口(API),它为开发者提供了在Java环境中开发SNMP应用的工具。本文档将深入探讨SNMP4J的相关知识点,帮助读者掌握SNMP协议的基础以及如何利用SNMP4J...
SNMP4J-Agent是SNMP4J项目的一部分,它是一个开放源码的Java实现,用于构建SNMP代理(Agent)应用程序。SNMP(简单网络管理协议)是一种广泛使用的网络管理协议,允许网络管理员监控和配置网络设备。SNMP4J-Agent...
SNMP4J是一个开源的Java实现的简单网络管理协议(SNMP)库,适用于开发SNMP应用程序。2.3.0版本是这个库的一个特定发行版,提供了对SNMP v1、v2c和v3的支持。在深入探讨SNMP4J的源码之前,我们需要先了解SNMP的基本...
这个最新的API版本包括了`snmp4j-2.0.3.jar`,`snmp4j-2.0.3-javadoc.jar`以及`snmp4j-agent-2.0.5.jar`这三个组件,它们各自扮演着不同的角色。 1. **snmp4j-2.0.3.jar**: 这是SNMP4J的主要库文件,包含了SNMP协议...
对于开发者来说,SNMP4J-CLT也是一个学习SNMP协议和实践SNMP编程的好工具,因为它的源代码揭示了如何使用SNMP4J库来实现SNMP操作。 总的来说,SNMP4J-CLT是网络管理中的一个实用工具,它简化了与SNMP设备的交互,...
8. **异步编程模型**:SNMP4J提供了异步请求处理机制,允许开发者在一个非阻塞模式下发送SNMP请求,提高程序性能。相关的类如`AsyncRequest`和`FutureResponse`用于异步操作。 9. **错误处理和异常**:在源码中,...
在Java开发中,SNMP4j是一个非常重要的库,它提供了对SNMP协议的全面支持,包括SNMP v1、v2c和v3三个版本。这个开发包被广泛推荐,因为它提供了详尽的实例和易于理解的API,是Java开发者进行SNMP编程的理想工具。 ...
SNMP4J是一个Java实现的简单网络管理协议(SNMP)的应用编程接口(API),它为开发者提供了在Java环境中开发SNMP应用的功能。这个最新的2.3.1版本是官方发布的,确保了稳定性和兼容性。下面将详细介绍SNMP4J的几个...
SNMP4J是一个Java实现的简单网络管理协议(SNMP)的应用编程接口(API),它为开发者提供了在Java环境中编写SNMP应用的工具。SNMP是网络设备管理和监控的标准协议,广泛应用于网络设备配置、性能监控和故障排查。在...
1. **SNMP协议支持**:SNMP4J提供了对SNMP协议三个版本的完整实现,包括SNMPv1的基础功能,SNMPv2c的增强功能,以及SNMPv3的安全特性。源码中包含了各种PDU(协议数据单元)的创建、解析和发送,以及SNMP报文的封装...