snmp类是SNMP4J的核心,它提供了发送和接收SNMP PDUs的方法,所有的SNMP PDU 类型都可以采用同步或者异步的方式被发送。
Snmp采用独立的传输协议,通过TransportMapping
接口调用addTransportMapping(TransportMapping transportMapping)
方法或者采用默认的构造函数来实现传输映射,以此来实现信息的传输。
下面的代码片段是采用UDP传输方式来实现一个SNMPv3的SNMP session :
1. Address targetAddress = GenericAddress.parse("udp:127.0.0.1/161");
2. TransportMapping transport = new DefaultUdpTransportMapping();
3. snmp = new Snmp(transport);
4. USM usm = new USM(SecurityProtocols.getInstance(),
5. new OctetString(MPv3.createLocalEngineID()), 0);
6. SecurityModels.getInstance().addSecurityModel(usm);
7. transport.listen();
如何实现SNMPv3信息的同步发送,下面举例说明:
1. // add user to the USM
2. snmp.getUSM().addUser(new OctetString("MD5DES"),
3. new UsmUser(new OctetString("MD5DES"),
4. AuthMD5.ID,
5. new OctetString("MD5DESUserAuthPassword"),
6. PrivDES.ID,
7. new OctetString("MD5DESUserPrivPassword")));
8. // create the target
9. UserTarget target = new UserTarget();
10. target.setAddress(targetAddress);
11. target.setRetries(1);
12. target.setTimeout(5000);
13. target.setVersion(SnmpConstants.version3);
14. target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
15. target.setSecurityName(new OctetString("MD5DES"));
16.
17. // create the PDU
18. PDU pdu = new ScopedPDU();
19. pdu.add(new VariableBinding(new OID("1.3.6")));
20. pdu.setType(PDU.GETNEXT);
21.
22. // send the PDU
23. ResponseEvent response = snmp.send(pdu, target);
24. // extract the response PDU (could be null if timed out)
25. PDU responsePDU = response.getResponse();
26. // extract the address used by the agent to send the response:
27. Address peerAddress = response.getPeerAddress();
28. An asynchronous SNMPv1 request is sent by the following code:
29.
30. // setting up target
31. CommunityTarget target = new CommunityTarget();
32. target.setCommunity(new OctetString("public"));
33. target.setAddress(targetAddress);
34. target.setRetries(2);
35. target.setTimeout(1500);
36. target.setVersion(SnmpConstants.version1);
37. // creating PDU
38. PDU pdu = new PDU();
39. pdu.add(new VariableBinding(new OID(new int[] {1,3,6,1,2,1,1,1})));
40. pdu.add(new VariableBinding(new OID(new int[] {1,3,6,1,2,1,1,2})));
41. pdu.setType(PDU.GETNEXT);
42. // sending request
43. ResponseListener listener = new ResponseListener() {
44. public void onResponse(ResponseEvent event) {
45. // Always cancel async request when response has been received
46. // otherwise a memory leak is created! Not canceling a request
47. // immediately can be useful when sending a request to a broadcast
48. // address.
49. ((Snmp)event.getSource()).cancel(event.getRequest(), this);
50. System.out.println("Received response PDU is: "+event.getResponse());
51. }
52. };
53. snmp.sendPDU(pdu, target, null, listener);
54.
55. //Traps (notifications) and other SNMP PDUs can be received by adding the folling code to the first code snippet above:
56. CommandResponder trapPrinter = new CommandResponder() {
57. public synchronized void processPdu(CommandResponderEvent e) {
58. PDU command = e.getPDU();
59. if (command != null) {
60. System.out.println(command.toString());
61. }
62. }
63. };
64. snmp.addCommandResponder(trapPrinter);
65.
66.
67.
68. Version:
69. 1.8
70. Author:
71. Frank Fock
72. 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协议了。
分享到:
相关推荐
在这个项目中,我们将探讨如何使用VB6来实现SNMP通信,并解析SNMP的数据结构。 首先,我们要理解SNMP的基本概念。SNMP由三部分组成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理站通常是一个运行在...
Java进行SNMP通信的指南SnmpProgrammingGuideViaJava.doc Java实现snmp的get和walk代码示例.doc snmp4j.chm snmp.chm SnmpMain.java snmp配置说明.doc snmp协议详细讲解.doc ToolsetAdministratorGuide.pdf ...
在这个"snmp.rar_RSH.EXE SNMP_SNMP_snmp协议通信"的案例中,我们将深入探讨如何利用SNMP协议来实现PC与网关之间的通信,以及如何获取网关的CPU使用率和内存使用率。 首先,SNMP协议基于UDP(User Datagram ...
3. **Java中的SNMP实现**: 在Java中,通常使用`SNMP4J`库来实现SNMP协议。SNMP4J是一个开源的、全面的SNMP开发工具包,提供了对SNMPv1、v2c和v3的支持。 4. **创建SNMP代理**: - 首先,你需要在项目中导入SNMP4...
在提供的文件中,"Java SNMP Package - 网络工具包 - 开源中国社区.mht"可能是一个网页或文档,包含了关于这个Java SNMP实现的更多详细信息,如使用教程、示例代码或API参考。而"JAVA_SNMP_source_1.4.2.zip"则很...
### SNMP 实现原理 简单网络管理协议(Simple Network Management Protocol,SNMP)是一种广泛应用于互联网上的设备管理和监控的标准协议。其主要功能是收集网络管理信息并进行相应的操作。SNMP的工作方式是基于...
SNMP(简单网络管理协议)是一种广泛用于网络设备管理的...开发者需要关注网络设备的配置、SNMP代理的设置以及网络通信的安全性。同时,对于大型网络环境,有效利用`snmpwalk`进行自动化监控和数据分析也是关键技能。
SNMP4J是一个开源的Java库,提供了一个完整的SNMP实现,包括PDU构造、消息编码和解码、错误处理等功能。它支持SNMPv1、v2c和v3的安全性和认证机制。使用SNMP4J,开发者可以轻松地在Java应用中集成SNMP功能。 3. ...
标签中的"linux_snmp"表明这是针对Linux环境的SNMP实现,"qt_snmp"表示它与Qt集成,"snmp_qt"和"snmp++"则强调了这是用C++编写的,且可能包含对SNMPv1、v2c和v3的支持。"snmp++_qt"可能意味着库中还包含了对SNMP++库...
《基于SNMP的通信网络性能管理模块设计与实现》 通信网络的性能管理是网络管理中的核心环节,其目标在于优化网络性能,提升运行质量。ISO定义的网络管理五大功能域中,性能管理负责测试网络各单元的性能,包括网络...
本文介绍了一个基于SNMP及串口通信的网络监控与报警系统的设计与实现。该系统通过结合两种不同的技术,实现了对网络状态的实时监控,并能在检测到异常情况时迅速采取行动。这对于提高网络管理效率、降低运维成本具有...
"Java进行SNMP通信的指南" Java 进行 SNMP 通信的指南中,我们会遇到支持 SNMP 协议...Java 进行 SNMP 通信的指南中,我们需要了解 SNMP 协议的原理和实现过程,使用 SNMP4J 工具包来实现客户端调用和服务器端模拟。
基于SNMP实现对服务器中LXD容器的流量监控系统Java源码.zip基于SNMP实现对服务器中LXD容器的流量监控系统Java源码.zip基于SNMP实现对服务器中LXD容器的流量监控系统Java源码.zip基于SNMP实现对服务器中LXD容器的流量...
本压缩包包含了一个用C语言实现的SNMP简单示例的源代码,非常适合初学者理解和学习SNMP的工作原理。 首先,我们要理解SNMP的基本概念。SNMP由三部分组成:管理信息库(MIB)、代理(Agent)和网络管理站(NMS)。...
在这个“SNMP管理站开发-java实现”的主题中,我们将深入探讨如何使用Java语言来构建一个SNMP管理站,以实现对SNMP代理的远程访问。 首先,要理解SNMP的基本概念。SNMP由三部分组成:管理信息库(MIB)、管理站...
在Delphi编程环境中,实现SNMP协议可以帮助开发者轻松地与网络设备进行交互,获取设备状态、配置参数以及进行故障排查。本组件为Delphi开发者提供了一个方便的工具,简化了SNMP通信的复杂性。 首先,我们要理解SNMP...
- **通信机制**:Manager端与Agent端之间的通信依赖于SNMP协议数据单元(PDU)。PDU支持GET、GET-NEXT、SET和TRAP等不同类型的消息,分别用于读取信息、读取下一个信息、修改设备状态和发送异步通知。 - **MIB-II的...
2. **Trap的概念**:在SNMP中,Trap是网络设备向管理站发送的一种非请求式的通信方式,通常用于报告设备状态改变、错误或其他重要事件。Trap分为多种类型,例如冷启动(coldStart)、热启动(warmStart)、意外关闭...
Java中的SNMP(简单网络管理协议)是一...通过学习这些资料,开发者不仅可以了解SNMP的基本概念,还能掌握SNMP4J库的使用方法,从而在实际项目中实现SNMP通信,包括发送和接收SNMPTrap,有效地进行网络设备管理和监控。
通过以上步骤,你可以创建一个基本的、跨平台的SNMP trap接收器,它可以与网络设备进行通信,接收并处理来自不同设备的trap通知。在实际应用中,你可能还需要考虑安全性,例如使用安全的SNMP版本(如v3),并配置...