本例用到两个开源包,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;
}
}
分享到:
- 2008-12-13 00:06
- 浏览 8933
- 评论(8)
- 论坛回复 / 浏览 (5 / 16535)
- 查看更多
相关推荐
本主题主要探讨如何利用SNMP协议和Java编程语言来获取机器设备的信息。 在Java中,我们可以使用SNMP库来实现对设备信息的获取。常见的Java SNMP库有SNMP4J,这是一个开放源码的SNMP API,支持SNMP v1、v2c和v3。...
SNMP提供了一种标准的方式来获取各种服务器信息,包括但不限于CPU利用率、内存使用情况、磁盘空间、网络接口状态、进程信息等。这些信息可以通过MIB结构中的OID进行访问。 例如,`sysDescr.0` OID对应于设备的描述...
在本场景中,我们的目标是利用SNMP来获取远程主机的内存利用率和CPU使用率,这对于网络性能监控和故障排查至关重要。 首先,我们需要了解SNMP的基本工作原理。SNMP由三部分组成:管理站(Manager)、代理(Agent)...
"SNMP_WALK"是利用SNMP协议进行数据查询的一个功能,它能够遍历设备的MIB(Management Information Base)树,获取指定OID(Object Identifier,对象标识符)的所有子节点信息。 SNMP_WALK工具通常是一个命令行实用...
Python利用SNMP读取交换机端口信息及状态,通过路由器和交换机上启用SNMP协议,Python环境下安装net-snmp-python包实现
`snmpget`用于获取单个特定的MIB对象(Management Information Base)值,而`snmpwalk`则可以遍历整个MIB树,获取一系列相关对象的值。 要编写一个能获取远程服务器CPU、内存和硬盘使用率的Shell脚本,你需要确保...
snmpget 命令用于获取 Agent 上指定 MIB 对象的值,而 snmpwalk 命令用于获取 Agent 上多个 MIB 对象的值。 在使用 Net-SNMP 工具时,需要了解命令行选项的含义。snmpget 和 snmpwalk 命令的命令行格式分别为 ...
例如,用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数据。 首先,OID是SNMP中的关键元素,它是一个有序的数字串,用于唯一地标识网络中的管理对象。理解OID对于正确查询网络设备的状态至关重要。例如...
在Java中,利用`Snmp4j`库可以方便地实现SNMP的GET操作,用于获取网络设备上特定OID的值。以下是对代码示例的详细解析: 1. **初始化环境** - 定义了版本号、协议类型、端口号等基础参数。 - 引入必要的包,包括`...
### 利用SNMP协议获取机器设备信息及控制关机重启 #### 1. 引言 ##### 1.1 编写目的 本文档旨在详细介绍如何利用简单网络管理协议(SNMP)来获取远程机器的信息,并在此基础上实现对这些机器的关机或重启操作。该...
本篇文章将深入探讨如何利用Java编程语言通过SNMP协议来获取交换机设备上的详细信息,包括PC机的MAC地址、IP地址以及连接的端口号。 首先,SNMP是一种应用层协议,它允许网络管理员远程收集和配置网络设备的数据。...
2. **配置NMS**:安装NET-SNMP工具包,通过snmpget命令获取特定MIB对象的值,或使用snmpwalk遍历MIB树,发现所有可用的对象。 具体命令如下: - `snmpget`:`snmpget -v 1 -c public <Agent_IP> <MIB_OID>` - `...
在这个"snmp.rar"压缩包中,可能包含了一些关于如何利用SNMP协议获取网络设备MAC地址的方法和技术。 MAC地址(Media Access Control Address)是网络设备物理接口的唯一标识,通常用于在局域网(LAN)中识别数据包...
5. 查询服务器信息:运行SNMP查询命令,例如SNMPwalk,通过指定的OID来获取Dell服务器的详细信息。 Dell MIB库中的常见OID包括: - .1.3.6.1.4.1.674.10892.5.1:表示系统信息,可以获取服务器的型号、序列号等。 ...
本篇文章将详细介绍如何在Windows环境下配置SNMP服务,并利用Snmp4j获取本地所有OID(对象标识符)。 首先,我们需要了解SNMP服务的安装与配置。在Windows系统中,SNMP服务通常不默认安装,因此我们需要手动进行...
【标题】"VC6.0 SNMP 协议获取table值"是关于在Microsoft Visual C++ 6.0环境下,利用SNMP(简单网络管理协议)从远程设备获取表(table)数据的应用示例。SNMP是一种广泛用于网络设备管理的标准协议,它允许管理员...
- 处理SNMP GET和SET请求,根据请求的OID返回相应的值或修改MIB变量。 6. **测试与调试**: - 使用SNMP工具(如Net-SNMP的snmpget、snmpset等)或自定义SNMP客户端应用程序连接到模拟的SNMP代理,进行交互测试。 ...