日期:2014-05-20  浏览次数:20825 次

Java的snmp获取网络速度问题 (有很多源码snmpv1v2v3通适)
代码很长,先说问题:
第一,如何读取mib库,这里只是传了OID值,我觉得方法应该是这三种 get,getnext,walk,但是假设我想获取 网络输入速度 网络输出速度 发送包数 接收包数 ,改如何获取,因为有时候是叶子节点的直接用get,不是叶子节点的 walk,那个oid.索引 明白的说详细点。。
第二,snmp版本问题我一直是测试v1 v2的,v3还没测试,还要加论证,加密才能获取相关信息?。。晕。。
第三,请高手帮忙测试一下,为什么我总是得到的结果是超时///

谢谢!!!!

用到的包 snmp4j log4j
snmp4j下载地址:
http://www.snmp4j.org/html/download.html

Java code

//第一步测试Main方法:

//Java code
public class MainSnmpWalk{
    static Logger log = Logger.getLogger(MainSnmpWalk.class);
    public MainSnmpWalk(){
    }

    public static void main(String[] args) throws InterruptedException{

//建立一个SNMPv2c PDU,它会从system(1.3.6.1.2.1.1)OID开始游走
//        SnmpWalk walk = new SnmpWalk("192.168.100.10","1.3.6.1.2.1.1.5.0");//物理位置
//        SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.2.1.25.2.2");//RAM
//        SnmpWalk walk = new SnmpWalk("127.0.0.1","1.3.6.1.2.1.25.2.3.1.6");//Hard Disk
//        SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.2.1.25.5.1.1.1");//CPU Utilization

//        SnmpWalk walk = new SnmpWalk("127.0.0.1","1.3.6.1.2.1.25.1");//也含本机物理总内存
        //cpu:1.3.6.1.2.1.25.5.1.1.1
        //memory:1.3.6.1.2.1.25.5.1.1.2 //得到的是每个进程的的内存使用值

        //1.3.6.1.2.1.25.3.3.1.2.1 //一个比较通用的看设备CPU利用率的OID值。取最后一分钟的平均值。


        // Linux下可以.1.3.6.1.2.1.25.2和.1.3.6.1.2.1.25.5这两个值试试
        //====================================================

        //.1.3.6.1.4.1.311.1.1.3.1.1.1.2.0

//        SnmpWalk walk = new SnmpWalk("10.8.0.90","1.3.6.1.2.1.1.1");//系统描述
//        SnmpWalk walk = new SnmpWalk("127.0.0.1","1.3.6.1.2.1.25.1.7.0");//本机物理总内存
//        SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.2.1.25.4.2.1.2");//列出系统进程
//        SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.4.1.77.1.2.25.1.1");//列出系统用户列表
//        SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.4.1.77.1.4.1");//列出域名(工作组)
//        SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.2.1.25.6.3.1.2");//列出安装的软件


//        SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.2.1.25.3.3.1.2");

        //SnmpWalk walk = new SnmpWalk("127.0.0.1",".1.3.6.1.2.1.25.4.2.1.2");//当前进程列表

        //可用的内存数量: .1.3.6.1.4.1.311.1.1.3.1.1.1.2.0
        //磁盘利用率的OID: .1.3.6.1.4.1.311.1.1.3.1.1.5.1.3.0
        //CPU的利用率: .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3.1.48.0
        //发送的字节数(包括组帧字符): 1.3.6.1.2.1.2.2.1.16.1
        //收到的字节数(包括组帧字符): 1.3.6.1.2.1.2.2.1.10.1

        //cpuPercentProcessorTime .1.3.6.1.4.1.311.1.1.3.1.1.2.1.3
        //memoryAvailableKBytes (OID: .1.3.6.1.4.1.311.1.1.3.1.1.1.29)
        //memoryAvailableMBytes (OID: .1.3.6.1.4.1.311.1.1.3.1.1.1.30)

//==================================================================================
//        log.debug("Doing SNMPv2 walk..");
        //1.3.6.1.2.1.1.6.0
//          SnmpWalk walk = new SnmpWalk("192.168.100.57","1.3.6.1.2.1.1.4.0");//1.3.6.1.2.1.1.5.0
//          String str = walk.doWalk();
//          log.debug("主方法str: "+ str);

//==================================================================================
        /**
         * 在Windows操作系统上默认是没有安装snmp协议的,需要安装snmp,安装细节较简单,这里不再描述
         * 1.在Windows上安装好了snmp之后,它默认是不支持SNMPv3的,需要重新安装一个SNMPv3的代理
         * 2.在Windows上直接安装软件:snmpv3agent setup.exe并配置好安全名称(用户)、认证协订、认证密码、保密协定以及保密密码
         * 3.设置好了之后,在代码里直接相对应就OK了.
         */
        //.1.3.6.1.4.1.77.1.2.25.1.1 //1.3.6.1.2.1.1.5.0
        // 用来设定安全名称(用户)、认证协订、认证的通行密码、保密协定以及保密的通行密码
        log.debug("doing snmpv3 walk..");
        //建立一个snmpv3c pdu,它会以kschmidt做为安全名称,md5做为认证协定

//        SnmpWalk walk = new SnmpWalk("192.168.100.10","1.3.6.1.2.1.1.6.0","zmq","MD5","mysnmpzmq","DES","mysnmpzmq");
//        String str3 = walk.doWalk();
//        log.debug("主方法str: "+ str3);

//          SnmpWalk walk = new SnmpWalk("192.168.100.11","1.3.6.1.2.1.1.6.0","zmq","MD5","mysnmpzmq","DES","mysnmpzmq");
        SnmpWalk walk2 = new SnmpWalk("192.168.100.10","1.3.6.1.2.1.1.1.0"); //.1.3.6.1.2.1.2.3.1.6
        String str3 = walk2.doWalk();
//        String str4 = walk2.doWalk();
//          log.debug("主方法str: "+ str3);
        System.out.println("---result---"+str3);
//          System.out.println("---result2---"+str4);
    }
}



//第二步:类SnmpWalk.java


public class SnmpWalk {
      public static final int WALK = 1;
      private SnmpUtil _util = null;
      //会建立一出一个SNMPv2c walk命令,引数是"执行agent的主机"以及"我们想要游走之OIDs的前缀(prefix)"
      public SnmpWalk(String host, String oid){
        _util = new SnmpUtil(host,oid,false,0);
        _util.setOperation(WALK);
      }

      //会建立出一个SNMPv3 walk命令,前两个引数与上面建构式一样,其它引数则与SNMPv3的安全设定有关
      public SnmpWalk(String host, String oid, String user, String authProtocol, String authPasshrase, String privProtocol, String privPassphrase) {
          _util = new SnmpUtil(host,oid,user,authProtocol,authPasshrase,privProtocol,privPassphrase,false,0);
          _util.setOperation(WALK);
      }
      public String doWalk() {
        return _util.sendAndProcessResponse();
      }
}