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補充結尾或者不補充,對結果沒有影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章