zoukankan      html  css  js  c++  java
  • snmp协议学习记录

    snmp简介,报文,mib,oid了解网:https://www.cnblogs.com/chloneda/p/snmp-protocol.html

    发送udp请求需要的jar包 snmp4j官网链接 

    snmp简单案列:https://blog.csdn.net/FormatWindowsXP/article/details/81703423 (我用的jar包是snmp4j-2.8.0.jar)

    snmp4j.jar链接: https://pan.baidu.com/s/1EN2Od3qlFEf3y2edorQ8Sw 提取码: x34k 复制这段内容后打开百度网盘手机App,操作更方便哦

    1. 监听162端口

    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.SecurityModels;
    import org.snmp4j.security.SecurityProtocols;
    import org.snmp4j.security.USM;
    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;
     
     
    /**
     * @author Song
     * snmp协议的监听模块,用于监听snmp客户端发来的信息.
     * 使用snmp4j实现snmp消息监听,
     * snmp4j 版本 2.6.2
     * snmp trap 默认端口162
     * 2018年08月14日 建立对象
     **/
    public class ReceiveService_snmp implements CommandResponder//使用snmp4j需要实现一个接口
    {
        
        public static void main(String[] args) 
        {
            System.out.println("v1="+MPv1.ID);
            System.out.println("v2="+MPv2c.ID);
            System.out.println("v3="+MPv3.ID);
            ReceiveService_snmp snmp_receive = new ReceiveService_snmp();  
            snmp_receive.run(); //开始监听
        }
        //#region 启动程序
         public void run() {  
                try
                {  
                    startListen();  
                    snmp.addCommandResponder(this);  
                    System.out.println("开始监听Trap信息!");  
                }
                catch (Exception ex)
                {  
                    ex.printStackTrace();  
                }  
         }
         //#endregion
        
        //#region 启动监听
        private static Snmp snmp = null;  
        private static Address listenAddress;  
        private static void startListen(){
            try{
                ThreadPool threadPool= ThreadPool.create("Trap", 2);//启动一个线程池,设置最高两个线程
                MultiThreadedMessageDispatcher dispatcher = new MultiThreadedMessageDispatcher(threadPool, new MessageDispatcherImpl());  
                listenAddress = (Address) GenericAddress.parse("udp:0.0.0.0/162"); //监听所有ip的162端口   tcp:0.0.0.0/162
                TransportMapping transport = null;  
                // 对TCP与UDP协议进行处理
                try {
                    if (listenAddress instanceof UdpAddress) {
                        System.out.println("使用UDP协议");
                        transport = new DefaultUdpTransportMapping((UdpAddress) listenAddress);  
                    } 
                    else {
                        System.out.println("使用TCP协议");
                        transport = new DefaultTcpTransportMapping((TcpAddress) listenAddress);  
                    }
                }catch (Exception e){
                    System.out.println("接收地址绑定失败,端口162可能被占用,错误信息:"+e.getMessage());
                    System.exit(0);//绑定失败,停止当前进程
                }          
                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();  //开始监听
            }
            catch (Exception e){
                System.out.println("启动监听时触发catch异常:"+e.getMessage());
            }
        }
        //#endregion
        
         //#region processPdu接口具体的实现
        /**
         *  processPdu接口具体的实现
         *  在接收到snmp信息时,会触发这个方法
        **/
        public void processPdu(CommandResponderEvent respEvnt){  
            if (respEvnt != null && respEvnt.getPDU() != null){
                Vector<VariableBinding> recVBs = (Vector<VariableBinding>) respEvnt.getPDU().getVariableBindings();//这里提示我类型转换错误,我必须要进行一次强转
                System.out.println("=======================消息内容=======================");
                System.out.println("数据来源:"+respEvnt.getPeerAddress());
                System.out.println("团体名:"+new String(respEvnt.getSecurityName()));//团体名在v1 v2c下可以用来做认证
                String snmpVer = respEvnt.getMessageProcessingModel()==0?
                                            "v1":respEvnt.getMessageProcessingModel()==1?
                                            "v2c":respEvnt.getMessageProcessingModel()==3?
                                            "v3":"其他版本";//其实这里还有一个v2u版本,但网上很少提及不知道是不是应用较少?
                System.out.println("trap版本:"+snmpVer);
                System.out.println(respEvnt.toString());//输出一下整条信息
                for (int i = 0; i < recVBs.size(); i++) {  
                   VariableBinding recVB = recVBs.elementAt(i);
                    System.out.println("oid:"+recVB.getOid());
                    System.out.println("variable:"+recVB.getVariable());
                }  
                System.out.println("=======================输出结束=======================");
            }  
        }
        //#endregion
    }

    2. 发送UDP请求 案列:参考文章

    import java.io.IOException;
    
    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;
    
    public class Monitor {
     
        // systemDescr  https://www.cnblogs.com/aspx-net/p/3554044.html
            static final String OID1 = "1.3.6.1.2.1.1.1.0";
            // eth0
            static final String OID2 = "1.3.6.1.2.1.2.2.1.2.2";
            // MAC
            static final String OID3 = "1.3.6.1.2.1.2.2.1.6.2";
            
            static final String OID4 = "1.3.6.1.2.1.1.1";
            
    //        //设备名称
    //        static final String OID5 = "1.3.6.1.2.1.1.5.0";
            
            //static final int [] OID5 = {1,3,6,1,2,1,1,2}; 与第一个一样
            
        /**
         * @param args
         */
        public static void main(String[] args) {
            GetOID();
        }
    
        /**
         * 获得本机oid
         */
        public static void GetOID() {
            TransportMapping transport = null;
            try {
                // 传输协议udp
                transport = new DefaultUdpTransportMapping();
                transport.listen();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
    
            // 構造報文
            PDU request = new PDU();        
            request.add(new VariableBinding(new OID(OID1)));  
            request.add(new VariableBinding(new OID(OID2)));
            request.add(new VariableBinding(new OID(OID3)));
            request.add(new VariableBinding(new OID(OID4)));  
    //        request.add(new VariableBinding(new OID(OID5)));
    
            request.setType(PDU.GET);
    
            // snmp初始化
            Snmp snmp = new Snmp(transport);
    
            // 構造目標
            CommunityTarget target = new CommunityTarget();
            Address localAddress =GenericAddress.parse("udp:10.10.11.168/161");
            target.setAddress(localAddress);
            OctetString oct = new OctetString("public");
            target.setCommunity(oct);
            target.setVersion(SnmpConstants.version2c);
            target.setRetries(2);
            target.setTimeout(5 * 60);
    
            try {
                // 發送報文
                ResponseEvent responseEvent = snmp.send(request, target);
            
                    PDU response = responseEvent.getResponse();
                    if (response != null) {
                    System.out.println("request.size()=" + request.size());
                    System.out.println("response.size()=" + response.size());
                    VariableBinding vb1 = response.get(0);
                    VariableBinding vb2 = response.get(1);
                    VariableBinding vb3 = response.get(2);
                    VariableBinding vb4 = response.get(3);
                    VariableBinding vb5 = response.get(4);
                    System.out.println(vb1);
                    System.out.println(vb2);
                    System.out.println(vb3);
                    System.out.println(vb4);
    //                System.out.println(vb5);
                    
                    //释放
                    transport.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    3. 安装mg-soft

    百度云盘下载rar压缩包,里面有个安装教程文档

    链接: https://pan.baidu.com/s/1f_aVEy1aiwr_kPalyH-fOw 提取码: dyva 复制这段内容后打开百度网盘手机App,操作更方便哦

    (说明:MIB Tree->ios->org->dod->internet->mgmt ‘公有oid’,private '私有oid'

    右键Walk为矢量查询,Get,GetNext 为标量查询.

    选中Query results 返回结果节点右键 Properties ‘可以查看OID,加上节点后的(.数字)就是这个结果的oid’

    注意事项:1.以管理员身份运行: 解压后的setup.exe(谨慎起见)  ,MG-SOFTMIB BrowserBinmgmibbpe.exe程序(MIB Browser)

    4. 导入MIB学习网

  • 相关阅读:
    Objective-C Runtime Method Swizzling 实践
    code signing blocked mmap() of '/private/var/contai 报错
    supervisor 监控nginx 一直在重启的问题
    Supervisor 两种不同的启动方式,带来两种不同的结果
    addChildViewController后 Childvc viewWillAppear 不调用的问题
    cocoapods 升级到最新beta 版
    addChildViewController后开启热点/wifi/打电话引起的子vc的布局问题
    "undefined method `root' for nil:NilClass" error when using "pod install" 解决办法
    macOS sierra 10.12 Cocoapods 私有库
    Demo
  • 原文地址:https://www.cnblogs.com/free-discipline/p/12027868.html
Copyright © 2011-2022 走看看