今天这个示例很简单,主要是为了让大家很快的建立一套能够走通的测试环境!
大家知道,要接触一个新的东西总要写一些HelloWorld的东西,或者把内容走同,不然自己会非常的纠结!
为了简单起见,现在在Windows上建立一个SNMP服务环境,XP系统也自带了该服务的支持!
控制面板中打开添加或删除程序!
然后点击对钩安装如上选项,安装两个服务:
安装后会在服中看到SNMP服务内容
然后我们需要安装一个软件,这个软件可以查看机器的MIB树:
HiliSoft MIB Browser是一款强大、易用的网络管理和分析工具。它可以加载SNMP的MIB文件并快速进行解析,建构两个树形视图:MIB结点视图和MIB文件(模块)视图。 使用这两个视图,用户可以非常容易地通过SNMPv1/v2c/v3协议来浏览和修改SNMP代理上变量的值。内建有trap receiver,可以收集SNMP代理发送的trap。
安装后他会自动加载自己预先定义的MIB内容,直接运行该程序,然后打开是机器名称的节点
GET一下,你就能获得该机器的名称,但是要注意的是,该节点的OID是 1.3.6.1.2.1.1.5 ,但是你程序里面访问时应该是 1.3.6.1.2.1.1.5.0 ,因为该软件GET时把该OID下的所有OID实例都会显示出来
Value就是我的机器名称,也可以通过该MIB树查看其他内容
然后我们通过SNMP4J来访问该OID,来获得计算机名称:
package com;
import java.io.IOException;
import java.util.Vector;
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;
/**
* @说明 SNMP4J测试
* @author 崔素强
* @version 1.0
* @since
*/
public class Snmp4jGet {
private Snmp snmp = null;
private Address targetAddress = null;
public static void main(String[] args) {
try {
Snmp4jGet util = new Snmp4jGet();
util.initComm();
util.getPDU();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 初始化
*/
public void initComm() throws IOException {
// 地址是本机 端口一般都是161
targetAddress = GenericAddress.parse("udp:127.0.0.1/161");
TransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
}
/**
* 执行发送
*/
public void getPDU() throws IOException {
// PDU 对象
PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0")));
// 操作类型
pdu.setType(PDU.GET);
ResponseEvent revent = sendPDU(pdu);
if(null != revent){
readResponse(revent);
}
}
/**
* 发送一个PDU
*/
public ResponseEvent sendPDU(PDU pdu) throws IOException {
// 设置 目标
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(targetAddress);
// 通信不成功时的重试次数 N+1次
target.setRetries(2);
// 超时时间
target.setTimeout(2 * 1000);
// SNMP 版本
target.setVersion(SnmpConstants.version2c);
// 向Agent发送PDU,并返回Response
return snmp.send(pdu, target);
}
/**
* 解析返回的值
*/
@SuppressWarnings("unchecked")
public void readResponse(ResponseEvent respEvnt) {
// 解析Response
System.out.println("------------>解析Response<-------------");
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().toString());
}
}
}
}
打印结果如下:
------------>解析Response<-------------
1.3.6.1.2.1.1.5.0 : 796AF67B7B0140E
我们通过实例OID获得到了计算机SNMP服务提供的信息!
当然这这是个开始,实际中服务端的OID定义是公司事先定义好的,服务也是由其他开发人员提供,而你只需要通过预先配置的OID来访问服务获得内容并展示即可
用到的软件上传上去,大家可以玩玩!
请您到ITEYE看我的原创:http://cuisuqiang.iteye.com
或支持我的个人博客,地址:http://www.javacui.com