在SNMP編程中,需要實現tableview,在此總結一下。
操作類SnmpUtil.java:
package com.test.snmp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
public class SnmpUtil {
private static final int DEFAULT_VERSION = SnmpConstants.version1;
private static final String DEFAULT_PROTOCOL = "udp";
private static final int DEFAULT_PORT = 161;
private static final long DEFAULT_TIMEOUT = 3 * 1000L;// milliseconds
private static final int DEFAULT_RETRY = 3;
private static final String DEFAULT_COMMUNITY = "public";//community
public static final String SNMP_VERSION = "SNMP_VERSION";
public static final String SNMP_PROTOCOL = "SNMP_PROTOCOL";
public static final String SNMP_PORT = "SNMP_PORT";
public static final String SNMP_TIMEOUT = "SNMP_TIMEOUT";
public static final String SNMP_RETRY = "SNMP_RETRY";
public static final String SNMP_COMMUNITY= "SNMP_COMMUNITY";
/***
* 創建通信共同體,指定IP
* @param ip
* @param port
* @return
*/
public static CommunityTarget createCommunityTarget(String ip) {
return createCommunityTarget(ip,DEFAULT_PORT);
}
/***
* 創建通信共同體,指定IP和port參數
* @param ip
* @param port
* @return
*/
public static CommunityTarget createCommunityTarget(String ip,int port) {
// 設置Agent方的IP和端口
Address address = null;
if(port==0){
address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip + "/" + DEFAULT_PORT);
}else{
address = GenericAddress.parse(DEFAULT_PROTOCOL + ":" + ip + "/" + port);
}
// 生成 target並設置
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(DEFAULT_COMMUNITY));
target.setAddress(address);
target.setVersion(DEFAULT_VERSION);
// 超時時間
target.setTimeout(DEFAULT_TIMEOUT);
// 通信不成功時的重試次數
target.setRetries(DEFAULT_RETRY);
return target;
}
/***
* 實現SNMP的walk操作(index不爲0的OID)
* @param target
* @param oidList:指定OID集合(同一個MIB表)
* @return
* @throws Exception
*/
public static List<Map<String,String>> snmpTableView(CommunityTarget target,List<String> oidList) throws Exception {
//結果集合
List<Map<String,String>> mibOidToValueMap = new ArrayList<Map<String,String>>();
//獲取設備上指定OID的主鍵index的集合。
List<String> instances = selectInstance(target,oidList.get(0));
DefaultUdpTransportMapping transport = new DefaultUdpTransportMapping();
Snmp snmp = new Snmp(transport);
try {
snmp.listen();
int instanceSize = instances.size();
int oidSize = oidList.size();
//生成PDU
PDU pdu = new PDU();
//設置爲GET操作
pdu.setType(PDU.GET);
for(int i = 0 ; i < instanceSize; i++){
String index = instances.get(i);
for(int j = 0; j < oidSize; j++){
//合成OID+主鍵index,加入到PDU中。
pdu.add(new VariableBinding(new OID(oidList.get(j)+index)));
}
ResponseEvent respEvent = snmp.send(pdu, target);
//解析響應數據
PDU response = respEvent.getResponse();
if (response != null) {
int reSize = response.size();
//創建TableView的一行數據
Map<String,String> row = new HashMap<String,String>(reSize);
//將主鍵加入到一行中
row.put("index", index.substring(1));
for (int k = 0; k < reSize; k++) {
VariableBinding vb = response.get(k);
//刪除主鍵
String oid = vb.getOid().toString();
oid = oid.substring(0, oid.lastIndexOf('.'));
String value = vb.getVariable().toString();
//加入到一行中
row.put(oid, value);
}
mibOidToValueMap.add(row);
}
pdu.clear();
pdu.setType(PDU.GET);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
snmp.close();
}
return mibOidToValueMap;
}
/***
* 獲取設備上指定OID的主鍵index的集合。
* @param target
* @param targetOid
* @return
* @throws Exception
*/
private static List<String> selectInstance(CommunityTarget target,String targetOid) throws Exception {
List<String> instances = new ArrayList<String>();
TransportMapping transport = null;
try {
transport = new DefaultUdpTransportMapping();
} catch (Exception e) {
e.printStackTrace();
}
Snmp snmp = new Snmp(transport);
try{
transport.listen();
// 創建 PDU
PDU pdu = new PDU();
OID targetOID = new OID(targetOid);
pdu.add(new VariableBinding(targetOID));
boolean finished = false;
//walk操作
while (!finished) {
VariableBinding vb = null;
/** 向Agent發送PDU實施getNext操作,並接收Response*/
ResponseEvent respEvent = snmp.getNext(pdu, target);
/** 解析Response數據*/
PDU response = respEvent.getResponse();
if (null == response) {
finished = true;
break;
} else {
vb = response.get(0);
}
/** 檢查是否結束*/
finished = checkWalkFinished(targetOID, pdu, vb);
if (!finished) {
/**保存索引數據*/
String fullOid = vb.getOid().toString();
String index = fullOid.replace(targetOid, "");
instances.add(index);
/** 將variable binding設置到下一個*/
pdu.setRequestID(new Integer32(0));
pdu.set(0, vb);
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
snmp.close();
}
return instances;
}
/**
* 檢查是否結束
* @param targetOID
* @param pdu
* @param vb
* @return
*/
private static boolean checkWalkFinished(OID targetOID, PDU pdu, VariableBinding vb) {
boolean finished = false;
if (pdu.getErrorStatus() != 0) {
finished = true;
} else if (vb.getOid() == null) {
finished = true;
} else if (vb.getOid().size() < targetOID.size()) {
finished = true;
} else if (targetOID.leftMostCompare(targetOID.size(), vb.getOid()) != 0) {
finished = true;
} else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
finished = true;
} else if (vb.getOid().compareTo(targetOID) <= 0) {
finished = true;
}
return finished;
}
}
運行類SnmpDemo.java:
package com.test.snmp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.snmp4j.CommunityTarget;
public class SnmpDemo {
public static void main(String[] args){
try {
CommunityTarget target = SnmpUtil.createCommunityTarget("192.168.40.66", 161);
ArrayList<String> oidList = new ArrayList<String>();
oidList.add("1.3.6.1.4.1.9.9.719.1.32.1.1.2");
oidList.add("1.3.6.1.4.1.9.9.719.1.32.1.1.17");
oidList.add("1.3.6.1.4.1.9.9.719.1.32.1.1.11");
List<Map<String, String>> snmpTableView = SnmpUtil.snmpTableView(target, oidList);
for(Map<String, String> map: snmpTableView){
System.out.println(map);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
運行結果:
console臺輸出結果:
{1.3.6.1.4.1.9.9.719.1.32.1.1.2=sys/switch-A, 1.3.6.1.4.1.9.9.719.1.32.1.1.11=UCS-FI-6248UP, index=51934, 1.3.6.1.4.1.9.9.719.1.32.1.1.17=SSI171900NT}
{1.3.6.1.4.1.9.9.719.1.32.1.1.2=sys/switch-B, 1.3.6.1.4.1.9.9.719.1.32.1.1.11=UCS-FI-6248UP, index=51965, 1.3.6.1.4.1.9.9.719.1.32.1.1.17=SSI1718011H}