snmp4j 实现 trap监听

来源:互联网 发布:锐捷交换机查mac 编辑:程序博客网 时间:2024/06/05 16:44

snmp4j 实现 trap监听

以下代码可实现基本的trap监听,仅供参考。

监听器

package top.leiax00.snmp;import org.snmp4j.*;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.Vector;public class MultiThreadedTrapReceiver implements CommandResponder {    private MultiThreadedMessageDispatcher dispatcher;    private Snmp snmp = null;    private Address listenAddress;    private ThreadPool threadPool;    public MultiThreadedTrapReceiver() {        // BasicConfigurator.configure();    }    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与监听端口        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();    }    public void run() {        try {            init();            snmp.addCommandResponder(this);            System.out.println("开始监听Trap信息!");        } catch (Exception ex) {            ex.printStackTrace();        }    }    /**     * 实现CommandResponder的processPdu方法, 用于处理传入的请求、PDU等信息     * 当接收到trap时,会自动进入这个方法     *     * @param respEvnt     */    public void processPdu(CommandResponderEvent respEvnt) {        // 解析Response        if (respEvnt != null && respEvnt.getPDU() != null) {            Vector<? extends VariableBinding> recVBs = respEvnt.getPDU().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) {        MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();        multithreadedtrapreceiver.run();    }}

发送trap

package top.leiax00.snmp;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;/** * 本类用于向管理进程发送Trap信息 * */public class SnmpUtilSendTrap {    private Snmp snmp = null;    private Address targetAddress = null;    public void initComm() throws IOException {        // 设置管理进程的IP和端口          targetAddress = GenericAddress.parse("udp:127.0.0.1/162");        TransportMapping transport = new DefaultUdpTransportMapping();        snmp = new Snmp(transport);        transport.listen();    }    /**     * 向管理进程发送Trap报文     *     * @throws IOException     */    public void sendPDU() throws IOException {        // 设置 target          CommunityTarget target = new CommunityTarget();        target.setAddress(targetAddress);        // 通信不成功时的重试次数          target.setRetries(2);        // 超时时间          target.setTimeout(1500);        // snmp版本          target.setVersion(SnmpConstants.version2c);        // 创建 PDU          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("JavaEE")));        pdu.setType(PDU.TRAP);        // 向Agent发送PDU,并接收Response          ResponseEvent respEvnt = snmp.send(pdu, target);        // 解析Response          if (respEvnt != null && respEvnt.getResponse() != null) {            Vector<? extends 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 {            SnmpUtilSendTrap util = new SnmpUtilSendTrap();            util.initComm();            util.sendPDU();        } catch (IOException e) {            e.printStackTrace();        }    }}  
原创粉丝点击