上篇文章我们对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可采集网络设备资源信息,为网管系统必备工具,包含源码
利用snmp4j实现snmp协议三个版本的get、getnext、set、trap操作的源代码,帮助你快速上手snmp协议的实现
snmp4j api文档
snmp4j 2.2.5 版本的 snmp4j 2.2.5 版本的 snmp4j 2.2.5 版本的
SNMP4J官网上的snmp4j-agent源码
eclipse工程(编译通过,能运行) snmp4j API get,getnext,set,trap,取mib值 实例
进行snmp4J网管开发的基础东东 agent代理端例子: Java代码 import java.util.*; import org.snmp4j.*; import org.snmp4j.smi.*; //agent代理端例子: public class Test2 { public static class Handler...
此资源为snmp4j的源码 SNMP4J——一个支持java管理器和代理,支持snmp应用程序接口的类库。 SNMP4J是一个商业类库,而且开源免费,它也是一个有着很高技术艺术性的SNMP执行能力的类库,支持J2SE1.4或更高的版本。...
利用SNMP4J实现Snmp Trap完整例子 - 企业应用 - Java - JavaEye论坛.mht
snmp4j get walk 方式获取数据
snmp4j 实现snmp trap发送与接收
本源代码为一个大型程序中的部分,描述了如何使用开源代码SNMP4J的异步模式。
1 windows下安装和配置snmp服务 2 用snmp4j获取本地所有oid 代码
此资源为snmp4j的api SNMP4J——一个支持java管理器和代理,支持snmp应用程序接口的类库。 SNMP4J是一个商业类库,而且开源免费,它也是一个有着很高技术艺术性的SNMP执行能力的类库,支持J2SE1.4或更高的版本。...
本人制作的翻译文档,经过大量的翻译与工作而实现的snmp4j中文阅读文档
使用snmp4j实现Snmp功能使用snmp4j实现Snmp功能
SNMP4J的使用例子 通过一个properties来模拟MIB情报。
snmp4j 1.8.2版 The org.snmp4j classes are capable of creating, sending, and receiving SNMPv1/v2c/v3 messages. A SNMP message is composed of its message header and its PDU payload. This package ...
SNMP4J——一个支持java管理器和代理,支持snmp应用程序接口的类库。 SNMP4J是一个商业类库,而且开源免费,它也是一个有着很高技术艺术性的SNMP执行能力的类库,支持J2SE1.4或更高的版本。SNMP4J支持指令发生器...
snmp4j最新api,包含snmp4j-2.0.3.jar、snmp4j-2.0.3-javadoc.jar、snmp4j-agent-2.0.5.jar。