原文:http://www.micmiu.com/enterprise-app/snmp/snmp4j-walk/
1.同步WALK(v2c)
代码:SnmpWalk.java
import java.io.IOException;
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.Integer32;
import org.snmp4j.smi.Null;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
/**
* 演示:WALK的方式获取值
*
* blog http://www.micmiu.com
*
* @author Michael
*/
public class SnmpWalk {
public static final int DEFAULT_VERSION = SnmpConstants.version2c;
public static final String DEFAULT_PROTOCOL = "udp";
public static final int DEFAULT_PORT = 161;
public static final long DEFAULT_TIMEOUT = 3 * 1000L;
public static final int DEFAULT_RETRY = 3;
/**
* 创建对象communityTarget
*
* @param targetAddress
* @param community
* @param version
* @param timeOut
* @param retry
* @return CommunityTarget
*/
public static CommunityTarget createDefault(String ip, String community) {
Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip
+ "/" + DEFAULT_PORT);
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(community));
target.setAddress(address);
target.setVersion(DEFAULT_VERSION);
target.setTimeout(DEFAULT_TIMEOUT); // milliseconds
target.setRetries(DEFAULT_RETRY);
return target;
}
/**
* @param ip
* @param community
* @param oid
*/
public static void snmpWalk(String ip, String community, String targetOid) {
CommunityTarget target = SnmpUtil.createDefault(ip, community);
TransportMapping transport = null;
Snmp snmp = null;
try {
transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
transport.listen();
PDU pdu = new PDU();
OID targetOID = new OID(targetOid);
pdu.add(new VariableBinding(targetOID));
boolean finished = false;
System.out.println("----> demo start <----");
while (!finished) {
VariableBinding vb = null;
ResponseEvent respEvent = snmp.getNext(pdu, target);
PDU response = respEvent.getResponse();
if (null == response) {
System.out.println("responsePDU == null");
finished = true;
break;
} else {
vb = response.get(0);
}
// check finish
finished = checkWalkFinished(targetOID, pdu, vb);
if (!finished) {
System.out.println("==== walk each vlaue :");
System.out.println(vb.getOid() + " = " + vb.getVariable());
// Set up the variable binding for the next entry.
pdu.setRequestID(new Integer32(0));
pdu.set(0, vb);
} else {
System.out.println("SNMP walk OID has finished.");
snmp.close();
}
}
System.out.println("----> demo end <----");
} catch (Exception e) {
e.printStackTrace();
System.out.println("SNMP walk Exception: " + e);
} finally {
if (snmp != null) {
try {
snmp.close();
} catch (IOException ex1) {
snmp = null;
}
}
}
}
/**
* 1)responsePDU == null<br>
* 2)responsePDU.getErrorStatus() != 0<br>
* 3)responsePDU.get(0).getOid() == null<br>
* 4)responsePDU.get(0).getOid().size() < targetOID.size()<br>
* 5)targetOID.leftMostCompare(targetOID.size(),responsePDU.get(0).getOid())
* !=0<br>
* 6)Null.isExceptionSyntax(responsePDU.get(0).getVariable().getSyntax())<br>
* 7)responsePDU.get(0).getOid().compareTo(targetOID) <= 0<br>
*
* @param resquestPDU
* @param targetOID
* @param responsePDU
* @param vb
* @return
*/
private static boolean checkWalkFinished(OID targetOID, PDU pdu,
VariableBinding vb) {
boolean finished = false;
if (pdu.getErrorStatus() != 0) {
System.out.println("[true] responsePDU.getErrorStatus() != 0 ");
System.out.println(pdu.getErrorStatusText());
finished = true;
} else if (vb.getOid() == null) {
System.out.println("[true] vb.getOid() == null");
finished = true;
} else if (vb.getOid().size() < targetOID.size()) {
System.out.println("[true] vb.getOid().size() < targetOID.size()");
finished = true;
} else if (targetOID.leftMostCompare(targetOID.size(), vb.getOid()) != 0) {
System.out.println("[true] targetOID.leftMostCompare() != 0");
finished = true;
} else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
System.out
.println("[true] Null.isExceptionSyntax(vb.getVariable().getSyntax())");
finished = true;
} else if (vb.getOid().compareTo(targetOID) <= 0) {
System.out.println("[true] Variable received is not "
+ "lexicographic successor of requested " + "one:");
System.out.println(vb.toString() + " <= " + targetOID);
finished = true;
}
return finished;
}
/**
*
* @param args
*/
public static void main(String[] args) {
String ip = "192.168.8.254";
String community = "public";
// 1.3.6.1.2.1.2.2.1.2
String targetOid = ".1.3.6.1.2.1.1";
SnmpWalk.snmpWalk(ip, community, targetOid);
}
}
运行结果:
----> demo start <----
==== walk each vlaue :
1.3.6.1.2.1.1.1.0 = H3C ICG2000
H3C Comware Platform Software
Comware Software Version 5.20, Release 2104P02
Copyright(c) 2004-2010 Hangzhou H3C Technologies Co., Ltd.
==== walk each vlaue :
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.25506.1.287
==== walk each vlaue :
1.3.6.1.2.1.1.3.0 = 39 days, 21:47:28.41
==== walk each vlaue :
1.3.6.1.2.1.1.4.0 = R&D Hangzhou, Hangzhou H3C Technologies Co., Ltd.
==== walk each vlaue :
1.3.6.1.2.1.1.5.0 = HX_ICG2000
==== walk each vlaue :
1.3.6.1.2.1.1.6.0 = Hangzhou, China
==== walk each vlaue :
1.3.6.1.2.1.1.7.0 = 78
[true] targetOID.leftMostCompare() != 0
SNMP walk OID has finished.
----> demo end <----
2.异步WALK(v2c)
代码:SnmpWalkAsyn.java
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
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.Integer32;
import org.snmp4j.smi.Null;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
/**
* 演示:异步GET OID值
*
* blog http://www.micmiu.com
*
* @author Michael
*
*/
public class SnmpWalkAsyn {
public static final int DEFAULT_VERSION = SnmpConstants.version2c;
public static final String DEFAULT_PROTOCOL = "udp";
public static final int DEFAULT_PORT = 161;
public static final long DEFAULT_TIMEOUT = 3 * 1000L;
public static final int DEFAULT_RETRY = 3;
/**
* 创建对象communityTarget
*
* @param targetAddress
* @param community
* @param version
* @param timeOut
* @param retry
* @return CommunityTarget
*/
public static CommunityTarget createDefault(String ip, String community) {
Address address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip
+ "/" + DEFAULT_PORT);
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(community));
target.setAddress(address);
target.setVersion(DEFAULT_VERSION);
target.setTimeout(DEFAULT_TIMEOUT); // milliseconds
target.setRetries(DEFAULT_RETRY);
return target;
}
/**
* 异步采集信息
*
* @param ip
* @param community
* @param oid
*/
public static void snmpAsynWalk(String ip, String community, String oid) {
final CommunityTarget target = createDefault(ip, community);
Snmp snmp = null;
try {
System.out.println("----> demo start <----");
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
snmp.listen();
final PDU pdu = new PDU();
final OID targetOID = new OID(oid);
final CountDownLatch latch = new CountDownLatch(1);
pdu.add(new VariableBinding(targetOID));
ResponseListener listener = new ResponseListener() {
public void onResponse(ResponseEvent event) {
((Snmp) event.getSource()).cancel(event.getRequest(), this);
try {
PDU response = event.getResponse();
// PDU request = event.getRequest();
// System.out.println("[request]:" + request);
if (response == null) {
System.out.println("[ERROR]: response is null");
} else if (response.getErrorStatus() != 0) {
System.out.println("[ERROR]: response status"
+ response.getErrorStatus() + " Text:"
+ response.getErrorStatusText());
} else {
System.out
.println("Received Walk response value :");
VariableBinding vb = response.get(0);
boolean finished = checkWalkFinished(targetOID,
pdu, vb);
if (!finished) {
System.out.println(vb.getOid() + " = "
+ vb.getVariable());
pdu.setRequestID(new Integer32(0));
pdu.set(0, vb);
((Snmp) event.getSource()).getNext(pdu, target,
null, this);
} else {
System.out
.println("SNMP Asyn walk OID value success !");
latch.countDown();
}
}
} catch (Exception e) {
e.printStackTrace();
latch.countDown();
}
}
};
snmp.getNext(pdu, target, null, listener);
System.out.println("pdu 已发送,等到异步处理结果...");
boolean wait = latch.await(30, TimeUnit.SECONDS);
System.out.println("latch.await =:" + wait);
snmp.close();
System.out.println("----> demo end <----");
} catch (Exception e) {
e.printStackTrace();
System.out.println("SNMP Asyn Walk Exception:" + e);
}
}
private static boolean checkWalkFinished(OID walkOID, PDU pdu,
VariableBinding vb) {
boolean finished = false;
if (pdu.getErrorStatus() != 0) {
System.out.println("[true] pdu.getErrorStatus() != 0 ");
System.out.println(pdu.getErrorStatusText());
finished = true;
} else if (vb.getOid() == null) {
System.out.println("[true] vb.getOid() == null");
finished = true;
} else if (vb.getOid().size() < walkOID.size()) {
System.out.println("[true] vb.getOid().size() < targetOID.size()");
finished = true;
} else if (walkOID.leftMostCompare(walkOID.size(), vb.getOid()) != 0) {
System.out.println("[true] targetOID.leftMostCompare() != 0");
finished = true;
} else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
System.out
.println("[true] Null.isExceptionSyntax(vb.getVariable().getSyntax())");
finished = true;
} else if (vb.getOid().compareTo(walkOID) <= 0) {
System.out.println("[true] vb.getOid().compareTo(walkOID) <= 0 ");
finished = true;
}
return finished;
}
/**
*
* @param args
*/
public static void main(String[] args) {
String ip = "192.168.40.66";
String community = "public";
// 异步采集数据
SnmpWalkAsyn.snmpAsynWalk(ip, community, "1.3.6.1.2.1.1");
}
}
运行结果
----> demo start <----
pdu 已发送,等到异步处理结果...
Received Walk response value :
1.3.6.1.2.1.1.1.0 = H3C ICG2000
H3C Comware Platform Software
Comware Software Version 5.20, Release 2104P02
Copyright(c) 2004-2010 Hangzhou H3C Technologies Co., Ltd.
Received Walk response value :
1.3.6.1.2.1.1.2.0 = 1.3.6.1.4.1.25506.1.287
Received Walk response value :
1.3.6.1.2.1.1.3.0 = 39 days, 21:52:48.80
Received Walk response value :
1.3.6.1.2.1.1.4.0 = R&D Hangzhou, Hangzhou H3C Technologies Co., Ltd.
Received Walk response value :
1.3.6.1.2.1.1.5.0 = HX_ICG2000
Received Walk response value :
1.3.6.1.2.1.1.6.0 = Hangzhou, China
Received Walk response value :
1.3.6.1.2.1.1.7.0 = 78
Received Walk response value :
[true] targetOID.leftMostCompare() != 0
SNMP Asyn walk OID value success !
latch.await =:true
----> demo end <----