`
279135628
  • 浏览: 12821 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

有用snmpv3开发过网管系统

阅读更多
以下是我用JAVA实现的利用snmpv3写的一段测试代码:
1:JAVA实现的SNMP代理部分
package com.medou.agent;
import org.snmp4j.*;
import org.snmp4j.mp.*;
import org.snmp4j.security.AuthMD5;
import org.snmp4j.security.AuthSHA;
import org.snmp4j.security.PrivAES128;
import org.snmp4j.security.PrivAES192;
import org.snmp4j.security.PrivAES256;
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.smi.*;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.MultiThreadedMessageDispatcher;
import org.snmp4j.util.ThreadPool;

public class SnmpProcessor implements CommandResponder {
	private MultiThreadedMessageDispatcher dispatcher;
	private Address listenAddress;
	private ThreadPool threadPool;
	private OID authProtocol;
	private OID privProtocol;
	private OctetString privPassphrase;
	private OctetString authPassphrase;
	private OctetString securityName = new OctetString();
	private int numDispatcherThreads = 2;
	private int version;
	private String host;
    
	public SnmpProcessor(String host, String user, 
			  String authProtocol, String authPasshrase, String privProtocol, 
	          String privPassphrase, int version) {
		  this.authPassphrase = new OctetString(authPasshrase);
		  this.securityName = new OctetString(user);
		  this.privPassphrase = new OctetString(privPassphrase);
		  this.version = version;
		  this.host = host;
		  if (authProtocol.equals("MD5")) {
			  this.authProtocol = AuthMD5.ID;
	      } else if (authProtocol.equals("SHA")) {
	    	  this.authProtocol = AuthSHA.ID;
	      }
	      if (privProtocol.equals("DES")) {
	    	  this.privProtocol = PrivDES.ID;
	      } else if ((privProtocol.equals("AES128"))
	              || (privProtocol.equals("AES"))) {
	    	  this.privProtocol = PrivAES128.ID;
	      } else if (privProtocol.equals("AES192")) {
	    	  this.privProtocol = PrivAES192.ID;
	      } else if (privProtocol.equals("AES256")) {
	    	  this.privProtocol = PrivAES256.ID;
	      }
	}
	
	public synchronized void run() {
		try {
            init();
        } catch (Exception ex) {
        	ex.printStackTrace();
        } 
	}

	public synchronized void init() throws Exception {
        try {
        	threadPool = ThreadPool.create("Trap", numDispatcherThreads);
            dispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());
            listenAddress = GenericAddress.parse(host);
            TransportMapping transport;
            if (listenAddress instanceof UdpAddress) {
              transport = new DefaultUdpTransportMapping((UdpAddress)listenAddress);
            } else {
              transport = new DefaultTcpTransportMapping((TcpAddress)listenAddress);
            }
            dispatcher.addMessageProcessingModel(new MPv1());
            dispatcher.addMessageProcessingModel(new MPv2c());
            dispatcher.addMessageProcessingModel(new MPv3());
            SecurityProtocols.getInstance().addDefaultProtocols();
            Snmp snmp = new Snmp(dispatcher, transport);
            if (version == SnmpConstants.version3) {
        	    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
        	    SecurityModels.getInstance().addSecurityModel(usm);
        	    // Add the configured user to the USM
        	    addUsmUser(snmp);
            }
            snmp.addCommandResponder(this);
            transport.listen();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
	
	private void addUsmUser(Snmp snmp) {
	    snmp.getUSM().addUser(securityName, new UsmUser(securityName,
	                                                    authProtocol,
	                                                    authPassphrase,
	                                                    privProtocol,
	                                                    privPassphrase));
    }
	
	public String getResponse (String cmdType, String oid, String value) {
		return "lkj";
	}
	
@SuppressWarnings("unchecked")
public synchronized void processPdu(CommandResponderEvent aEvent) {
      PDU pdu = aEvent.getPDU();
      if (pdu == null) {
          return;
      } 
      String cmdType = "";
      OID oid = pdu.get(0).getOid();
      String oidStr = oid.toString();
      System.out.println(oidStr);
      String value = null==pdu.get(0).getVariable().toString()?"":pdu.get(0).getVariable().toString();
      System.out.println(value);
      switch (pdu.getType()) {
          case PDU.GET:
              cmdType = "0";
              break;
          case PDU.GETNEXT:
              cmdType = "1";
              break;
          case PDU.SET:
              cmdType = "3";
              break;
          default:
              break;
      }
      StatusInformation statusInformation = new StatusInformation();
      StateReference stateRef = aEvent.getStateReference();
      try {
          pdu.setType(PDU.RESPONSE);
          String response = getResponse(cmdType, oidStr, value);
          Variable rariable = null;
          rariable = new OctetString(response);
          pdu.set(0, new VariableBinding(oid, rariable));
          aEvent.getMessageDispatcher().returnResponsePdu(
              aEvent.getMessageProcessingModel(),
              aEvent.getSecurityModel(), aEvent.getSecurityName(),
              aEvent.getSecurityLevel(), pdu,
              aEvent.getMaxSizeResponsePDU(), stateRef,
              statusInformation);
      } catch (MessageException ex) {
    	  ex.printStackTrace();
      }
  }
	
	public static void main(String[] args) {
		SnmpProcessor a = new SnmpProcessor("udp:192.168.0.118/161", "lkj", "MD5", "mysnmplkj", "DES", "mysnmplkj", SnmpConstants.version3);
		a.run();
	}

}


2:以下是我写的网管与代理交互部分:
package com.medou.agent;

import java.io.IOException;
import java.util.Vector;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
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.AuthSHA;
import org.snmp4j.security.PrivAES128;
import org.snmp4j.security.PrivAES192;
import org.snmp4j.security.PrivAES256;
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.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.TcpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultTcpTransportMapping;
import org.snmp4j.transport.DefaultUdpTransportMapping;

/**
 * 本类用于向管理进程发送GET信息
 *
 * @author 
 *
 */
public class SnmpUtilSendGet {
    private Address targetAddress = null;
    private OID authProtocol;
    private OID privProtocol;
    private OctetString privPassphrase;
    private OctetString authPassphrase;
    private OctetString securityName = new OctetString();
    private int version;
    private String host;
    private Target target;
    private OctetString community = new OctetString("public");
    private TransportMapping transport;
    
    /**
     * 初始化Snmp信息
     * @param host
     * @param user
     * @param authProtocol
     * @param authPasshrase
     * @param privProtocol
     * @param privPassphrase
     * @param version
     */
    public SnmpUtilSendGet(String host, String user, 
  		  String authProtocol, String authPasshrase, String privProtocol, 
            String privPassphrase, int version) {
          this.authPassphrase = new OctetString(authPasshrase);
    	  this.securityName = new OctetString(user);
    	  this.privPassphrase = new OctetString(privPassphrase);
    	  this.version = version;
    	  this.host = host;
    	  if (authProtocol.equals("MD5")) {
    		  this.authProtocol = AuthMD5.ID;
          } else if (authProtocol.equals("SHA")) {
        	  this.authProtocol = AuthSHA.ID;
          }
          if (privProtocol.equals("DES")) {
        	  this.privProtocol = PrivDES.ID;
          } else if ((privProtocol.equals("AES128"))
                  || (privProtocol.equals("AES"))) {
        	  this.privProtocol = PrivAES128.ID;
          } else if (privProtocol.equals("AES192")) {
        	  this.privProtocol = PrivAES192.ID;
          } else if (privProtocol.equals("AES256")) {
        	  this.privProtocol = PrivAES256.ID;
          }
      }
    
    /**
     * 创建snmp
     * @throws IOException
     */
    public Snmp createSnmpSession() throws IOException {
        // 设置管理进程的IP和端口
        targetAddress = GenericAddress.parse(host);
        if (targetAddress instanceof TcpAddress) {
            transport = new DefaultTcpTransportMapping();
        } else {
            transport = new DefaultUdpTransportMapping();
        }
        Snmp snmp = new Snmp(transport);
        if (version == SnmpConstants.version3) {
    	    USM usm = new USM(SecurityProtocols.getInstance(), new OctetString(MPv3.createLocalEngineID()), 0);
    	    SecurityModels.getInstance().addSecurityModel(usm);
    	    // Add the configured user to the USM
    	    addUsmUser(snmp);
        }
        return snmp;
    }
    
    /**
     * 加入user信息(snmp3)
     * @param snmp
     */
    private void addUsmUser(Snmp snmp) {
	    snmp.getUSM().addUser(securityName, new UsmUser(securityName,
	                                                    authProtocol,
	                                                    authPassphrase,
	                                                    privProtocol,
	                                                    privPassphrase));
    }
    
    /**
     * 创建PUD
     * @param target
     * @return
     */
    public PDU createPDU(Target target) {
        PDU request;
        if (target.getVersion() == SnmpConstants.version3) {
            request = new ScopedPDU();
        } else {
            request = new PDU();
        }
        return request;
    }
    
    /**
     * 创建Target
     * @return
     */
    private Target createTarget() {
        if (version == SnmpConstants.version3) {
          UserTarget target = new UserTarget();
          if (authPassphrase != null) {
            if (privPassphrase != null) {
              target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
            } else {
              target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);
            }
          } else {
            target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);
          }
          target.setSecurityName(securityName);
          return target;
       } else {
          CommunityTarget target = new CommunityTarget();
          target.setCommunity(community);
          return target;
       }
    }
    
    /**
     * 向管理进程发送Trap报文
     *
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    public void sendPDU() throws IOException {
        // 设置 target
    	Snmp snmp = createSnmpSession();
    	target = createTarget();
        target.setAddress(targetAddress);
        // 通信不成功时的重试次数
        target.setRetries(2);
        // 超时时间
        target.setTimeout(1500);
        // snmp版本
        target.setVersion(version);
        
        transport.listen();
        // 创建 PDU
        PDU pdu = createPDU(target);
//        pdu.add(new VariableBinding(new OID(".1.3.6.1.2.3377.10.1.1.1.2"),
//                new OctetString("JavaEE")));
        pdu.add(new VariableBinding(new OID(".1.3.4")));
        pdu.setType(PDU.GET);
        System.out.println(pdu);
        ResponseEvent respEvnt = snmp.send(pdu, target);
        System.out.println(respEvnt.getResponse());
        // 解析Response
        if (respEvnt != null && respEvnt.getResponse() != null) {
            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());
            }
        }
        snmp.close();
    }

    public static void main(String[] args) {
        try {
            SnmpUtilSendGet util = new SnmpUtilSendGet("udp:192.168.0.118/161", "lkj", "MD5", "mysnmplkj", "DES", "mysnmplkj", SnmpConstants.version3);
            util.createSnmpSession();
            util.sendPDU();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}



为什么我运行了代理后,执行交互部分的代码,代理不会跳入processPdu方法运行? 我试过用SNMP2V的版本是可以的,有谁知道的请解答下   谢谢
分享到:
评论

相关推荐

    网络编程SNMPV3读取工具

    网络编程SNMPV3读取工具

    SNMPv3.rar_snmpv3_网络管理

    SNMPv3设计_实现及在安全网络管理平台中的应用

    snmpv3 java实现

    java实现的简单网络管理协议!附件是整个工程,下载下来配置ip就可以运行,附有mib库,支持snmpV1,V2,V3版本协议!绝对是好资源,为了兼容移动的网络设备控制,研究了一段时间,现分享出来。不懂得可以找我

    SNMPv3技术演讲稿

    SNMPv3 RFCs描述了一个新的框架用于定义SNMP第一, 第二和第三版规范之间的关系. 这个框架以模块的方式划分并且绝大部分依赖以前的工作 (例如 SNMPv1, SNMPv2c, SNMPv2u, 和 SNMPv2*). 在这个框架内的两个核心模块是...

    SNMPv3网络安全管理研究.rar_SNMP_snmpv3_网络安全

    SNMPv3网络安全管理

    SNMPv3在应用中的改进

    SNMPv3正成为网络管理新的标准,它通过基于用户的安全模型引进了认证和加密机制,极大地提高了安全 性。但由于安全机制的引入增加了SNMP的复杂性,业界有理由担心增加的安全措施将降低网络管理的性能,所以对 SNMPv3的...

    基于SNMPv3的策略网管的设计与实现.doc

    基于SNMPv3的策略网管的设计与实现.doc

    snmpv3学习笔记

    一些关于snmpv3的学习心得。 关于snmpv3的协议处理报文流程等等。

    基于SNMP网络管理系统的设计与实现

    网络管理系统是十分必要的管理企业网络。本文介绍了SNMP简要介绍。然后设计并实现了一个网络管理系统基于SNMP用VC++和SNMP++ API。该系统由设备性能管理模块,网络故障管理模块,和网络拓扑检测模块。它直观地显示...

    Template Module Generic SNMPv3.xml

    zabbix snmp v3监控模板,用于snmp v3版本的监控,监控各项数据

    SNMPv3介绍

    简单网络管理协议(SNMP)最新版本第3版就是这样的例子,它虽然在网管上使添加协议的工作更为简单,同时也加强了安全特性,但目前应用还是有所局限,其中最主要的一个原因就是它在某些方面过于复杂,因此我们需要...

    snmpv3.rar_V2 _snmpv3

    利用snmpv3进行通讯,并且在v2版本上运行通过,

    在EMC VNX 存储上SNMPv3 .pdf

    在EMC VNX 存储上SNMPv3 .pdf

    snmpv3.pdf

    snmpv3.pdf 标准学习 基础入门 SNMP开发必备,多年前收集的宝典

    SNMPv33.rar_snmpv3

    SNMPv3新增安全特性的研究与实现.kdh 知网珍贵电子版

    snmpv3.rar_SNMP4J v3_V2 _java snmpV3 agent_snmp4j v3 get_snmpv3

    snmp4j 实现snmpv3get的request集合了v2 v3版本

    RFC1445_简单网络管理协议(SNMPv2)版本 2的管理模式 .doc

    2.10. SNMPv2鉴定过的管理通讯 9 2.11. SNMPv2 私有管理通讯 10 2.12. SNMPv2 管理通讯类 11 2.13. SNMPv2 访问控制策略 11 3. 过程的元素 12 3.1. 产生一个请求 13 3.2. 处理一个收到的通讯 14 3.3. 生成一个响应 ...

    网络管理协议及应用开发

    1.3 网络管理与网络管理系统 1.4 网络的5个功能域 1.4.1 失效管理 1.4.2 配置管理 1.4.3 安全管理 1.4.4 性能管理 1.4.5 计费管理 1.5 管理模型 1.6 小结 第二章 网络管理协议 2.1 没有网络管理协议前的情况 2.2 ...

    snmpv1.zip

    snmpv1的网络数据包

Global site tag (gtag.js) - Google Analytics