java实现snmp的get和walk

    首先到http://www.snmp4j.org/上下载一个jar,然后加入引用。

    在这里我主要是参照别人的代码实现的snmpget和snmpwalk命令。具体的请看代码

package open.mis.test;

import java.io.IOException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import snmp.SNMPObject;
import snmp.SNMPSequence;
import snmp.SNMPVarBindList;
import snmp.SNMPv1CommunicationInterface;

public class SnmpManager {
	private static final Log log = LogFactory.getLog(SnmpManager.class);
	private static int version=0;
	private static String protocol = "udp";
	private static String port="161";
	
	public static String snmpGet(String ipAddress,String community,String oid){
		String resultStat = null;
		StringBuilder address = new StringBuilder();
		address.append(protocol);
		address.append(":");
		address.append(ipAddress);
		address.append("/");
		address.append(port);
		Address targetAddress = GenericAddress.parse(address.toString());
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID(oid)));
		pdu.setType(PDU.GET);
		
		//创建共同体对象communityTarget
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString(community));
		target.setAddress(targetAddress);
		target.setVersion(SnmpConstants.version1);
		target.setTimeout(2000);
		target.setRetries(1);
		
		DefaultUdpTransportMapping udpTransportMapping = null;
		Snmp snmp = null;
		try{
			//发送同步消息
			udpTransportMapping = new DefaultUdpTransportMapping();
			udpTransportMapping.listen();
			snmp = new Snmp(udpTransportMapping);
			ResponseEvent response = snmp.send(pdu, target);
			PDU responsePdu = response.getResponse();
			
			if(responsePdu == null){
				log.info(ipAddress+":Request time out");
			}else {
				Object obj = responsePdu.getVariableBindings().firstElement();
				VariableBinding variable = (VariableBinding)obj;
				System.out.println(variable.getOid());
				resultStat = variable.getVariable().toString();
			}
		}catch (Exception e) {
			System.out.println("获取SNMP节点状态时发生错误"+e);
		}finally{
			if(snmp != null){
				try {
					snmp.close();
				} catch (IOException e2) {
					snmp = null;
				}
			}
			if(udpTransportMapping != null){
				try {
					udpTransportMapping.close();
				} catch (Exception e2) {
					udpTransportMapping = null;
				}
			}
		}
		System.out.println("IP" + ipAddress + " resultStat:"+resultStat);
		return resultStat;
	}
	
	public static String[] snmpwalk(String ipAddress,String community,String oid){
		String[] returnValueStrings = null; //oid走访结果数组
		SNMPv1CommunicationInterface comInterface = null;
		try{
			InetAddress hostAddress = InetAddress.getByName(ipAddress);
			comInterface = new SNMPv1CommunicationInterface(version,hostAddress,community);
			comInterface.setSocketTimeout(2000);
			
			//返回所有以oid开始的管理信息库变量值
			SNMPVarBindList tableVars = comInterface.retrieveMIBTable(oid);
			returnValueStrings = new String[tableVars.size()];
			
			//循环处理所有以oid开始的节点的返回值
			for(int i=0;i<tableVars.size();i++){
				SNMPSequence pair= (SNMPSequence)tableVars.getSNMPObjectAt(i);
				SNMPObject  snmpValue = pair.getSNMPObjectAt(1);
				String typesString = snmpValue.getClass().getName();
				if(typesString.equals("snmp.SNMPOctecString")){
					String snmpString = snmpValue.toString();
					int nullLocation = snmpString.indexOf('\0');
					if(nullLocation >=0){
						snmpString = snmpString.substring(0,nullLocation);
					}
					returnValueStrings[i] = snmpString;
					System.out.println(snmpString);
				}else {
					returnValueStrings[i] = snmpValue.toString();
					System.out.println(snmpValue.toString());
				}
			}
		}catch (SocketTimeoutException e) {
			System.out.println("走访IP为"+ipAddress+",OID为"+oid+"时超时!");
			returnValueStrings = null;
		}catch (Exception e) {
			System.out.println("SNMP走访节点时发生错误");
		}finally{
			if(comInterface!=null){
				try{
					comInterface.closeConnection();
				}catch (SocketException e) {
					comInterface = null;
				}
				
			}
		}
		return returnValueStrings;
	}
	
	public static void main(String[] args) {
		SnmpManager.snmpGet("127.0.0.1", "public", "1.3.6.1.2.1.1.5.0");
		//SnmpManager.snmpGet("127.0.0.1", "public", "sysName.0");
		//sSnmpManager.snmpwalk("127.0.0.1", "public", "SNMPv2-MIB");
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值