SNMP入门--SNMP4J实现SNMP

1 篇文章 0 订阅

初学SNMP。

源于网上的代码,自己再修改了些。


一、SNMP-Get-Set

package snmp.setget;

import java.io.IOException;
import java.util.Vector;

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.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;

public class SnmpSetGet {

	private Snmp snmp = null;
	private Address agentAddrPort = null;

	public void initComm() throws IOException {
		agentAddrPort = GenericAddress.parse("udp:127.0.0.1/161");
		TransportMapping transport = new DefaultUdpTransportMapping();
		snmp = new Snmp(transport);
		transport.listen();
	}

	public ResponseEvent sendPDU(PDU pdu) throws IOException {
		CommunityTarget target = new CommunityTarget();
		target.setCommunity(new OctetString("public"));
		target.setAddress(agentAddrPort);
		target.setRetries(2);
		target.setTimeout(1500);
		target.setVersion(SnmpConstants.version1);
		return snmp.send(pdu, target);
	}

	public void setPDU() throws IOException {
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0"), 
									new OctetString("aa") ) );
		pdu.setType(PDU.SET);
		readResponse(sendPDU(pdu));
	}

	public void getPDU() throws IOException {
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5.0")));
		pdu.setType(PDU.GET);
		readResponse(sendPDU(pdu));
	}

	public void readResponse(ResponseEvent respEvnt) {
		if(respEvnt == null) {
			System.out.println("respEvnt == null");
		} else if(respEvnt.getResponse() == null) {
			System.out.println("respEvnt.getResponse() == null");
		} else if (respEvnt != null && respEvnt.getResponse() != null) {
			@SuppressWarnings("unchecked")
			Vector<VariableBinding> recVBs = respEvnt.getResponse().getVariableBindings();
			for (int i = 0; i < recVBs.size(); i++) {
				VariableBinding recVB = recVBs.elementAt(i);
				System.out.println(recVB.getOid() + "   " + recVB.getVariable());
			}
		}
	}

	public static void main(String[] args) {
		try {
			SnmpSetGet util = new SnmpSetGet();
			util.initComm();
			util.setPDU();
			util.getPDU();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

结果:

1.3.6.1.2.1.1.5.0   aa
1.3.6.1.2.1.1.5.0   aa


二、SNMP-Trap

package snmp.trap;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import java.util.Vector;

import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.CommunityTarget;
import org.snmp4j.MessageDispatcherImpl;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.MPv2c;
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.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;

/**
 * 本类用于监听代理进程的Trap信息
 */
public class MultiThreadedTrapReceiver {

	private Snmp snmpManager = null;
	private String listenAddress = null;
	
	private void getLocalIP() {
		InetAddress addr = null;
		try {
			addr = InetAddress.getLocalHost();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
		String ip = addr.getHostAddress().toString();
		System.out.println("IP: " + ip);
		listenAddress = "udp:" + ip + "/162";
	}
	
	private void init() throws UnknownHostException, IOException {
		ThreadPool threadPool = ThreadPool.create("Trap", 2);
		MultiThreadedMessageDispatcher dispatcher = 
						new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());
		Address address = GenericAddress.parse(listenAddress); 
		TransportMapping transport = new DefaultUdpTransportMapping((UdpAddress)address);
		snmpManager = new Snmp(dispatcher, transport);
		snmpManager.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
		snmpManager.listen();
	}

	
	public void managerRun() {
		try {
			init();
			CommandResponder trapRec = new CommandResponder() {
				/**
				 * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息
				 * 当接收到trap时,会自动进入这个方法
				 * */
				@Override
				public void processPdu(CommandResponderEvent respEvnt) {
					if (respEvnt != null && respEvnt.getPDU() != null) {
			        	@SuppressWarnings("unchecked")
						Vector<VariableBinding> recVBs = respEvnt.getPDU().getVariableBindings();
			           	for (int i = 0; i < recVBs.size(); i++) {
			            	VariableBinding recVB = recVBs.elementAt(i);
			               	System.out.println(recVB.getOid() + "  =c=  " + recVB.getVariable());
			      		}
					}
				}
			};
			snmpManager.addCommandResponder(trapRec);
			System.out.println("开始监听Trap信息!");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
	
	private Snmp snmpAgent = null;
	private CommunityTarget target = null;
	
	public void initComm() throws IOException {
		target = new CommunityTarget();
		Address address = GenericAddress.parse(listenAddress);
		target.setAddress(address);
		target.setRetries(2);
		target.setTimeout(1500);
		target.setVersion(SnmpConstants.version2c);
		TransportMapping transport = new DefaultUdpTransportMapping();
		snmpAgent = new Snmp(transport);
		transport.listen();
	}
	
	/**
	 * 向管理进程发送Trap报文
	 */
	public void sendTrap() throws IOException {		
		PDU pdu = new PDU();
		pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.1"),
									new OctetString("SnmpTrap")));
		pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.2"),
									new OctetString((new Timestamp(System.currentTimeMillis())).toString())));
		pdu.setType(PDU.TRAP);
		snmpAgent.send(pdu, target);
	}
	
	
	public void agentRun() {
		try {
			initComm();
			while(true) {
				Thread.sleep(1000); //设置Trap发送频率
				sendTrap();		
			}
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();
		multithreadedtrapreceiver.getLocalIP();
		multithreadedtrapreceiver.managerRun();
		multithreadedtrapreceiver.agentRun();
	}


}

结果:

IP: <这里输出IP地址>

开始监听Trap信息!
1.3.6.1.2.3377.10.1.1.1.1  =c=  SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2  =c=  2015-02-27 15:56:30.502
1.3.6.1.2.3377.10.1.1.1.1  =c=  SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2  =c=  2015-02-27 15:56:31.506
1.3.6.1.2.3377.10.1.1.1.1  =c=  SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2  =c=  2015-02-27 15:56:32.506
1.3.6.1.2.3377.10.1.1.1.1  =c=  SnmpTrap
1.3.6.1.2.3377.10.1.1.1.2  =c=  2015-02-27 15:56:33.506

.............每秒输出2行


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值