win7下开启snmpv2:
打开控制面板-->程序-->程序和功能-->打开或者关闭windows功能,选择简单网络管理协议(snmp),点击确定,打开服务,找到snmp
service,右键属性,找到安全选项,在接受的社区名称中,添加以后程序要访问的团体名,在接受来自一下主机的snmp数据包中添加本机IP或者localhost(取决于程序使用localhost还是本机IP访问,如果使用本机IP访问,但是这里填localhost,则是无法访问的)。
以下都是同步实现的:
snmp getBulk方式获取数据:
public static void syncGetBulk() {
try {
Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); //构造一个UDP
snmp.listen(); //开始监听snmp消息CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));//snmpv2的团体名
target.setVersion(SnmpConstants.version2c); //snmp版本
target.setAddress(new UdpAddress("192.168.1.104/161"));
target.setTimeout(60000); //时延
target.setRetries(1); //重传PDU pdu = new PDU(); //a SNMP protocol data unit
//使用GETBULK方式获取数据,无论什么方式取oid,都是取叶子节点,叶子节点的父节点都不会取到
pdu.setType(PDU.GETBULK);//snmp getBulk独有
pdu.setMaxRepetitions(3000); //每个OID通过GETBULK方式获取多少个数据
/*偏移量,假设有两个oid,0代表两个oid都取3000个叶子oid,1代表第一个取它最近的第一个oid,第二个取3000个oid,
* 大于1的数代表两个oid都是取他们最近的第一个oid
*/
pdu.setNonRepeaters(1);//添加oid,可以多个
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1")));
ResponseEvent responseEvent = snmp.send(pdu, target);
PDU response = responseEvent.getResponse();if (response == null) {
System.out.println("TimeOut...");
} else {
if (response.getErrorStatus() == PDU.noError) {
//读取数据
Vector<? extends VariableBinding> vbs = response
.getVariableBindings();
List<SnmpResult> result = new ArrayList<SnmpResult>(vbs.size());
for (VariableBinding vb : vbs) {
result.add(new SnmpResult(vb.getOid().toString(),vb.getVariable().toString()));
}
System.out.println(JSONArray.fromObject(result).toString());
} else {
System.out
.println("Error:" + response.getErrorStatusText());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
snmp walk:PDU中并未提供walk,snmp4j提供了TableUtils,实际实现也是通过snmp
getBulk或者getNext,将某个oid下的所有叶子节点,只是TableUtils处理了多次获取结果,省的自己写程序去处理。
public static void walk() {
try {
Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); // 构造一个UDP
snmp.listen(); // 开始监听snmp消息CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));// snmpv2的团体名
target.setVersion(SnmpConstants.version2c); // snmp版本
target.setAddress(new UdpAddress("192.168.1.104/161"));
target.setTimeout(60000); // 时延
target.setRetries(1); // 重传TableUtils utils = new TableUtils(snmp, new DefaultPDUFactory(
PDU.GETBULK));// GETNEXT or GETBULK
utils.setMaxNumRowsPerPDU(5); // only for GETBULK, set max-repetitions, default is 10
OID[] columnOids = new OID[] {new OID("1.3.6.1.2.1")};
// If not null, all returned rows have an index in a range (lowerBoundIndex, upperBoundIndex]
//lowerBoundIndex,upperBoundIndex都为null时返回所有的叶子节点。 必须具体到某个OID,,否则返回的结果不会在(lowerBoundIndex, upperBoundIndex)之间
List<TableEvent> l = utils.getTable(target, columnOids,new OID("1.3.6.1.2.1.25.5.1.1.1.3324")
,null); //
for (TableEvent e : l) {
System.out.println(e.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
异步实现getNext:对于异步而言,不能在异步执行完前关闭虚拟机,否则出不了数据。
public static void asyncGetNext() {
try {
Snmp snmp = new Snmp(new DefaultUdpTransportMapping()); // 构造一个UDP
snmp.listen(); // 开始监听snmp消息CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));// snmpv2的团体名
target.setVersion(SnmpConstants.version2c); // snmp版本
target.setAddress(new UdpAddress("192.168.1.104/161"));
target.setTimeout(60000); // 时延
target.setRetries(1); // 重传PDU pdu = new PDU(); // a SNMP protocol data unit
pdu.setType(PDU.GETNEXT);// 添加oid,可以多个
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1")));// 设置监听对象
ResponseListener listener = new ResponseListener() {
public void onResponse(ResponseEvent event) {
try {
PDU response = event.getResponse();if (response == null) {
System.out.println("TimeOut...");
} else {
if (response.getErrorStatus() == PDU.noError) {
// 读取数据
Vector<? extends VariableBinding> vbs = response
.getVariableBindings();
List<SnmpResult> result = new ArrayList<SnmpResult>(
vbs.size());
for (VariableBinding vb : vbs) {
result.add(new SnmpResult(vb.getOid().toString(), vb
.getVariable().toString()));
}
System.out.println(JSONArray.fromObject(result).toString());
} else {
System.out
.println("Error:" + response.getErrorStatusText());
}
}
}catch(Exception e) {
e.printStackTrace();
}
}
};
snmp.send(pdu, target,null, listener); //设置异步处理
} catch (Exception e) {
e.printStackTrace();
}
}
snmp4j读取数据