snmp协议:简单的网络管理协议,常用于管理网络设备,在java开发中,使用snmp4j作为底层snmp组件比较受欢迎,
下面的例子简单描述了如何基于snmp4j构建简单的snmp服务器和客户端
snmp服务器
package com.gbcom.protocol.snmp;
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.MessageException;
import org.snmp4j.PDU;
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.mp.StateReference;
import org.snmp4j.mp.StatusInformation;
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 syz
*
* @date 下午3:28:28
* @version v1.0.0
* @see SnmpTrapReceiver
*/
public class SnmpTrapReceiver implements CommandResponder {
private MultiThreadedMessageDispatcher dispatcher;
private Snmp snmp = null;
private Address listenAddress;
private ThreadPool threadPool;
public SnmpTrapReceiver() {
}
//初始化监听。
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) {
if (respEvnt != null && respEvnt.getPDU() != null) {
PDU src_pdu = respEvnt.getPDU();
// 需要确认trap
if (src_pdu.getType() == PDU.INFORM) {
PDU responsePDU = new PDU(src_pdu);
responsePDU.setErrorIndex(0);
responsePDU.setErrorStatus(0);
responsePDU.setType(PDU.RESPONSE);
StatusInformation statusInfo = new StatusInformation();
StateReference stateRef = respEvnt.getStateReference();
try {
respEvnt.getMessageDispatcher().returnResponsePdu(
respEvnt.getMessageProcessingModel(),
respEvnt.getSecurityModel(),
respEvnt.getSecurityName(),
respEvnt.getSecurityLevel(), responsePDU,
respEvnt.getMaxSizeResponsePDU(), stateRef,
statusInfo);
} catch (MessageException msgEx) {
msgEx.printStackTrace();
}
}
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) {
//开启服务
SnmpTrapReceiver multithreadedtrapreceiver = new SnmpTrapReceiver();
multithreadedtrapreceiver.run();
}
}
snmp客户端
封装常用方法
package com.gbcom.protocol.snmp;
import java.io.IOException;
import java.util.Vector;
import org.apache.log4j.Logger;
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;
/**
* 本类用于向管理进程发送信息 {@code Trap GET SET}
*
* @author syz
* @date 下午5:02:20
* @version v1.0.0
* @see SnmpSender
*/
public class SnmpSender {
private static final Logger LOG = Logger.getLogger(SnmpSender.class);
private Snmp snmp = null;
private Address targetAddress = null;
public void initComm() throws IOException {
// 设置管理进程的IP和端口
targetAddress = GenericAddress.parse("udp:127.0.0.1/161");
TransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
LOG.info("init SNMP object succes !! target = udp:127.0.0.1/161");
}
/**
* 向管理进程发送Trap报文
*
* @throws IOException
*/
public void sendTrap() throws IOException { targetAddress = GenericAddress.parse("udp:127.0.0.1/162");
// 设置 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.2.3377.10.1.1.1.1"),
new OctetString("SnmpTrap")));
pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.2"),
new OctetString("JavaEE")));
pdu.setType(PDU.TRAP);
// 向Agent发送PDU,并接收Response
ResponseEvent respEvnt = snmp.send(pdu, target);
// 解析Response
readResponse(respEvnt);
// 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 ResponseEvent sendPDU(PDU pdu) throws IOException {
// 设置 target
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(targetAddress);
// 通信不成功时的重试次数
target.setRetries(1);
// 超时时间
target.setTimeout(1500);
target.setVersion(SnmpConstants.version2c);
// 向Agent发送PDU,并返回Response
return snmp.send(pdu, target);
}
public void doSet() 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);
readResponse(sendPDU(pdu));
}
public void doGet() throws IOException {
// get PDU
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 1,
0 })));
pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 2,
0 })));
pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 3,
0 })));
pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 4,
0 })));
pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 5,
0 })));
pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 6,
0 })));
pdu.setType(PDU.GET);
readResponse(sendPDU(pdu));
}
private void readResponse(ResponseEvent respEvnt) {
// 解析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);
LOG.info("THREAD NUM--"+Thread.currentThread() + recVB.getOid() + " : " + recVB.getVariable());
}
}
}
public void doWork(){
for(int i=0;i<1;i++){
Thread t = new Thread(new WorkThread());
t.start();
}
}
class WorkThread implements Runnable{
@Override
public void run() {
while(!Thread.currentThread().interrupted()){
try {
// doGet();
// doSet();
Thread.sleep(1*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
LOG.error("THREAD NUM--"+Thread.currentThread() + "InterruptedException",e);
} catch (Exception e) {
e.printStackTrace();
LOG.error("THREAD NUM--"+Thread.currentThread() + "other Exception",e);
continue;
}
}
}
}
public static void main(String[] args) {
try {
SnmpSender util = new SnmpSender();
util.initComm();
// util.sendTrap();
LOG.info("--- DO GET --");
// util.doGet();
LOG.info("----do set---");
// util.doSet();
util.doWork();
} catch (IOException e) {
e.printStackTrace();
}
}
}
注意sender的正确运行 需要 开启agent,,一般情况下,设备侧实现snmp agent,服务器实现snmp server
如果需要snmp4j组件作为snmp协议开发,可以参考上面的例子
分享到:
相关推荐
综上所述,通过C#和SnmpSharpNet库,我们可以构建一个功能完善的SNMP客户端,实现对网络设备的远程监控和管理。此项目为SNMP V1和V2c版本的查询提供了完整的实现,方便开发者快速理解和学习SNMP在C#环境下的应用。
SNMP4J是一个开源的Java库,专门设计用于实现SNMP协议的客户端功能,使得开发者能够从网络设备中读取或设置管理信息。本篇文章将详细探讨如何使用SNMP4j库在Java中读取SNMP协议数据。 首先,了解SNMP是必要的。SNMP...
5. **灵活性**:SNMP4J设计灵活,可以轻松集成到各种Java应用程序中,无论是服务器端还是客户端应用。 压缩包中的两个文件: - **snmp4j-2.5.8-javadoc.jar**:这是SNMP4J的API文档,包含了所有类和方法的详细说明...
SNMP4J是一个Java实现的简单网络管理协议(SNMP)的开源库,它提供了全面的SNMPv1、...这两个jar包的结合使用,既能够实现SNMP客户端的功能,也能够创建自定义的SNMP服务器端解决方案,满足网络监控和管理的各种需求。
通过以上步骤,你就可以在PC上使用SNMP4J-Agent模拟一个SNMP服务器了。这对于开发和调试SNMP应用,特别是网络设备管理软件,非常实用。同时,由于SNMP4J-Agent是开源的,你可以根据需要对其进行扩展,添加更复杂的...
通过Snmp4j.jar,开发者可以轻松地将SNMP功能集成到Java应用程序中,实现网络设备的监控和管理,从而提升网络运维的效率和准确性。 总之,SNMP是一个强大的网络管理工具,而Snmp4j.jar则是Java开发者实现SNMP功能的...
SNMP TRAP消息其实就是UDP...本demo包含TRAP接收的服务器和发送TRAP消息的UDP客户端两个部分,基于SnmpSharpNet做的,VS2008工程,全部源代码,可直接编译和测试。 运行TRAP服务器端,不需要开启电脑的SNMP服务器。
SNMP是一种广泛使用的网络管理协议,它允许管理员监控和管理网络设备,如路由器、交换机、服务器等。QT SNMP库使得开发人员能够在Linux、Windows和Mac等不同操作系统上构建跨平台的SNMP应用。 在描述中提到的"qt-...
SNMP4J是一个纯Java实现的SNMP协议库,它允许开发者在Java环境中创建SNMP客户端或服务器应用程序。以下是一些关键知识点: 1. **SNMP版本支持**: SNMP4J支持SNMP v1、v2c和v3,其中v3提供了增强的安全性,包括...
而SNMP4J-CLT则是基于这个库构建的命令行客户端工具,它提供了简单易用的界面,用于执行SNMP GET、SET、GETNEXT、GETBULK等操作。 使用SNMP4J-CLT,你可以执行以下操作: 1. 获取(GET):从网络设备中检索特定变量...
SNMP4J是Java开发人员实现SNMP功能的首选工具,因为它提供了完整的SNMPv1、v2c和v3支持,包括Trap处理、Get、Set操作以及Walk机制。在实际应用中,我们可以通过以下步骤使用SNMP4J: 1. **导入SNMP4J库**:首先,在...
SNMP4J是一个Java实现的简单网络管理协议(SNMP)库,用于开发与网络设备交互的应用程序。SNMP是一种广泛应用于网络管理的标准协议,它允许系统管理员远程监控和管理网络设备,如路由器、交换机、服务器等。版本1.9...
5. **SNMP代理定义**: 如果你需要实现一个SNMP代理,SNMP4j提供了`MIB`(管理信息库)的概念,你可以定义自己的MIB变量并处理GET和SET请求。 6. **异常处理**: 在SNMP编程中,需要处理各种异常,如`...
### 基于ARM和LINUX的SNMP网管系统的实现 #### 概述 随着互联网技术的迅猛发展,人们对网络服务的依赖程度不断提高。网络的稳定性和安全性变得尤为重要,即使是短暂的网络中断也会给人们的日常生活和工作带来严重...
SnmpDigger是一款SNMP工具,专门设计用于查询和分析SNMP服务器及设备的信息。它提供了一个直观的用户界面,使网络管理人员能够轻松地获取和理解网络设备的状态和配置。 SnmpDigger的主要功能包括: 1. **设备发现...
4. **SNMP4j库的使用**:SNMP4j提供了一套完整的API,用于构建SNMP客户端和服务器。了解如何创建SNMP会话、发送GET、SET请求、接收TRAP、定义PDU(协议数据单元)以及处理响应是使用SNMP4j的关键。 5. **实例源码...
本文将详细介绍基于C语言实现的SNMP服务源码以及与之相关的知识点。 首先,C语言实现的SNMP服务源码意味着开发者使用C语言编写了处理SNMP报文、解析请求、构建响应等功能的代码。这涉及到对SNMP协议的深入理解,...
2. **事件驱动模型**: SNMP4J基于事件驱动的设计模式,允许应用程序订阅并处理SNMP响应和陷阱事件。 3. **灵活的PDU处理**: 支持所有类型的SNMP协议数据单元(PDU),包括Get, Set, GetNext, GetBulk等操作,以及 ...
C语言实现SNMP trap发送需要包含`net-snmp`库,这是一个开源项目,提供了SNMP协议的实现,包括客户端和服务器端的功能。`net-snmp-trap-send.c`这个文件很可能是实现陷阱发送功能的源代码。 在C语言中,实现SNMP ...