`
xpenxpen
  • 浏览: 726140 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

snmp4j初步

阅读更多
上篇文章我们对SNMP有了一个初步上的认识,这篇文章便准备用开源工具包snmp4j来编程实现一些SNMP的功能。

1.下载
首先到官网下载最新的snmp4j 2.2.5
http://www.snmp4j.org/html/download.html

2.一个比较好的起步点是阅读官方的javadoc,里面有比较详细的说明和示例代码,可以从org.snmp4j包看起。

一个远程系统是通过创建一个Target实例来被snmp4j识别的。
SNMPv1和SNMPv2c必须使用CommunityTarget,SNMPv3则要使用UserTarget。

一条SNMP消息包括消息的载荷,PDU和消息头。简单来说,消息头用Target表示,而PDU则用以下类来表示:
    PDUv1 (SNMPv1)
    PDU (SNMPv2c)
    ScopedPDU (SNMPv3)

消息发送有2种方式:同步和异步。
异步方式需要实现ResponseListener接口,当消息返回时,这个接口的onResponse(ResponseEvent event)方法会被回调。

3.代码
以下代码演示了同步和异步2种方式获取SNMP消息。
本机是Win7的,自带的SNMP协议是v2版的。(Win7不支持v3)

以下是一些OID的解释
1.3.6.1.2.1.1.1        获取CPU和OS信息
1.3.6.1.2.1.2.1.0      网络接口信息描述
1.3.6.1.2.1.25.6.3.1.2 获取安装的软件信息

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
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.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class SnmpTest {

	public static void main(String[] args) throws Exception {
		Address targetAddress = GenericAddress.parse("udp:127.0.0.1/161");
		TransportMapping<UdpAddress> transport = new DefaultUdpTransportMapping();
		Snmp snmp = new Snmp(transport);
		transport.listen();

		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString("public"));
		target.setAddress(targetAddress);
		target.setRetries(2);
		target.setTimeout(15000);
		target.setVersion(SnmpConstants.version1);

		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.1"))); // sysDescr
		pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.1"))); // ifNumber
		pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.25.6.3.1.2"))); // Software
		pdu.setType(PDU.GETNEXT);
		
		//发送同步消息
		ResponseEvent event = snmp.send(pdu, target);

		if (event.getResponse() == null) {
			System.out.println("request timed out");

		} else {
			PDU response = event.getResponse();
			System.out.println("Received synchronous response from: " + event.getPeerAddress());
			// dump response PDU
			System.out.println(response.toString());
			
			//遍历并打印得到的信息
			VariableBinding[] array = response.toArray();
			for (VariableBinding variableBinding : array) {
				System.out.println(variableBinding.getOid() + "=" + variableBinding.getVariable());
				
				//如果是文字,则取得字节数组并打印出人看得懂的中文
				if (variableBinding.getVariable() instanceof OctetString) {
					OctetString octetString = (OctetString)variableBinding.getVariable();
					byte[] value = octetString.getValue();
					String softwareName = new String(value, "GB2312");
					System.out.println(softwareName);
				}
			}
		}
		
		System.out.println();
		
		//发送异步消息
		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);
		        PDU response = event.getResponse();
		        PDU request = event.getRequest();
		        if (response == null) {
		            System.out.println("Request "+request+" timed out");
		        }
		        else {
					System.out.println("Received asynchronous response from: " + event.getPeerAddress());
		            System.out.println(response + " on request " + request);
		        }
		    }
		};
		snmp.send(pdu, target, null, listener);
		
		//等待一会儿,不然还没等异步消息接收到,这里程序就直接退出了。
		Thread.sleep(1000);
	}

}


4.运行结果

Received synchronous response from: 127.0.0.1/161
RESPONSE[requestID=1131489612, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.1.0 = Hardware: x86 Family 6 Model 42 Stepping 7 AT/AT COMPATIBLE - Software: Windows Version 6.1 (Build 7601 Multiprocessor Free); 1.3.6.1.2.1.2.1.0 = 31; 1.3.6.1.2.1.25.6.3.1.2.1 = 57:69:6e:64:6f:77:73:20:c7:fd:b6:af:b3:cc:d0:f2:b0:fc:20:2d:20:47:6f:6f:67:6c:65:2c:20:49:6e:63:2e:20:28:57:69:6e:55:53:42:29:20:41:6e:64:72:6f:69:64:55:73:62:44:65:76:69:63:65:43:6c:61:73:73]]
1.3.6.1.2.1.1.1.0=Hardware: x86 Family 6 Model 42 Stepping 7 AT/AT COMPATIBLE - Software: Windows Version 6.1 (Build 7601 Multiprocessor Free)
Hardware: x86 Family 6 Model 42 Stepping 7 AT/AT COMPATIBLE - Software: Windows Version 6.1 (Build 7601 Multiprocessor Free)
1.3.6.1.2.1.2.1.0=31
1.3.6.1.2.1.25.6.3.1.2.1=57:69:6e:64:6f:77:73:20:c7:fd:b6:af:b3:cc:d0:f2:b0:fc:20:2d:20:47:6f:6f:67:6c:65:2c:20:49:6e:63:2e:20:28:57:69:6e:55:53:42:29:20:41:6e:64:72:6f:69:64:55:73:62:44:65:76:69:63:65:43:6c:61:73:73
Windows 驱动程序包 - Google, Inc. (WinUSB) AndroidUsbDeviceClass

Received asynchronous response from: 127.0.0.1/161
RESPONSE[requestID=1131489612, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.1.0 = Hardware: x86 Family 6 Model 42 Stepping 7 AT/AT COMPATIBLE - Software: Windows Version 6.1 (Build 7601 Multiprocessor Free); 1.3.6.1.2.1.2.1.0 = 31; 1.3.6.1.2.1.25.6.3.1.2.1 = 57:69:6e:64:6f:77:73:20:c7:fd:b6:af:b3:cc:d0:f2:b0:fc:20:2d:20:47:6f:6f:67:6c:65:2c:20:49:6e:63:2e:20:28:57:69:6e:55:53:42:29:20:41:6e:64:72:6f:69:64:55:73:62:44:65:76:69:63:65:43:6c:61:73:73]] on request GETNEXT[requestID=1131489612, errorStatus=Success(0), errorIndex=0, VBS[1.3.6.1.2.1.1.1 = Null; 1.3.6.1.2.1.2.1 = Null; 1.3.6.1.2.1.25.6.3.1.2 = Null]]


5.snmp4j 和 snmp4j-agent
snmp4j可以获取被管节点信息
snmp4j-agent则是写agent端的代理程序的,我们可以自定义一个软件,写一个agent,这样就能被网管软件统一管理了。
另外jdk自带的JMX包也有snmp协议的实现,不过snmp4j可能更方便点。

6.参考资料
使用snmp4j实现Snmp功能 http://blog.csdn.net/clearwater21cn/article/details/2328047 一共3篇
分享到:
评论

相关推荐

    snmp4j.rar_SNMP_SNMP4J.jar_snmp4j的jar包_网络设备监控

    SNMP4J是一个Java实现的SNMP协议库,使得Java开发者能够轻松地在应用程序中集成SNMP功能,从而对网络设备进行监控和管理。 SNMP4J.jar是这个库的核心组件,包含了SNMP协议的各种操作所需的类和方法。这个压缩包中的...

    snmp4j.zip_java使用snmp4j_snmp4j_snmp4j java

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

    snmp4j包来读取snmp协议数据

    在Java环境中,SNMP4J库为开发者提供了便利,可以用来读取和操作SNMP协议的数据。本文将深入探讨如何利用SNMP4j包来读取SNMP协议数据。 首先,理解SNMP4j的基本概念至关重要。SNMP4j是一个开源的Java库,完全实现了...

    基于SNMP4J的SNMP操作实现代码

    SNMP4J是一个Java库,为SNMP协议提供了全面的支持,包括v1、v2c和v3这三个版本。本文将深入探讨如何使用SNMP4J来实现SNMP的基本操作,包括GET、GETNEXT、SET和TRAP。 1. SNMP协议基础: SNMP协议主要由管理站...

    snmp4j api文档

    **SNMP4J API文档详解** SNMP4J是一个开源的Java实现的简单网络管理协议(SNMP)库,它提供了全面的API用于开发SNMP应用程序。本文将深入解析SNMP4J API的核心概念和主要功能,帮助开发者理解和利用这个强大的工具...

    snmp4j源码和API

    SNMP4J是一个Java实现的简单网络管理协议(SNMP)的应用编程接口(API),它提供了全面的功能,用于开发SNMP应用。SNMP是网络管理领域的重要标准,用于监控和管理网络设备,如路由器、交换机和服务器。下面将详细...

    snmp4j实现snmp trap 发送与接收

    SNMP4J 实现 SNMP Trap 发送与接收 SNMP(Simple Network Management Protocol,简易网络管理协议)是一种广泛应用于网络管理的协议,SNMP4J 是一个基于 Java 的 SNMP 库,提供了完整的 SNMP 功能实现。本文将详细...

    snmp4j的jar包

    SNMP4J是一个基于Java语言实现的简单网络管理协议(SNMP)的开源库,它为开发者提供了在Java环境中开发SNMP应用的全面支持。SNMP是网络设备管理和监控的标准协议,广泛应用于网络设备配置、性能监控以及故障排查等...

    snmp4j-agent

    SNMP4J-Agentx是一个基于Java的开源工具,主要用于实现简单网络管理协议(SNMP)的代理功能。这个工具在SNMP4J项目下开发,是SNMP4J的一个扩展,提供了更丰富的功能和更方便的接口来创建和管理SNMP代理。SNMP4J-...

    SNMP实例大全--snmp4j(get ,trap,set,取mib)

    本文将详细介绍SNMP实例,特别是通过Java库snmp4j实现的GET、GETNEXT、SET操作以及TRAP发送和MIB获取。 1. **SNMP基本概念** SNMP由三个主要组件构成:管理站(Manager)、代理(Agent)和管理信息库(MIB)。管理...

    SNMP4J 的jar包

    SNMP4J是一个Java实现的简单网络管理协议(SNMP)的开源库,它提供了全面的SNMPv1、SNMPv2c和SNMPv3支持,包括代理(Agent)和管理站(Manager)的功能。这个jar包包含了SNMP4J的核心组件以及SNMP4J-Agent扩展,用于...

    用snmp4j获取本地所有oid

    Snmp4j是一个Java库,它提供了全面的SNMP支持,包括V1、V2c和V3版本,使得开发者能够在Java应用程序中轻松地进行SNMP通信。本篇文章将详细介绍如何在Windows环境下配置SNMP服务,并利用Snmp4j获取本地所有OID(对象...

    snmp4j-1.9.3d.zip_snmp4j-1.9.3d_snmp管理工具

    标题中的"snmp4j-1.9.3d.zip_snmp4j-1.9.3d_snmp管理工具"表明这是一个版本为1.9.3d的SNMP4J库的压缩包,它包含了对SNMP协议的支持和一些管理功能。 SNMP,全称Simple Network Management Protocol,是一种应用层...

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

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

    用SNMP4J实现的Trap源码

    在这个项目中,"用SNMP4J实现的Trap源码"是基于JAVA语言利用SNMP4J库编写的,旨在帮助开发者理解和实践如何通过编程方式实现SNMP Trap的功能。下面将详细解释相关的知识点: 1. **SNMP4J库**:SNMP4J是一个开源的...

    snmp4j-agent官方源码

    SNMP4J-Agent是SNMP4J项目的一部分,它是一个开放源码的Java实现,用于构建SNMP代理(Agent)应用程序。SNMP(简单网络管理协议)是一种广泛使用的网络管理协议,允许网络管理员监控和配置网络设备。SNMP4J-Agent...

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

    本文将深入探讨如何使用SNMP4J-Agent工具在个人计算机上模拟SNMP服务,以便进行测试和开发。 SNMP4J-Agent是SNMP4J项目的一部分,是一个开源的Java库,用于实现SNMP代理功能。它提供了丰富的API,可以方便地构建...

    snmp4j get walk

    SNMP(简单网络管理协议)是用于网络设备管理的标准协议,而SNMP4J是一个Java实现的SNMP库,它提供了在Java应用程序中与SNMP兼容设备交互的能力。"SNMP get walk" 是一个关键的操作,它允许从网络设备中批量获取MIB...

    SNMP4J远程获取设备信息案例

    SNMP4J是一个Java库,专门用于实现简单网络管理协议(SNMP)的应用程序。SNMP是网络管理和监控的标准协议,允许系统管理员远程收集和配置网络设备的信息。在这个"SNMP4J远程获取设备信息案例"中,我们将深入探讨如何...

    利用SNMP4J实现Snmp Trap完整例子

    利用SNMP4J实现Snmp Trap完整例子 - 企业应用 - Java - JavaEye论坛.mht

Global site tag (gtag.js) - Google Analytics