Snmp协议访问设备获取数据

4 篇文章 0 订阅
1 篇文章 0 订阅

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补充结尾或者不补充,对结果没有影响。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于Spring Boot集成SNMP,你可以按照以下步骤进行操作: 1. 添加SNMP依赖:在你的Spring Boot项目的pom.xml文件中,添加SNMP的依赖。你可以使用snmp4j或者snmp4j-agentless这两个库来实现SNMP功能。例如,使用snmp4j的依赖配置如下: ```xml <dependency> <groupId>org.snmp4j</groupId> <artifactId>snmp4j</artifactId> <version>2.8.5</version> </dependency> ``` 2. 创建SNMP配置类:创建一个SNMP配置类,用于配置SNMP连接的相关参数,如SNMP主机地址、端口号、团体字等。你可以将这些参数配置在application.properties或application.yml文件中,并在配置类中读取这些参数。 3. 创建SNMP服务类:创建一个SNMP服务类,用于实现SNMP功能。你可以使用snmp4j库提供的类和方法来实现SNMP的数据获取、设置等操作。在服务类中,你可以定义一些方法来处理SNMP请求,并将其暴露为REST接口供其他模块调用。 4. 配置Spring Boot:在Spring Boot的配置类中,通过注解@EnableWebMvc或@SpringBootApplication开启Spring MVC功能。如果你需要将SNMP服务作为REST接口暴露出去,则需要在配置类中添加@RestController注解。 5. 编写控制器类:在控制器类中,注入SNMP服务类,并定义REST接口来调用SNMP服务的方法。你可以根据自己的需求来设计接口的路径和请求方式。 6. 测试:启动Spring Boot应用,通过访问定义的REST接口来测试SNMP功能是否正常。 以上是一个基本的Spring Boot集成SNMP的步骤,具体实现还需要根据你的业务需求进行调整和完善。希望对你有所帮助!如果你有更多的问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值