`
assertmyself
  • 浏览: 29720 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

snmp服务器和客户端实现,基于snmp4j

阅读更多
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和V2版本)

    综上所述,通过C#和SnmpSharpNet库,我们可以构建一个功能完善的SNMP客户端,实现对网络设备的远程监控和管理。此项目为SNMP V1和V2c版本的查询提供了完整的实现,方便开发者快速理解和学习SNMP在C#环境下的应用。

    java利用snmp4j包来读取snmp协议数据

    SNMP4J是一个开源的Java库,专门设计用于实现SNMP协议的客户端功能,使得开发者能够从网络设备中读取或设置管理信息。本篇文章将详细探讨如何使用SNMP4j库在Java中读取SNMP协议数据。 首先,了解SNMP是必要的。SNMP...

    snmp4j的jar包

    5. **灵活性**:SNMP4J设计灵活,可以轻松集成到各种Java应用程序中,无论是服务器端还是客户端应用。 压缩包中的两个文件: - **snmp4j-2.5.8-javadoc.jar**:这是SNMP4J的API文档,包含了所有类和方法的详细说明...

    SNMP4J 的jar包

    SNMP4J是一个Java实现的简单网络管理协议(SNMP)的开源库,它提供了全面的SNMPv1、...这两个jar包的结合使用,既能够实现SNMP客户端的功能,也能够创建自定义的SNMP服务器端解决方案,满足网络监控和管理的各种需求。

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

    通过以上步骤,你就可以在PC上使用SNMP4J-Agent模拟一个SNMP服务器了。这对于开发和调试SNMP应用,特别是网络设备管理软件,非常实用。同时,由于SNMP4J-Agent是开源的,你可以根据需要对其进行扩展,添加更复杂的...

    用NET-SNMP软件包开发简单客户端代理

    SNMP(简单网络管理协议)是网络管理员用来监控和管理网络设备的标准协议。它允许设备(如路由器、交换机、服务器等)向网络管理系统报告状态信息,同时接收来自管理系统的控制指令。本文将介绍如何使用NET-SNMP...

    C语言实现的snmp服务源码

    本文将详细介绍基于C语言实现的SNMP服务源码以及与之相关的知识点。 首先,C语言实现的SNMP服务源码意味着开发者使用C语言编写了处理SNMP报文、解析请求、构建响应等功能的代码。这涉及到对SNMP协议的深入理解,...

    Snmp详介、Snmp4j.jar

    通过Snmp4j.jar,开发者可以轻松地将SNMP功能集成到Java应用程序中,实现网络设备的监控和管理,从而提升网络运维的效率和准确性。 总之,SNMP是一个强大的网络管理工具,而Snmp4j.jar则是Java开发者实现SNMP功能的...

    C#基于SnmpSharpNet做的SNMP TRAP服务器(包含发送snmp trap消息的测试客户端)

    SNMP TRAP消息其实就是UDP...本demo包含TRAP接收的服务器和发送TRAP消息的UDP客户端两个部分,基于SnmpSharpNet做的,VS2008工程,全部源代码,可直接编译和测试。 运行TRAP服务器端,不需要开启电脑的SNMP服务器。

    qt-snmp.zip_linux snmp_qt snmp_snmp QT_snmp++_snmp++ qt

    SNMP是一种广泛使用的网络管理协议,它允许管理员监控和管理网络设备,如路由器、交换机、服务器等。QT SNMP库使得开发人员能够在Linux、Windows和Mac等不同操作系统上构建跨平台的SNMP应用。 在描述中提到的"qt-...

    snmp4j-2.3.0源码等

    SNMP4J是一个纯Java实现的SNMP协议库,它允许开发者在Java环境中创建SNMP客户端或服务器应用程序。以下是一些关键知识点: 1. **SNMP版本支持**: SNMP4J支持SNMP v1、v2c和v3,其中v3提供了增强的安全性,包括...

    SNMP4J-CLT

    而SNMP4J-CLT则是基于这个库构建的命令行客户端工具,它提供了简单易用的界面,用于执行SNMP GET、SET、GETNEXT、GETBULK等操作。 使用SNMP4J-CLT,你可以执行以下操作: 1. 获取(GET):从网络设备中检索特定变量...

    SNMP4J远程获取设备信息案例

    SNMP4J是Java开发人员实现SNMP功能的首选工具,因为它提供了完整的SNMPv1、v2c和v3支持,包括Trap处理、Get、Set操作以及Walk机制。在实际应用中,我们可以通过以下步骤使用SNMP4J: 1. **导入SNMP4J库**:首先,在...

    snmp4j源码

    SNMP4J是一个Java实现的简单网络管理协议(SNMP)库,用于开发与网络设备交互的应用程序。SNMP是一种广泛应用于网络管理的标准协议,它允许系统管理员远程监控和管理网络设备,如路由器、交换机、服务器等。版本1.9...

    snmp4j开发包,强烈推荐

    5. **SNMP代理定义**: 如果你需要实现一个SNMP代理,SNMP4j提供了`MIB`(管理信息库)的概念,你可以定义自己的MIB变量并处理GET和SET请求。 6. **异常处理**: 在SNMP编程中,需要处理各种异常,如`...

    基于ARM和LINUX的SNMP网管系统的实现

    ### 基于ARM和LINUX的SNMP网管系统的实现 #### 概述 随着互联网技术的迅猛发展,人们对网络服务的依赖程度不断提高。网络的稳定性和安全性变得尤为重要,即使是短暂的网络中断也会给人们的日常生活和工作带来严重...

    SnmpDigger snmp客户端连接程序

    SnmpDigger是一款SNMP工具,专门设计用于查询和分析SNMP服务器及设备的信息。它提供了一个直观的用户界面,使网络管理人员能够轻松地获取和理解网络设备的状态和配置。 SnmpDigger的主要功能包括: 1. **设备发现...

    SNMP4j学习开发例子及文档

    4. **SNMP4j库的使用**:SNMP4j提供了一套完整的API,用于构建SNMP客户端和服务器。了解如何创建SNMP会话、发送GET、SET请求、接收TRAP、定义PDU(协议数据单元)以及处理响应是使用SNMP4j的关键。 5. **实例源码...

    snmp4j

    2. **事件驱动模型**: SNMP4J基于事件驱动的设计模式,允许应用程序订阅并处理SNMP响应和陷阱事件。 3. **灵活的PDU处理**: 支持所有类型的SNMP协议数据单元(PDU),包括Get, Set, GetNext, GetBulk等操作,以及 ...

    net-snmp-trap发送(c语言)

    C语言实现SNMP trap发送需要包含`net-snmp`库,这是一个开源项目,提供了SNMP协议的实现,包括客户端和服务器端的功能。`net-snmp-trap-send.c`这个文件很可能是实现陷阱发送功能的源代码。 在C语言中,实现SNMP ...

Global site tag (gtag.js) - Google Analytics