利用SNMP4J实现 Snmp Trap 完整例子

来源:互联网 发布:wampserver无法打开php 编辑:程序博客网 时间:2024/06/01 08:38

————————– ———Snmp4J源码和jar包路径——————————


Snmp v1 , v2c, v3 版本发送 Snmp Trap:

package com.snmp.trapServer;import java.io.IOException;import org.snmp4j.CommunityTarget;import org.snmp4j.PDU;import org.snmp4j.PDUv1;import org.snmp4j.SNMP4JSettings;import org.snmp4j.ScopedPDU;import org.snmp4j.Snmp;import org.snmp4j.TransportMapping;import org.snmp4j.UserTarget;import org.snmp4j.event.ResponseEvent;import org.snmp4j.mp.MPv3;import org.snmp4j.mp.SnmpConstants;import org.snmp4j.security.AuthMD5;import org.snmp4j.security.Priv3DES;import org.snmp4j.security.PrivDES;import org.snmp4j.security.SecurityLevel;import org.snmp4j.security.SecurityModels;import org.snmp4j.security.SecurityProtocols;import org.snmp4j.security.USM;import org.snmp4j.security.UsmUser;import org.snmp4j.smi.Address;import org.snmp4j.smi.GenericAddress;import org.snmp4j.smi.OctetString;import org.snmp4j.smi.UdpAddress;import org.snmp4j.smi.VariableBinding;import org.snmp4j.transport.DefaultUdpTransportMapping;/**  * 本类用于发送Trap信息  *   * @author gfw2306 *  */  public class SnmpTrapSender {    private Snmp snmp = null;    private Address targetAddress = null;    private TransportMapping<UdpAddress> transport = null;    //UsmUser 的userName    private String username1 = "user1";    //认证协议的密码  如MD5    private String authPassword = "password1";    //加密协议密码  如 DES AES    private String privPassword = "password2";    public static void main(String[] args) {        SnmpTrapSender poc = new SnmpTrapSender();        try {            poc.init();            poc.sendV1Trap();            poc.sendV2cTrap();            poc.sendV3TrapNoAuthNoPriv();            //poc.sendV3Auth();            poc.sendV3();        } catch (IOException e) {            e.printStackTrace();        }    }    public void init() throws IOException {        //目标主机的ip地址 和 端口号        targetAddress = GenericAddress.parse("udp:10.195.88.96/162");        transport = new DefaultUdpTransportMapping();        snmp = new Snmp(transport);        transport.listen();    }    /**     * Snmp V1 测试发送Trap     * @return     * @throws IOException     */    public ResponseEvent sendV1Trap() throws IOException {        PDUv1 pdu = new PDUv1();        VariableBinding v = new VariableBinding();        v.setOid(SnmpConstants.sysName);        v.setVariable(new OctetString("Snmp Trap V1 Test"));        pdu.add(v);        pdu.setType(PDU.V1TRAP);        // set target        CommunityTarget target = new CommunityTarget();        target.setCommunity(new OctetString("public"));        target.setAddress(targetAddress);        // retry times when commuication error        target.setRetries(2);        // timeout        target.setTimeout(1500);        target.setVersion(SnmpConstants.version1);        // send pdu, return response        return snmp.send(pdu, target);    }    /**     * Snmp V2c 测试发送Trap     * @return     * @throws IOException     */    public ResponseEvent sendV2cTrap() throws IOException {        PDU pdu = new PDU();        VariableBinding v = new VariableBinding();        v.setOid(SnmpConstants.sysName);        v.setVariable(new OctetString("Snmp Trap V2 Test"));        pdu.add(v);        pdu.setType(PDU.TRAP);        // set target        CommunityTarget target = new CommunityTarget();        target.setCommunity(new OctetString("public"));        target.setAddress(targetAddress);        // retry times when commuication error        target.setRetries(2);        target.setTimeout(1500);        target.setVersion(SnmpConstants.version2c);        // send pdu, return response        return snmp.send(pdu, target);    }    /**     * SnmpV3 不带认证加密协议.     * @return     * @throws IOException     */    public ResponseEvent sendV3TrapNoAuthNoPriv() throws IOException {        SNMP4JSettings.setExtensibilityEnabled(true);        SecurityProtocols.getInstance().addDefaultProtocols();        UserTarget target = new UserTarget();        target.setVersion(SnmpConstants.version3);        try {            transport = new DefaultUdpTransportMapping();        } catch (IOException e1) {            e1.printStackTrace();        }        byte[] enginId = "TEO_ID".getBytes();        USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(                enginId), 500);        SecurityModels secModels = SecurityModels.getInstance();        if (snmp.getUSM() == null) {            secModels.addSecurityModel(usm);        }        target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);        target.setAddress(targetAddress);        ScopedPDU pdu = new ScopedPDU();        pdu.setType(PDU.NOTIFICATION);        VariableBinding v = new VariableBinding();        v.setOid(SnmpConstants.sysName);        v.setVariable(new OctetString("Snmp Trap V3 Test sendV3TrapNoAuthNoPriv"));        pdu.add(v);        snmp.setLocalEngine(enginId, 500, 1);        return snmp.send(pdu, target);    }    /**     * 目前不可以被接收     * @return     * @throws IOException     */    public ResponseEvent sendV3Auth() throws IOException {        SNMP4JSettings.setExtensibilityEnabled(true);        SecurityProtocols.getInstance().addDefaultProtocols();        UserTarget target = new UserTarget();        target.setSecurityName(new OctetString(username1));        target.setVersion(SnmpConstants.version3);        try {            transport = new DefaultUdpTransportMapping();        } catch (IOException e1) {            e1.printStackTrace();        }        byte[] enginId = "TEO_ID".getBytes();        USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(                enginId), 500);        SecurityModels secModels = SecurityModels.getInstance();        synchronized (secModels) {            if (snmp.getUSM() == null) {                secModels.addSecurityModel(usm);            }            snmp.getUSM().addUser(                    new OctetString(username1),                    new OctetString(enginId),                    new UsmUser(new OctetString(username1), AuthMD5.ID,                            new OctetString(authPassword), Priv3DES.ID,                            new OctetString(privPassword)));            target.setSecurityLevel(SecurityLevel.AUTH_PRIV);            target.setAddress(targetAddress);            ScopedPDU pdu = new ScopedPDU();            pdu.setType(PDU.NOTIFICATION);            VariableBinding v = new VariableBinding();            v.setOid(SnmpConstants.sysName);            v.setVariable(new OctetString("Snmp Trap V3 Test sendV3Auth"));            pdu.add(v);            snmp.setLocalEngine(enginId, 500, 1);            ResponseEvent send = snmp.send(pdu, target);            //System.out.println(send.getError());            return send;        }    }    /**     * 测试SnmpV3  带认证协议,加密协议     * @return     * @throws IOException     */    public ResponseEvent sendV3() throws IOException{        OctetString userName = new OctetString(username1);        OctetString authPass = new OctetString(authPassword);        OctetString privPass = new OctetString("privPassword");        TransportMapping<?> transport;           transport = new DefaultUdpTransportMapping();        Snmp snmp = new Snmp(transport);        //MPv3.setEnterpriseID(35904);        USM usm = new USM(SecurityProtocols.getInstance(),           new OctetString(MPv3.createLocalEngineID()), 500);           SecurityModels.getInstance().addSecurityModel(usm);           UserTarget target = new UserTarget();        byte[] enginId = "TEO_ID".getBytes();        SecurityModels secModels = SecurityModels.getInstance();        synchronized (secModels) {            if (snmp.getUSM() == null) {                secModels.addSecurityModel(usm);            }            /*snmp.getUSM().addUser(                    new OctetString(username),                    new OctetString(enginId),                    new UsmUser(new OctetString(username), AuthMD5.ID,                            new OctetString(authPassword), Priv3DES.ID,                            new OctetString(privPassword)));*/            // add user to the USM               snmp.getUSM().addUser(userName,new UsmUser(userName,AuthMD5.ID,authPass,PrivDES.ID,privPass));            target.setAddress(targetAddress);               target.setRetries(2);               target.setTimeout(3000);               target.setVersion(SnmpConstants.version3);               target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);               target.setSecurityName(userName);             ScopedPDU pdu = new ScopedPDU();            pdu.setType(PDU.NOTIFICATION);            VariableBinding v = new VariableBinding();            v.setOid(SnmpConstants.sysName);            v.setVariable(new OctetString("Snmp Trap V3 Test sendV3Auth----------"));            pdu.add(v);            snmp.setLocalEngine(enginId, 500, 1);            ResponseEvent send = snmp.send(pdu, target);            //System.out.println(send.getError());            return send;        }    }    /*public void sendV3() throws IOException {        snmp.getUSM().addUser(                new OctetString("MD5DES"),                new UsmUser(new OctetString("MD5DES"), AuthMD5.ID,                        new OctetString("MD5DESUserAuthPassword"), PrivDES.ID,                        new OctetString("MD5DESUserPrivPassword")));        // create the target        UserTarget target = new UserTarget();        target.setAddress(targetAddress);        target.setRetries(1);        target.setTimeout(5000);        target.setVersion(SnmpConstants.version3);        target.setSecurityLevel(SecurityLevel.AUTH_PRIV);        target.setSecurityName(new OctetString("MD5DES"));        // create the PDU        PDU pdu = new ScopedPDU();        pdu.add(new VariableBinding(new OID("1.3.6")));        pdu.setType(PDU.GETNEXT);        // send the PDU        ResponseEvent response = snmp.send(pdu, target);        // extract the response PDU (could be null if timed out)        PDU responsePDU = response.getResponse();        // extract the address used by the agent to send the response:        Address peerAddress = response.getPeerAddress();    }*/}

Snmp v1 , v2c, v3 版本接收 Snmp Trap消息:

package com.snmp.trapServer;import java.io.IOException;import java.net.UnknownHostException;import java.util.Vector;import org.snmp4j.CommandResponder;import org.snmp4j.CommandResponderEvent;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.AuthMD5;import org.snmp4j.security.PrivDES;import org.snmp4j.security.SecurityModels;import org.snmp4j.security.SecurityProtocols;import org.snmp4j.security.USM;import org.snmp4j.security.UsmUser;import org.snmp4j.security.UsmUserEntry;import org.snmp4j.security.UsmUserTable;import org.snmp4j.smi.Address;import org.snmp4j.smi.GenericAddress;import org.snmp4j.smi.OctetString;import org.snmp4j.smi.TcpAddress;import org.snmp4j.smi.UdpAddress;import org.snmp4j.smi.VariableBinding;import org.snmp4j.transport.DefaultTcpTransportMapping;import org.snmp4j.transport.DefaultUdpTransportMapping;import org.snmp4j.util.MultiThreadedMessageDispatcher;import org.snmp4j.util.ThreadPool;/**  * 本类用于监听代理进程的Trap信息  *   * @author gfw2306 *  */  public class MultiThreadedTrapReceiver implements CommandResponder {      private String username1 = "user1";    private String username2 = "user2";    private String username3 = "user3";    private String username4 = "user4";    private String authPassword = "password1";    private String privPassword = "password2";    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:10.195.88.96/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());          UsmUser usmUser = new UsmUser(new OctetString(username), AuthMD5.ID,                new OctetString(authPassword), Priv3DES.ID,                new OctetString(privPassword));        USM usm = new USM(SecurityProtocols.getInstance().addDefaultProtocols(), new OctetString(MPv3                  .createLocalEngineID()), 0);         usm.addUser(usmUser);        SecurityModels.getInstance().addSecurityModel(usm);          snmp.listen();          //add the enginID in the trap         //OctetString engineID = new OctetString(MPv3.createLocalEngineID());         byte[] enginId = "TEO_ID".getBytes();        OctetString engineID = new OctetString(enginId);        //create and add the userSecurityModel         USM usm = new USM(SecurityProtocols.getInstance(),engineID, 0);           SecurityModels.getInstance().addSecurityModel(usm);           //add the securityProtocols,you can skip it if your users are noAuthNoPriv         SecurityProtocols.getInstance().addDefaultProtocols();                 //create and add the user         UsmUser usmUser = new UsmUser(new OctetString(username), AuthMD5.ID,                new OctetString(authPassword), Priv3DES.ID,                new OctetString(privPassword));          usm.addUser(usmUser);        //snmp.getUSM().addUser(usmUser);         snmp.listen();         */        /*******************************************使用处*************************************************/        //创建接收SnmpTrap的线程池,参数: 线程名称及线程数        threadPool = ThreadPool.create("Trap", 2);          dispatcher = new MultiThreadedMessageDispatcher(threadPool,                  new MessageDispatcherImpl());          //监听端的 ip地址 和 监听端口号        listenAddress = GenericAddress.parse(System.getProperty(                  "snmp4j.listenAddress", "udp:10.195.88.96/162"));        TransportMapping<?> transport;          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());        //MPv3.setEnterpriseID(35904);        snmp.getMessageDispatcher().addMessageProcessingModel(new MPv3());         USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3                  .createLocalEngineID()),0);        SecurityModels.getInstance().addSecurityModel(usm);        // 添加安全协议,如果没有发过来的消息没有身份认证,可以跳过此段代码        SecurityProtocols.getInstance().addDefaultProtocols();        // 创建和添加用户        OctetString userName1 = new OctetString(username1);        OctetString userName2 = new OctetString(username2);        //OctetString userName3 = new OctetString(username3);        //OctetString userName4 = new OctetString(username4);        OctetString authPass = new OctetString(authPassword);        OctetString privPass = new OctetString("privPassword");        UsmUser usmUser1 = new UsmUser(userName1, AuthMD5.ID, authPass, PrivDES.ID, privPass);        UsmUser usmUser2 = new UsmUser(userName2, AuthMD5.ID, authPass, PrivDES.ID, privPass);        //UsmUser usmUser3 = new UsmUser(userName3, AuthMD5.ID, authPass, PrivDES.ID, privPass);        //UsmUser usmUser4 = new UsmUser(userName4, AuthMD5.ID, authPass, PrivDES.ID, privPass);        //因为接受的Trap可能来自不同的主机,主机的Snmp v3加密认证密码都不一样,所以根据加密的名称,来添加认证信息UsmUser。        //添加了加密认证信息的便可以接收来自发送端的信息。        UsmUserEntry userEnty1 = new UsmUserEntry(userName1,usmUser1);        UsmUserEntry userEnty2 = new UsmUserEntry(userName2,usmUser2);        //UsmUserEntry userEnty3 = new UsmUserEntry(userName3,usmUser3);        //UsmUserEntry userEnty4 = new UsmUserEntry(userName4,usmUser4);        UsmUserTable userTable = snmp.getUSM().getUserTable();        // 添加其他用户        userTable.addUser(userEnty1);        userTable.addUser(userEnty2);        //开启Snmp监听,可以接收来自Trap端的信息。        snmp.listen();         /* UsmUserTable userTable = snmp.getUSM().getUserTable();        userTable.addUser(userEnty1);        userTable.addUser(userEnty2);*/        /********************************************************************************************/    }      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) {              @SuppressWarnings("unchecked")            Vector<VariableBinding> recVBs = (Vector<VariableBinding>) respEvnt.getPDU().getVariableBindings();              for (int i = 0; i < recVBs.size(); i++) {                  VariableBinding recVB = recVBs.elementAt(i);                  System.out.println(recVB.getOid() + " : " + recVB.getVariable());              }          }      }      //开启监控的main方法。    public static void main(String[] args) {          MultiThreadedTrapReceiver multithreadedtrapreceiver = new MultiThreadedTrapReceiver();          multithreadedtrapreceiver.run();      }  }