为了简单起见,现在在Windows 7上建立一个SNMP服务环境,windows 7系统也自带了该服务的支持!
控制面板中打开添加或删除程序!
安装后会在服中看到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.snmp.demo;
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.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import java.io.IOException;
import java.util.Vector;
/**
* Created by vixuan-008 on 2015/7/9.
*/
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());
}
}
}
}