`
assertmyself
  • 浏览: 28624 次
  • 性别: 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 TRAP服务器(包含发送snmp trap消息的测试客户端)

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

    mibbrowser测试snmp工具

    SNMP基于客户端/服务器模型,其中网络中的设备被配置为代理(Agent),提供关于设备和资源的信息。网络管理员使用SNMP管理系统(Manager),通过发送请求和接收响应的方式,与代理设备进行通信。 MIB Browser是网络...

    SnmpDigger snmp客户端连接程序

    SNMP工具。可以查看SNMP服务器、设备的相关信息。 zwell的SnmpDigger。竟然从网上消失了。从光盘上拷出来的。

    aiosnmp:aiosnmp是用于asyncio的异步SNMP客户端和陷阱服务器

    aiosnmp是用于asyncio的异步SNMP客户端。 安装 pip install aiosnmp 注意 仅支持snmp v2c,不支持v3版本Oid应该像.1.3.6...或1.3.6... 。 iso.3.6...不受支持 基本用法 import asyncio import aiosnmp async def ...

    python项目简易SNMP的管理站工具.zip

    1. **PySNMP介绍**:PySNMP是一个用于Python编程语言的SNMP协议开发库,它支持SNMPv1、SNMPv2c和SNMPv3版本,允许开发者创建SNMP客户端和服务器。该库通过pip安装后即可在Python项目中导入使用。 2. **功能实现**:...

    SIM服务器端与客户端配置手册V2.0

    SIM服务器端与客户端配置,SIM5.2可以通过WBEM/WMI或SNMP这两种网络管理协议对受管服务器进行管理。WBEM/WMI一般针对Integrity服务器上的HP-UX系统;SNMP一般针对Proliant服务器上的Windows/Linux系统。

    服务器基础知识介绍(服务器全部组件).pdf

    故障日志记录和 SNMP 警报发送 访问系统事件日志 (System Event Log ,SEL) 和传感器状况 控制包括开机和关机 独立于系统电源或工作状态的支持 模拟KVM 通过远程连接服务器的BMC端口,来实现对服务器的操作和控制,就...

    常用品牌网络设备SNMP、radius配置命令

    SNMP是专门设计用于在 IP 网络管理网络节点(服务器、工作站、路由器、交换机及Hubs等)的一种标准协议,它是一种应用层协议。 SNMP 使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过 SNMP...

    SNMP:纯PHP SNMP库

    它实现了 / / 描述的SNMP客户端功能。 它还包括其他各种RFC中描述的功能,例如SHA2身份验证( )和强加密机制( / )。 一些主要功能包括: 支持SNMP版本1、2和3。 支持所有身份验证机制(md5,sha1,sha224,sha...

    seman:一个简单的基于SNMP的服务器管理器

    塞曼 这是Seman,一个用于基于SNMP的服务的简单服务器管理器。 依存关系 PHP 7.4.3或更高版本(可能与较旧版本兼容,需要mbstring , bcmath , snmp和intl扩展名...安装可选的依赖项以自己托管和查询SNMP服务器: sudo

    监控客户端安装包zabbix-4.2.1.tar.gz

    可用于监视各种网络服务、服务器和网络机器等状态。  使用各种 Database-end 如 MySQL, PostgreSQL, SQLite, Oracle 或 IBM DB2 储存资料。Server 端基于 C语言、Web 管理端 frontend 则是基于 PHP 所制作的。...

    pyagentx:本机Python AgentX客户端实施以扩展SNMP代理

    Python AgentX实施“ pyagentx”是AgentX协议(RFC 2741)的纯Python实现,它将允许您通过编写AgentX子代理来扩展SNMP代理(snmpd),而无需修改原始SNMP代理。 [RFC 2741:代理扩展(AgentX)协议版本1]( )特征...

    javasnmp源码-TACACS:JavaTACACS+API(完整供客户端使用,以及用于开发服务器的框架)

    客户端,但代码也包含用于开发服务器的框架。 最初的 TACACS(无加)协议是由美国国防部开发的。 后来被思科增强,成为 TACACS+。 TACACS 是终端访问控制器访问控制服务的首字母缩写词。 它被网络部门用于对 IT 网络...

    citrix 中文管理操作手册

    配置服务器和客户端之间的 SSL/TLS 134 实现 SSL Relay 的任务摘要 135 在启用了用户帐户控制的情况下安装和配置 SSL Relay 工具 135 获取并安装服务器和根 SSL 证书 136 选择 SSL 证书颁发机构 136 获取已签名 SSL ...

    项目8-局域网服务器的搭建.pptx

    计算机网络技术 项目8-局域网服务器的搭建全文共42页,当前为第1页。 学习情境二:构建中型网络 项目八:局域网服务器的搭建 项目8-局域网服务器... 项目实施 任务1:基于Windows Server 2003的DHCP的实现和应用 任务2

    基于Java的人事管理系统的设计与实现.doc

    客户端表示层分html、java applet和java application等类型,服务器 端表示层用jsp、servlet、tag libraries和javabeans实现,业务层用ejb实现。接入 网络设备控制功能是系统同接入层网络设备进行交互的窗口,对...

    SNMP-Tool-Node

    关于该项目是由Node JS和React JS组成的SNMP项目。 该项目的目标是创建一个易于使用的SNMP工具。 我在这里使用了这个库: : 新的要使用客户端,您可以转到此处: : 安装如果您使用的是Windows,则只需运行批处理文件...

    主机服务器运维管理制度.doc

    一、运维管理系统的围 运维管理系统主要是针对网络设备、服务器、业务应用系统、客户端的pc机进行维 护和管理。 二、IT运维管理系统的维护职责 1、系统管理人员负责IT运维服务器硬件的巡检和维护,负责操作系统的...

    如何基于web技术开发国产化网管软件

    随着Web技术的流行和发展,在...浏览器/服务器)结构通信,软件系统的部署、升级维护和数据备份只需在服务器端完成,客户端无需做应用程序的安装和调试,极大地降低了系统总维护成本,加强了系统的稳定性和可扩展性。

    java开源包4

    BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加起来就不小了),而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库,用于异步输出记录的简单小框架用于高并发下数据输出使用...

Global site tag (gtag.js) - Google Analytics