`

利用SNMP获取、走访节点值

阅读更多

      本例用到两个开源包,snmpget使用SNMP4J框架,snmpwalk使用Java SNMP Package开源包,下载地址分别为:

http://www.snmp4j.org/html/download.html

http://gicl.cs.drexel.edu/people/sevy/snmp/

/**
 * SNMP管理类
 */
public class SnmpManager {

	private static final Log log = LogFactory.getLog(SnmpManager.class);
	
	private static int version = 0; // SNMP版本, 0表示版本1
	
	private static String protocol = "udp"; // 监控时使用的协议
	
	private static String port = "161"; // 监控时使用的端口
		
	/**
	 * 获取SNMP节点值
	 * 
	 * @param ipAddress 目标IP地址
	 * @param community 公同体
	 * @param oid 对象ID
	 * @return String 监控结果代号
	 * @throws AppException
	 */
	@SuppressWarnings("unchecked")
	public static String snmpGet(String ipAddress, String community, String oid) throws AppException {
		String resultStat = null; // 监控结果状态
		
		StringBuffer address = new StringBuffer();
		address.append(protocol);
		address.append(":");
		address.append(ipAddress);
		address.append("/");
		address.append(port);
		
//		Address targetAddress = GenericAddress.parse(protocol + ":" + ipAddress + "/" + port);
		Address targetAddress = GenericAddress.parse(address.toString());
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID(oid)));
		pdu.setType(PDU.GET);

		// 创建共同体对象CommunityTarget
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString(community));
		target.setAddress(targetAddress);
		target.setVersion(SnmpConstants.version1);
		target.setTimeout(2000);
		target.setRetries(1);

		DefaultUdpTransportMapping udpTransportMap = null;
		Snmp snmp = null;
		try {
			// 发送同步消息
			udpTransportMap = new DefaultUdpTransportMapping();
			udpTransportMap.listen();
			snmp = new Snmp(udpTransportMap);
			ResponseEvent response = snmp.send(pdu, target);
			PDU resposePdu = response.getResponse();

			if (resposePdu == null) {
				log.info(ipAddress + ": Request timed out.");
			} else {
				//errorStatus = resposePdu.getErrorStatus();
				Object obj = resposePdu.getVariableBindings().firstElement();
				VariableBinding variable = (VariableBinding) obj;
				resultStat = variable.getVariable().toString();
			}
		} catch (Exception e) {
			throw new AppException("获取SNMP节点状态时发生错误!", e);
		} finally {
			if (snmp != null) {
				try {
					snmp.close();
				} catch (IOException e) {
					snmp = null;
				}
			}
			if (udpTransportMap != null) {
				try {
					udpTransportMap.close();
				} catch (IOException e) {
					udpTransportMap = null;
				}
			}
		}
		
		if (log.isInfoEnabled()) {
			log.info("IP:" + ipAddress + " resultStat:" + resultStat);
		}
		
		return resultStat;
	}
	
	
	/**
	 * 走访SNMP节点
	 * 
	 * @param ipAddress 目标IP地址
	 * @param community 共同体
	 * @param oid 节点起始对象标志符
	 * @return String[] 走方结果
	 * @throws AppException
	 */
	public static String[] snmpWalk(String ipAddress, String community, String oid) throws AppException {
		String[] returnValueString = null; // oid走访结果数组
		
		SNMPv1CommunicationInterface comInterface = null;
		try {
			InetAddress hostAddress = InetAddress.getByName(ipAddress);
			comInterface = new SNMPv1CommunicationInterface(
					version, hostAddress, community);
			comInterface.setSocketTimeout(2000);
			
			// 返回所有以oid开始的管理信息库变量值
			SNMPVarBindList tableVars = comInterface.retrieveMIBTable(oid);
			returnValueString = new String[tableVars.size()];
			
			// 循环处理所有以oid开始的节点的返回值
			for (int i = 0; i < tableVars.size(); i++) {
				SNMPSequence pair = (SNMPSequence) tableVars.getSNMPObjectAt(i); // 获取SNMP序列对象, 即(OID,value)对
				SNMPObject snmpValue = pair.getSNMPObjectAt(1); // 获取某个节点的返回值
				String typeString = snmpValue.getClass().getName(); // 获取SNMP值类型名
				// 设置返回值
				if (typeString.equals("snmp.SNMPOctetString")) {
					String snmpString = snmpValue.toString();
					int nullLocation = snmpString.indexOf('\0');
					if (nullLocation >= 0)
						snmpString = snmpString.substring(0, nullLocation);
					returnValueString[i] = snmpString;
				} else {
					returnValueString[i] = snmpValue.toString();
				}
			}
		} catch (SocketTimeoutException ste) {
			if (log.isErrorEnabled()) {
				log.error("走访IP为" + ipAddress + ", OID为" + oid + " 时超时!");
			}
			returnValueString = null;
		} catch (Exception e) {
			throw new AppException("SNMP走访节点时发生错误!", e);
		} finally {
			if (comInterface != null) {
				try {
					comInterface.closeConnection();
				} catch (SocketException e) {
					comInterface = null;
				}
			}
		}
		
		return returnValueString;
	}
}

 

 

 

 

 

 

分享到:
评论
8 楼 zizhi9999 2014-11-25  
为什么我的总是说timeout呢 很急 啊
7 楼 xdqcx 2009-10-08  
xdqcx 写道
LZ,您的方法snmpWalk()获取OID“1.3.6.1.2.1.2.2.1.6”的结果是乱码。其他的都不会问题。【OID“1.3.6.1.2.1.2.2.1.6”为ifPhysAddress,设备上的MAC地址.】


问题已经解决了:MAC地址显示问题 ((SNMPOctetString)snmpValue).toHexString(); OK!


snmpwalk()OID节点下数据量大的时候经常出现异常“java.net.SocketTimeoutException: Receive timed out”。comInterface.setSocketTimeout(time);将time设置大一点也不起作用。


6 楼 xdqcx 2009-10-08  
LZ,您的方法snmpWalk()获取OID“1.3.6.1.2.1.2.2.1.6”的结果是乱码。其他的都不会问题。【OID“1.3.6.1.2.1.2.2.1.6”为ifPhysAddress,设备上的MAC地址.】
5 楼 tom840520 2009-07-29  
我啥都不说,就是一个字好!支持!
4 楼 zhanjia 2009-06-27  
PlayGod1984 写道
大侠,你为什么不写一个测试用例,我初学,不知道你的community是干啥的

找找"简单网络管理协议SNMP"的资料看看吧,看了就会明白了
3 楼 PlayGod1984 2009-06-25  
大侠,你为什么不写一个测试用例,我初学,不知道你的community是干啥的
2 楼 zhanjia 2008-12-20  
ffyahoo 写道

为何不用snmphibernate呢

没听过这东东, 有空可以试试
1 楼 ffyahoo 2008-12-15  
为何不用snmphibernate呢

相关推荐

    利用snmp协议获取机器设备信息 代码

    本主题主要探讨如何利用SNMP协议和Java编程语言来获取机器设备的信息。 在Java中,我们可以使用SNMP库来实现对设备信息的获取。常见的Java SNMP库有SNMP4J,这是一个开放源码的SNMP API,支持SNMP v1、v2c和v3。...

    snmp 获取服务器信息

    SNMP提供了一种标准的方式来获取各种服务器信息,包括但不限于CPU利用率、内存使用情况、磁盘空间、网络接口状态、进程信息等。这些信息可以通过MIB结构中的OID进行访问。 例如,`sysDescr.0` OID对应于设备的描述...

    SNMP_WALK获取SNMP协议oid的非常好用的工具

    "SNMP_WALK"是利用SNMP协议进行数据查询的一个功能,它能够遍历设备的MIB(Management Information Base)树,获取指定OID(Object Identifier,对象标识符)的所有子节点信息。 SNMP_WALK工具通常是一个命令行实用...

    通过snmp的OID获取对方主机的内存利用率及CPU的使用率

    在本场景中,我们的目标是利用SNMP来获取远程主机的内存利用率和CPU使用率,这对于网络性能监控和故障排查至关重要。 首先,我们需要了解SNMP的基本工作原理。SNMP由三部分组成:管理站(Manager)、代理(Agent)...

    Python利用SNMP读取交换机端口信息及状态

    Python利用SNMP读取交换机端口信息及状态,通过路由器和交换机上启用SNMP协议,Python环境下安装net-snmp-python包实现

    shell脚本,通过snmp方式获取远程服务器的CPU内存和硬盘的使用率

    `snmpget`用于获取单个特定的MIB对象(Management Information Base)值,而`snmpwalk`则可以遍历整个MIB树,获取一系列相关对象的值。 要编写一个能获取远程服务器CPU、内存和硬盘使用率的Shell脚本,你需要确保...

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

    例如,用GET请求获取OID(对象标识符)的值。 ```java PDU pdu = new PDU(); pdu.setType(PDU.GET); VariableBinding vb = new VariableBinding(new OID("1.3.6.1.2.1.1.1.0")); // 例子中的OID pdu.add(vb); ``` ...

    基于C#编写的通过OID获取SNMP

    本篇将深入探讨如何利用C#编程语言通过OID(对象标识符)获取SNMP数据。 首先,OID是SNMP中的关键元素,它是一个有序的数字串,用于唯一地标识网络中的管理对象。理解OID对于正确查询网络设备的状态至关重要。例如...

    Java实现SNMP获得OId值

    在Java中,利用`Snmp4j`库可以方便地实现SNMP的GET操作,用于获取网络设备上特定OID的值。以下是对代码示例的详细解析: 1. **初始化环境** - 定义了版本号、协议类型、端口号等基础参数。 - 引入必要的包,包括`...

    SNMP查看CPU信息

    snmpget 命令用于获取 Agent 上指定 MIB 对象的值,而 snmpwalk 命令用于获取 Agent 上多个 MIB 对象的值。 在使用 Net-SNMP 工具时,需要了解命令行选项的含义。snmpget 和 snmpwalk 命令的命令行格式分别为 ...

    利用snmp协议获取机器设备信息

    ### 利用SNMP协议获取机器设备信息及控制关机重启 #### 1. 引言 ##### 1.1 编写目的 本文档旨在详细介绍如何利用简单网络管理协议(SNMP)来获取远程机器的信息,并在此基础上实现对这些机器的关机或重启操作。该...

    dellmib库snmp获取dell服务器信息的

    5. 查询服务器信息:运行SNMP查询命令,例如SNMPwalk,通过指定的OID来获取Dell服务器的详细信息。 Dell MIB库中的常见OID包括: - .1.3.6.1.4.1.674.10892.5.1:表示系统信息,可以获取服务器的型号、序列号等。 ...

    java通过SNMP协议获取交换机设备信息(如:交换机下的PC机MAC、IP、连接端口号等信息)

    本篇文章将深入探讨如何利用Java编程语言通过SNMP协议来获取交换机设备上的详细信息,包括PC机的MAC地址、IP地址以及连接的端口号。 首先,SNMP是一种应用层协议,它允许网络管理员远程收集和配置网络设备的数据。...

    SNMP查看CPU及内存使用率

    2. **配置NMS**:安装NET-SNMP工具包,通过snmpget命令获取特定MIB对象的值,或使用snmpwalk遍历MIB树,发现所有可用的对象。 具体命令如下: - `snmpget`:`snmpget -v 1 -c public &lt;Agent_IP&gt; &lt;MIB_OID&gt;` - `...

    snmp.rar_snmp获取mac_获取mac

    在这个"snmp.rar"压缩包中,可能包含了一些关于如何利用SNMP协议获取网络设备MAC地址的方法和技术。 MAC地址(Media Access Control Address)是网络设备物理接口的唯一标识,通常用于在局域网(LAN)中识别数据包...

    用snmp4j获取本地所有oid

    本篇文章将详细介绍如何在Windows环境下配置SNMP服务,并利用Snmp4j获取本地所有OID(对象标识符)。 首先,我们需要了解SNMP服务的安装与配置。在Windows系统中,SNMP服务通常不默认安装,因此我们需要手动进行...

    VC6.0 snmp 协议获取table值

    【标题】"VC6.0 SNMP 协议获取table值"是关于在Microsoft Visual C++ 6.0环境下,利用SNMP(简单网络管理协议)从远程设备获取表(table)数据的应用示例。SNMP是一种广泛用于网络设备管理的标准协议,它允许管理员...

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

    - 处理SNMP GET和SET请求,根据请求的OID返回相应的值或修改MIB变量。 6. **测试与调试**: - 使用SNMP工具(如Net-SNMP的snmpget、snmpset等)或自定义SNMP客户端应用程序连接到模拟的SNMP代理,进行交互测试。 ...

Global site tag (gtag.js) - Google Analytics