windows系统下SNMP协议获取系统内存、CPU实例代码

windows系统下SNMP协议获取系统内存、CPU实例代码,第1张

windows系统下SNMP协议获取系统内存、CPU实例代码

系统环境:win10

注:win10及以下windows平台,在控制面板,程序中,添加snmp服务功能。

可参照:https://jingyan.baidu.com/article/3d69c5515e56b3f0cf02d7bf.html

为方便测试snmp协议,先关闭系统防火墙,后续可根据需要进行防护墙配置。

工具资源下载:https://download.csdn.net/download/csdnyang338/72113747

Snmp服务环境配置:

第一步:在系统设置中,搜索“开发者设置”,勾选开发人员模式

 

第二步:在系统设置中,搜索“应用和功能”,点击“管理可选功能”

第三步:在添加功能中选择snmp协议,点击安装

第四步:在服务中,找到启动snmp服务,右键,选择属性,在“安全”中添加社区名称:public,重启snmp服务。

 Java代码:

添加jar包依赖:


   org.snmp4j
   snmp4j
   2.5.11

测试代码:

package com.example.snmp;
import org.snmp4j.Snmp;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import java.io.IOException;
import java.util.List;
public class SnmpDemoTest {
    public static void main(String[] args) {
        SNMPTool SnmpTool = new SNMPTool();
        //实例化实体snmp类
        SnmpBean snmpBean = new SnmpBean();
        snmpBean.setLocalIp("127.0.0.1");
        snmpBean.setCommunityName("public");
        snmpBean.setHostIp("127.0.0.1");
        snmpBean.setPort(161);
        snmpBean.setVersion(1);
        //测试联通性
        try {
            //是否连接
            System.out.println("连接成功:" + SnmpTool.isEthernetConnection(snmpBean));
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取cpu利用率
        List result = SnmpTool.walkByTable(".1.3.6.1.2.1.25.3.3.1.2", snmpBean);
        double sum = 0;
        for (String s : result) {
            sum += Double.parseDouble(s);
        }
        int cpu = (int) (sum / result.size());
        System.out.println("cpu利用率:"+cpu+"%");
        //get方式获取系统内存
        try {
            Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
            snmp.listen();
            String strMemory = SnmpTool.sendRequestGet(snmp,".1.3.6.1.2.1.25.2.2.0",snmpBean);
            System.out.println("系统内存:"+Math.ceil(Double.parseDouble(strMemory)/1024/1024)+"G");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

实体类:


public class SnmpBean {
    //分区域,即密码,默认是public
    private String communityName;
    //服务器ip地址
    private String hostIp;
    //本机ip地址
    private String localIp;
    //snmp访问端口号
    private Integer port;
    //版本
    private int version;
    //是否同步查询
    private int async;

//自行添加set、get

}

Snmp测试工具

package com.example.snmp;
import com.sun.jmx.snmp.internal.SnmpModel;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TableEvent;
import org.snmp4j.util.TableUtils;
import java.io.IOException;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class SNMPTool {
    //获取列表oid数据
    public List walkByTable(String oid, SnmpBean snmpBean){
        Snmp snmp = null;
        PDU pdu;
        CommunityTarget target;
        List result = new ArrayList();
        String communityName = snmpBean.getCommunityName();
        String hostIp = snmpBean.getHostIp();
        int port = snmpBean.getPort();
        int version = snmpBean.getVersion();
        try {
            DefaultUdpTransportMapping dm = new DefaultUdpTransportMapping();
         dm.setSocketTimeout(5000);
            snmp = new Snmp(dm);
            snmp.listen();
            target = new CommunityTarget();
            target.setCommunity(new OctetString(communityName));
            target.setVersion(version);
            target.setAddress(new UdpAddress(hostIp+"/"+port));
            target.setTimeout(1000);
            target.setRetries(1);
            TableUtils tutils = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETBULK));
            OID[] columns = new OID[1];
            columns[0] = new VariableBinding(new OID(oid)).getOid();
            List list = (List) tutils.getTable(target, columns, null, null);
            for(TableEvent e : list){
                VariableBinding[] vb = e.getColumns();
                if(null == vb)continue;
                result.add(vb[0].getVariable().toString());
            }
            snmp.close();
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            try {
                if(snmp != null)
                {
                    snmp.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
    //发送snmp查询请求
    public static String  sendRequestGet(Snmp snmp, String oid, SnmpBean snmpBean)
            throws IOException {
        String str=null;
        CommunityTarget target = new CommunityTarget();
        target.setCommunity(new OctetString(snmpBean.getCommunityName()));
        target.setVersion(snmpBean.getVersion());
        target.setAddress(new UdpAddress(snmpBean.getHostIp()+"/"+snmpBean.getPort()));
        target.setTimeout(5000);
        target.setRetries(1);
        PDU pdu = new PDU();
        pdu.setType(PDU.GET);
        pdu.add(new VariableBinding(new OID(oid)));
        ResponseEvent responseEvent = snmp.send(pdu, target);
        PDU response = responseEvent.getResponse();
        if (response == null) {
            System.out.println("TimeOut...");//可能原因,1:snmp服务未开启。2:Community未配置
        } else {
            if (response.getErrorStatus() == PDU.noError) {
                Vector vbs = response.getVariableBindings();
                for (VariableBinding vb : vbs) {
                    System.out.println(vb + " ," + vb.getVariable().getSyntaxString());
                    str =  vb.getVariable().toString();
                }
            } else {
                System.out.println("Error:" + response.getErrorStatusText());
            }
        }
        return str;
    }
    //测试网络是否畅通,类似ping
    public boolean isEthernetConnection(SnmpBean bean) throws IOException {

        InetAddress ad = InetAddress.getByName(bean.getHostIp());
        boolean state = ad.isReachable(2000);// 测试是否可以达到该地址 2秒超时
        return state;
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5685322.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存