SNMP的学习使用记录(java通过OID获取信息及捕获陷阱发送的报文)

1.什么是SNMP
SNMP是管理进程(NMS)和代理进程(Agent)之间的通信协议。它规定了在网络环境中对设备进行监视和管理的标准化管理框架、通信的公共语言、相应的安全和访问控制机制。网络管理员使用SNMP功能可以查询设备信息、修改设备的参数值、监控设备状态、自动发现网络故障、生成报告等。基于TCP/IP互联网的标准协议,传输层协议一般采用UDP。自动化网络管理。网络管理员可以利用SNMP平台在网络上的节点检索信息、修改信息、发现故障、完成故障诊断、进行容量规划和生成报告。屏蔽不同设备的物理差异,实现对不同厂商产品的自动化管理。SNMP只提供最基本的功能集,使得管理任务与被管设备的物理特性和实际网络类型相对独立,从而实现对不同厂商设备的管理。简单的请求—应答方式和主动通告方式相结合,并有超时和重传机制。报文种类少,报文格式简单,方便解析,易于实现。SNMPv3版本提供了认证和加密安全机制,以及基于用户和视图的访问控制功能,增强了安全性。
一丶通过OID获取信息

	  /*
      * 每个厂商的OID定义是不一样的
      */
     public static String GetCarbonDust(String ip){
    	 
    	 try{
    	        //设定CommunityTarget
    	        CommunityTarget myTarget = new CommunityTarget();
    	        Address deviceAdd = GenericAddress.parse("udp:"+ip+"/161"); //通信主机的地址
    	        myTarget.setAddress(deviceAdd);  //设定通信主机的地址
    	        myTarget.setCommunity(new OctetString("public"));   //设置snmp共同体
    	        myTarget.setRetries(2);  //设置超时重试次数
    	        myTarget.setTimeout(5*60);   //设置超时的时间
    	        myTarget.setVersion(SnmpConstants.version2c);//设置snmp版本
    	        //设定采取的协议
    	        TransportMapping transport = new DefaultUdpTransportMapping();  //设定传输协议为UDP
    	        transport.listen();
    	        Snmp protocol = new Snmp(transport);
    	        //获取mib
    	        PDU request = new PDU();
    	        request.add(new VariableBinding(new OID("1.3.6.1.2.1.43.11.1.1.9.1.0")));
    	        request.setType(PDU.GETNEXT);
    	        ResponseEvent responseEvent = protocol.send(request, myTarget);
    	        PDU response=responseEvent.getResponse();
    	        //输出
    	        if(response != null){
    	            VariableBinding vb1 = response.get(0);
    	            String string = vb1.toString();
    	           return string ;
    	            transport.close();
    	        }
    	      }catch(IOException e){
    	    	  return "";
    	      }
    	 return "失败";
     }
     
	二 丶捕获陷阱
 public class SnmpUtil implements CommandResponder{
     private static int Numcreate = 200;
     private static String ipAddress = null;
     private Snmp snmp = null;
     
     public void init(){
         //1、初始化多线程消息转发类
         ThreadPool threadPool = ThreadPool.create("SnmpTrap", Numcreate);
         MessageDispatcher messageDispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());
         //其中要增加三种处理模型 3中类型的 v1 v2 v3
         messageDispatcher.addMessageProcessingModel(new MPv1());
         messageDispatcher.addMessageProcessingModel(new MPv2c());
         OctetString localEngineID = new OctetString(MPv3.createLocalEngineID());
         USM usm = new USM(SecurityProtocols.getInstance().addDefaultProtocols(), localEngineID, 0);
         UsmUser user = new UsmUser(new OctetString("SNMPV3"), AuthSHA.ID, new OctetString("authPassword"),
             PrivAES128.ID, new OctetString("privPassword"));
         usm.addUser(user.getSecurityName(), user);
         messageDispatcher.addMessageProcessingModel(new MPv3(usm));
         //2、创建transportMapping
         TransportMapping<?> transportMapping = null;
         try {
             UdpAddress updAddr = (UdpAddress) GenericAddress.parse(System.getProperty("snmp4j.listenAddress", ipAddress));
             transportMapping = new DefaultUdpTransportMapping(updAddr);
             //3、创建snmp
             snmp = new Snmp(messageDispatcher, transportMapping);
             //开启监听
             snmp.listen();
         } catch (IOException e) {
             System.err.println("初始化transportMapping失败:"+ e.getMessage());
             e.printStackTrace();
         }
     }
 
     public void Listen(String ip) {
    	 ipAddress=ip;
         init();
         //一定要将当前对象添加至commandResponderListeners中
         snmp.addCommandResponder(this);
         System.out.println("开始监听trap信息:");
     }
     /**
      * 处理信息方法
      */
     @Override
     public void processPdu(CommandResponderEvent event) {
         String version = null ;
         String community = null;
         if (event.getPDU().getType() == PDU.V1TRAP) {
             version = "v1";
             community = new String(event.getSecurityName());
         } else if (event.getPDU().getType() == PDU.TRAP){
             if (event.getSecurityModel() == 2) {
                 version = "v2";
                 community = new String(event.getSecurityName());
             }else {
                 version = "v3";
             }
         }
         System.out.println("接收到的trap信息:[发送来源="+event.getPeerAddress()+",snmp版本="+version+",团体名="+community+", 携带的变量="+event.getPDU()+"]");
     }
     
     
     public static void main(String[] args) {
         SnmpUtil handler = new SnmpUtil();
         handler.Listen("udp:ip/162");
     }
 }

感兴趣的可以是试试(学习记录,有问题的可以一起讨论!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值