Snmp協(xié)議訪問設(shè)備獲取數(shù)據(jù)

1.安裝依賴

<dependency>

<groupId>org.snmp4j</groupId>

<artifactId>snmp4j</artifactId>

<version>2.5.11</version>

</dependency>

2.service代碼抓督,根據(jù)自己需要編寫即可拒秘,下面示例:

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當(dāng)前使用率匙头,否則返回-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());

? ? }

/**

? ? * 獲取內(nèi)存占用率

? ? *

? ? * @param snmpEntity

? ? * @return 正常返回當(dāng)前內(nèi)存使用率薪寓,否則返回-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;

? ? ? ? ? ? ? ? // 最后一個才是使用的內(nèi)存(單位是數(shù)目 ) 因系統(tǒng)而不同 本機(jī)有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;

? ? }

/**

? ? * 測網(wǎng)絡(luò)通不通 類似 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);// 測試是否可以達(dá)到該地址 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("****返回結(jié)果****"+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代碼易稠,主要放置了一些配置參數(shù)胶逢,根據(jù)需要編寫即可软能,下為示例:

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; // 受監(jiān)控服務(wù)器標(biāo)識

? ? private Stringcode; // 受監(jiān)控服務(wù)器編碼

? ? private Stringname; // 受監(jiān)控服務(wù)器名稱

? ? private Stringtype; // 服務(wù)器的應(yīng)用類型(如應(yīng)用服務(wù)扳缕,數(shù)據(jù)庫服務(wù)慌闭,前置機(jī)服務(wù)器),在維護(hù)時輸入躯舔,在界面中相應(yīng)字段呈現(xiàn)

? ? private StringsystemName; // 受監(jiān)控服務(wù)器操作系統(tǒng)

? ? private Stringip; // 受監(jiān)控服務(wù)器IP地址

? ? private Stringaddress; // 受監(jiān)控服務(wù)的存放地址

? ? private Stringstatusid; // 狀態(tài)(1為可用驴剔,0為不可用,默認(rèn)為1)粥庄,用于是否對這個服務(wù)器進(jìn)行監(jiān)控

? ? private Stringremark; // 備注

? ? private Stringcpu;

? ? private Stringmemory;

? ? private Stringtime;

? ? private boolean ethernetConnection;

? ? // 服務(wù)service字段

? ? private StringserviceId; // 受監(jiān)控服務(wù)標(biāo)識

? ? private StringserviceName; // 受監(jiān)控服務(wù)名稱

? ? private StringserverName; // 受監(jiān)控服務(wù)所在服務(wù)器名稱

? ? private StringserverIp; // 受監(jiān)控服務(wù)所在服務(wù)器IP

? ? private StringprocesseName; // 受監(jiān)控服務(wù)進(jìn)行名稱

? ? private StringserviceStatus; // 狀態(tài)(1為可用区转,0為禁用,默認(rèn)值為1)镶殷,用于是否對這個服務(wù)進(jìn)程進(jìn)行監(jiān)控

? ? 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對應(yīng)的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("****輸出結(jié)果****"+list);

? ? ? ? ? ? for(TableEvent e : list){

VariableBinding[] vb = e.getColumns();

? ? ? ? ? ? ? ? if(null == vb)continue;

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

//? ? ? ? ? ? ? ? System.out.println("****輸出結(jié)果字符串值****"+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.調(diào)用

SnmpService snmpService =new SnmpService();

SnmpEntity snmpEntity =new SnmpEntity();

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

snmpEntity.setCommunityName("admin");//社區(qū)編碼

snmpEntity.setHostIp("0.0.0.0");

snmpEntity.setPort(161);//prot

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

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

System.out.println("狀態(tài):"+ snmpService.flowIn(snmpEntity,".1.3.6.1.2.1.2.2.1.8"));//獲取的狀態(tài)聪全,1是up,2是down


圖1

備注:

如果oid不是最終節(jié)點载佳,將會自動遞歸獲取所有節(jié)點直到最后一個節(jié)點炒事,如果是最終節(jié)點,只會獲取一條數(shù)據(jù)蔫慧,并且在命令行中挠乳,如果不是最終節(jié)點命令只能使用:getnext oid,使用get將會報錯姑躲,如果是最終節(jié)點睡扬,可以使用get oid,oid可以以:.0補充結(jié)尾或者不補充黍析,對結(jié)果沒有影響卖怜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阐枣,隨后出現(xiàn)的幾起案子马靠,更是在濱河造成了極大的恐慌奄抽,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甩鳄,死亡現(xiàn)場離奇詭異逞度,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妙啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門档泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揖赴,你說我怎么就攤上這事馆匿。” “怎么了储笑?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵甜熔,是天一觀的道長。 經(jīng)常有香客問我突倍,道長腔稀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任羽历,我火速辦了婚禮焊虏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秕磷。我一直安慰自己诵闭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布澎嚣。 她就那樣靜靜地躺著疏尿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪易桃。 梳的紋絲不亂的頭發(fā)上褥琐,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機(jī)與錄音晤郑,去河邊找鬼敌呈。 笑死,一個胖子當(dāng)著我的面吹牛造寝,可吹牛的內(nèi)容都是我干的磕洪。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼诫龙,長吁一口氣:“原來是場噩夢啊……” “哼析显!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起签赃,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤叫榕,失蹤者是張志新(化名)和其女友劉穎浑侥,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晰绎,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年括丁,在試婚紗的時候發(fā)現(xiàn)自己被綠了荞下。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡史飞,死狀恐怖尖昏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情构资,我是刑警寧澤抽诉,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站吐绵,受9級特大地震影響迹淌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜己单,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一唉窃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纹笼,春花似錦纹份、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笋额,卻和暖如春元暴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳞陨。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工昨寞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人厦滤。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓援岩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掏导。 傳聞我的和親對象是個殘疾皇子享怀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348