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学习网

原文地址:https://www.cnblogs.com/free-discipline/p/12027868.html