利用snmp4j获取CPU,内存状态

首先snmp是什么?
snmp是简单的网络管理协议(首字母简写simple network management proctocol)
snmp由什么组成?
snmp是基于TCP/IP协议,用来管理网络中的各种设备节点
主要由被管理的设备,代理,管理系统组成。
总之NMS—Agent—设备,取得相应的信息(可以把每个具体的设备对象当作具体类,MIB则为统一接口加以控制标准化)
MIB认识
MIB代表了某个具体的库,管理系统通过库与代理打交道。OID(Object identifier)标识摸个具体的MIB对象,例如CPU,内存大小等,
PDU
SNMP规定了5种协议数据单元PDU(也就是SNMP报文),用来在管理进程和代理之间的交换。这里不多说,本篇只针对GET类型下取得一些必要的信息。
SNMP4J
1.第一步导入snmp4j的依赖包
2.code:

    static Snmp snmp=null;
    static TransportMapping transport=null;
    CommunityTarget target=null;
    static long timeout=8000;
    static String community="public";
    static TableUtils tableUtils=null;
                  //获取CPU的使用率
    String[] oidsCpu =  {"1.3.6.1.2.1.25.3.3.1.2"}; 
    //初始化目标对象
        public  CommunityTarget  initComm(String ip) {  
            try {
                transport = new DefaultUdpTransportMapping();
                snmp = new Snmp(transport);//创建snmp  
                snmp.listen();//监听消息  
                target = new CommunityTarget();  
                target.setCommunity(new OctetString(community));  
                target.setRetries(2);  
                target.setAddress(GenericAddress.parse("udp:"+ip+"//161"));  
                target.setTimeout( timeout);  
                target.setVersion(SnmpConstants.version2c);  
                 tableUtils = new TableUtils(snmp, new PDUFactory() {  
                @Override  
                public PDU createPDU(Target arg0) {  
                PDU request = new PDU();  
                request.setType(PDU.GET);  
                return request;  
                }
                    @Override
                public PDU createPDU(MessageProcessingModel arg0) {
                    // TODO Auto-generated method stub
                    return null;
                }  
                });  

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return target;


    }
public List collectCPU(CommunityTarget target) {
              int percentage = 0;  
                OID[] columns = new OID[oidsCpu.length];  
                for (int i = 0; i < oidsCpu.length; i++)  
                columns[i] = new OID(oidsCpu[i]);  
                List list = tableUtils.getTable(target, columns, null, null);  
                if(list.size()==1 && list.get(0).getColumns()==null){  

                }else{      
                for(TableEvent event : list){  
                VariableBinding[] values = event.getColumns();  
                if(values != null)   
                percentage += Integer.parseInt(values[0].getVariable().toString());  
                }   
                }
                if(this.getCpuRate().size()<60) {
                    this.getCpuRate().add((double) percentage);
                }
                this.getCpuRate().remove(0);
                this.getCpuRate().add((double) percentage);
                return cpuRate;


         }
本文的代码是定时取得存储一小时之内的数据,所以有部分集合存储部分删掉即可得到相关信息。仅以CPU为例,了解整个协议数据的在SNMP4J下的传输方式。

你可能感兴趣的:(网络编程)