snmp4j編程之四 實現tableView操作

在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}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章