Snmp协议访问设备获取数据

1.安装依赖

<dependency>

<groupId>org.snmp4j</groupId>

<artifactId>snmp4j</artifactId>

<version>2.5.11</version>

</dependency>

2.service代码,根据自己需要编写即可,下面示例:

import org.apache.log4j.Logger;

import org.immi.modules.snmp.entity.SnmpEntity;

import org.immi.modules.snmp.entity.dto.SnmpDto;

import java.io.IOException;

import java.net.InetAddress;

import java.util.List;

/**

* @Auther: sn

* @Date:

* @Description:

*/

public class SnmpService {

private static final Loggerlogger = Logger.getLogger(SnmpService.class);

    SnmpDtosnmpDto =new SnmpDto();

    public SnmpDtogetInstanceSnmpDto() {

return snmpDto;

    }

/**

    * 获取CPU使用率

    *

    * @param

    * @return 正常返回CPU当前使用率,否则返回-1

*/

    public IntegergetCpuUtilization(SnmpEntity snmpEntity,String oid) {

List result = getInstanceSnmpDto().walkByTable(oid, snmpEntity);

        if (result ==null || result.size() ==0) {

return -1;

        }

double sum =0;

        for (String s : result) {

//            System.out.println("****Double值****"+Double.parseDouble(s));

            sum += Double.parseDouble(s);

        }

return (int) (sum / result.size());

    }

/**

    * 获取内存占用率

    *

    * @param snmpEntity

    * @return 正常返回当前内存使用率,否则返回-1

    * @throws IOException

*/

    public IntegergetMemoryUtilization(SnmpEntity snmpEntity){

// 使用

        try{

List usedresultList = getInstanceSnmpDto().walkByTable(".1.3.6.1.2.1.25.2.3.1.6", snmpEntity);

            // 总

            List allresultList = getInstanceSnmpDto().walkByTable(".1.3.6.1.2.1.25.2.3.1.5", snmpEntity);

            if (usedresultList !=null && usedresultList.size() >0 && allresultList !=null && allresultList.size() >0) {

double used =0;

                // 最后一个才是使用的内存(单位是数目 ) 因系统而不同 本机有5项

                // System.out.println(usedresultList.size());

// for(String s:usedresultList){

// System.out.println(s);

// }

                String usedStr = usedresultList.get(usedresultList.size() -1);

                used = Double.parseDouble(usedStr);

                double all =0;

                String allStr = allresultList.get(allresultList.size() -1);

                all = Double.parseDouble(allStr);

                return (int) ((used / all) *100);

            }

}catch (Exception e) {

logger.error("获取Memory占用率:"+e.getMessage());

        }

return -1;

    }

/**

    * 测网络通不通 类似 ping ip

*

    * @param snmpEntity

    * @return

    * @throws IOException

*/

    public boolean isEthernetConnection(SnmpEntity snmpEntity)throws IOException {

InetAddress ad = InetAddress.getByName(snmpEntity.getHostIp());

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

        return state;

    }

/**

    * 获取运行时间

    * @param snmpEntity

    * @return

    */

    public StringgetTime(SnmpEntity snmpEntity,String oid) {

List result = getInstanceSnmpDto().walkByTable(oid, snmpEntity);

        if (result ==null || result.size() ==0) {

return "未获取到运行日期";

        }

for (String s : result) {

System.out.println("****运行日期****"+s);

            return s;

        }

return "获取失败";

    }

/**

    * 获取运行时间

    * @param snmpEntity

    * @return

    */

    public ListflowIn(SnmpEntity snmpEntity,String oid) {

List result = getInstanceSnmpDto().walkByTable(oid, snmpEntity);

//        System.out.println("****返回结果****"+result);

//        if (result == null || result.size() == 0) {

////            return "-1";

//        }

        return result;

////        long sum = 0;

////        int sum = 0;

//        for (String s : result) {

////            System.out.println("****单次流入****"+s);

////            sum += Double.parseDouble(s);

//            sum += Long.parseLong(s);

//        }

////        return sum;

    }

}

3.Entity代码,主要放置了一些配置参数,根据需要编写即可,下为示例:

import javax.persistence.Entity;

import java.io.Serializable;

@Entity

public class SnmpEntityimplements Serializable {

private StringcommunityName;

    private StringhostIp;

    private Integerport;

    private int version;

    private int async;//是否同步查询

    private StringserverId; // 受监控服务器标识

    private Stringcode; // 受监控服务器编码

    private Stringname; // 受监控服务器名称

    private Stringtype; // 服务器的应用类型(如应用服务,数据库服务,前置机服务器),在维护时输入,在界面中相应字段呈现

    private StringsystemName; // 受监控服务器操作系统

    private Stringip; // 受监控服务器IP地址

    private Stringaddress; // 受监控服务的存放地址

    private Stringstatusid; // 状态(1为可用,0为不可用,默认为1),用于是否对这个服务器进行监控

    private Stringremark; // 备注

    private Stringcpu;

    private Stringmemory;

    private Stringtime;

    private boolean ethernetConnection;

    // 服务service字段

    private StringserviceId; // 受监控服务标识

    private StringserviceName; // 受监控服务名称

    private StringserverName; // 受监控服务所在服务器名称

    private StringserverIp; // 受监控服务所在服务器IP

    private StringprocesseName; // 受监控服务进行名称

    private StringserviceStatus; // 状态(1为可用,0为禁用,默认值为1),用于是否对这个服务进程进行监控

    private StringserviceRemark; // 备注

    public StringgetCommunityName() {

return communityName;

    }

public void setCommunityName(String communityName) {

this.communityName = communityName;

    }

public StringgetHostIp() {

return hostIp;

    }

public void setHostIp(String hostIp) {

this.hostIp = hostIp;

    }

public IntegergetPort() {

return port;

    }

public void setPort(Integer port) {

this.port = port;

    }

public int getVersion() {

return version;

    }

public void setVersion(int version) {

this.version = version;

    }

public int getAsync() {

return async;

    }

public void setAsync(int async) {

this.async = async;

    }

public StringgetServerId() {

return serverId;

    }

public void setServerId(String serverId) {

this.serverId = serverId;

    }

public StringgetCode() {

return code;

    }

public void setCode(String code) {

this.code = code;

    }

public StringgetName() {

return name;

    }

public void setName(String name) {

this.name = name;

    }

public StringgetType() {

return type;

    }

public void setType(String type) {

this.type = type;

    }

public StringgetSystemName() {

return systemName;

    }

public void setSystemName(String systemName) {

this.systemName = systemName;

    }

public StringgetIp() {

return ip;

    }

public void setIp(String ip) {

this.ip = ip;

    }

public StringgetAddress() {

return address;

    }

public void setAddress(String address) {

this.address = address;

    }

public StringgetStatusid() {

return statusid;

    }

public void setStatusid(String statusid) {

this.statusid = statusid;

    }

public StringgetRemark() {

return remark;

    }

public void setRemark(String remark) {

this.remark = remark;

    }

public StringgetCpu() {

return cpu;

    }

public void setCpu(String cpu) {

this.cpu = cpu;

    }

public StringgetMemory() {

return memory;

    }

public void setMemory(String memory) {

this.memory = memory;

    }

public StringgetTime() {

return time;

    }

public void setTime(String time) {

this.time = time;

    }

public boolean isEthernetConnection() {

return ethernetConnection;

    }

public void setEthernetConnection(boolean ethernetConnection) {

this.ethernetConnection = ethernetConnection;

    }

public StringgetServiceId() {

return serviceId;

    }

public void setServiceId(String serviceId) {

this.serviceId = serviceId;

    }

public StringgetServiceName() {

return serviceName;

    }

public void setServiceName(String serviceName) {

this.serviceName = serviceName;

    }

public StringgetServerName() {

return serverName;

    }

public void setServerName(String serverName) {

this.serverName = serverName;

    }

public StringgetServerIp() {

return serverIp;

    }

public void setServerIp(String serverIp) {

this.serverIp = serverIp;

    }

public StringgetProcesseName() {

return processeName;

    }

public void setProcesseName(String processeName) {

this.processeName = processeName;

    }

public StringgetServiceStatus() {

return serviceStatus;

    }

public void setServiceStatus(String serviceStatus) {

this.serviceStatus = serviceStatus;

    }

public StringgetServiceRemark() {

return serviceRemark;

    }

public void setServiceRemark(String serviceRemark) {

this.serviceRemark = serviceRemark;

    }

}

4.Dto代码

import org.apache.log4j.Logger;

import org.immi.modules.snmp.entity.SnmpEntity;

import org.snmp4j.CommunityTarget;

import org.snmp4j.PDU;

import org.snmp4j.Snmp;

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.util.ArrayList;

import java.util.List;

/**

* @Auther: sn

* @Date:

* @Description:

*/

public class SnmpDto {

private StringcommunityName;

    private StringhostIp;

    private Integerport;

    private int version;

    private static final Loggerlogger = Logger.getLogger(SnmpDto.class);

    /**

    * 获取指定OID对应的table值

    * @param oid

    * @param snmpEntity

    * @return

    */

    public ListwalkByTable(String oid, SnmpEntity snmpEntity){

Snmp snmp =null;

        PDU pdu;

        CommunityTarget target;

        List result =new ArrayList();

        communityName = snmpEntity.getCommunityName();

        hostIp = snmpEntity.getHostIp();

        port = snmpEntity.getPort();

        version = snmpEntity.getVersion();

        try {

DefaultUdpTransportMapping dm =new DefaultUdpTransportMapping();

            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);

            pdu =new PDU();

            pdu.setMaxRepetitions(50);

            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);

            System.out.println("****输出结果****"+list);

            for(TableEvent e : list){

VariableBinding[] vb = e.getColumns();

                if(null == vb)continue;

                result.add(vb[0].getVariable().toString());

//                System.out.println("****输出结果字符串值****"+vb[0].getVariable().toString());

            }

snmp.close();

        }catch (IOException e) {

logger.error(e.getMessage());

        }finally{

try {

if(snmp !=null)

{

snmp.close();

                }

}catch (IOException e) {

logger.error(e.getMessage());

            }

}

return result;

    }

}

5.调用

SnmpService snmpService =new SnmpService();

SnmpEntity snmpEntity =new SnmpEntity();

snmpEntity.setIp("0.0.0.0");//ip

snmpEntity.setCommunityName("admin");//社区编码

snmpEntity.setHostIp("0.0.0.0");

snmpEntity.setPort(161);//prot

snmpEntity.setVersion(SnmpConstants.version2c);//版本

System.out.println("是否连接:"+snmpService.isEthernetConnection(snmpEntity));

System.out.println("状态:"+ snmpService.flowIn(snmpEntity,".1.3.6.1.2.1.2.2.1.8"));//获取的状态,1是up,2是down


图1

备注:

如果oid不是最终节点,将会自动递归获取所有节点直到最后一个节点,如果是最终节点,只会获取一条数据,并且在命令行中,如果不是最终节点命令只能使用:getnext oid,使用get将会报错,如果是最终节点,可以使用get oid,oid可以以:.0补充结尾或者不补充,对结果没有影响。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342