SNMPTrapReceiver.java 3.37 KB
package com.sitech.ismp.snmp;

import org.snmp4j.MessageDispatcherImpl;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.mp.MPv1;
import org.snmp4j.mp.MPv2c;
import org.snmp4j.mp.MPv3;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;

import java.io.IOException;
import java.net.UnknownHostException;
import java.util.ResourceBundle;

public class SNMPTrapReceiver {

	private MultiThreadedMessageDispatcher dispatcher;

	private Snmp snmp = null;

	private Address listenAddress;

	private ThreadPool threadPool;

	private String ip = null;

	private int port = 0;

	private String swap_path = null;

	public SNMPTrapReceiver() {

		try {
			ResourceBundle snmpConfig = ResourceBundle.getBundle("snmp");
			// 在snmp.properties获得snmp配置参数
			String ip = snmpConfig.getString("ip");
			String strport = snmpConfig.getString("port");
			String swap_path = snmpConfig.getString("swap_path");
			this.port = Integer.valueOf(strport.trim()).intValue();
			this.ip = ip;
			this.swap_path = swap_path;
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("initial config error......exit");
			System.exit(0);
		}
	}

	/**
	 * 初始化SNMP
	 * 
	 * @throws java.net.UnknownHostException
	 * @throws java.io.IOException
	 */
	private void init() throws UnknownHostException, IOException {
		threadPool = ThreadPool.create("Trap", 2);
        dispatcher = new MultiThreadedMessageDispatcher(threadPool,
                new MessageDispatcherImpl());
        // listenAddress = GenericAddress.parse(System.getProperty(
        // "snmp4j.listenAddress", "udp:127.0.0.1/162")); // 本地IP与监听端口
		String snmppath = "udp:" + this.ip + "/" + this.port;

		listenAddress = GenericAddress.parse(snmppath); // 本地IP与监听端口

        TransportMapping transport;
        // 对TCP与UDP协议进行处理
        if (listenAddress instanceof UdpAddress) {
            transport = new DefaultUdpTransportMapping(
                    (UdpAddress) listenAddress);
        } else {
            transport = new DefaultTcpTransportMapping(
                    (TcpAddress) listenAddress);
        }

        snmp = new Snmp(dispatcher, transport);
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv1());
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv2c());
        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());
        USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3
                .createLocalEngineID()), 0);
        SecurityModels.getInstance().addSecurityModel(usm);
        snmp.listen();
        System.out.println("listen on " + snmppath);
        System.out.println("开始接受数据");

	}

	public void run() {
		try {
			init();
			snmp.addCommandResponder(new PDUProcessor());
			System.out.println("start to receive SNMP Trap message!");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SNMPTrapReceiver trapreceiver = new SNMPTrapReceiver();
		trapreceiver.run();
	}

}