Java使用snmp協(xié)議實(shí)現(xiàn)采集服務(wù)器信息
一、SNMP介紹
SNMP是一種用于管理網(wǎng)絡(luò)設(shè)備的協(xié)議。它是一種標(biāo)準(zhǔn)化的協(xié)議,被用于監(jiān)控和管理網(wǎng)絡(luò)設(shè)備,包括路由器、交換機(jī)、服務(wù)器、打印機(jī)和其他設(shè)備。
SNMP協(xié)議的基本組成部分包括:
管理站(Management Station):通常是一個(gè)PC或服務(wù)器,用于監(jiān)控和管理網(wǎng)絡(luò)設(shè)備。
管理代理(Management Agent):運(yùn)行在網(wǎng)絡(luò)設(shè)備上的軟件,負(fù)責(zé)管理和監(jiān)控網(wǎng)絡(luò)設(shè)備,并提供信息給管理站。
MIB(Management Information Base):一個(gè)層次結(jié)構(gòu)的數(shù)據(jù)庫(kù),包含了網(wǎng)絡(luò)設(shè)備的信息。MIB的每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)著網(wǎng)絡(luò)設(shè)備的一個(gè)屬性或狀態(tài)。
SNMP協(xié)議:用在管理站和管理代理之間傳輸信息的協(xié)議。SNMP消息包含了操作類型、對(duì)象標(biāo)識(shí)符和值。SNMP協(xié)議定義了一系列操作,可以通過(guò)這些操作獲取、設(shè)置和監(jiān)控網(wǎng)絡(luò)設(shè)備的屬性和狀態(tài)。這些操作包括:
- 1、GET:獲取一個(gè)屬性或狀態(tài)的值。
- 2、SET:設(shè)置一個(gè)屬性或狀態(tài)的值。
- 3、GETNEXT:獲取下一個(gè)節(jié)點(diǎn)的值。
- 4、GETBULK:獲取一組節(jié)點(diǎn)的值。
- 5、TRAP:向管理站發(fā)送一個(gè)警告或通知。
SNMP協(xié)議的最新版本是SNMPv3,它提供了安全性和訪問(wèn)控制機(jī)制,以保護(hù)網(wǎng)絡(luò)設(shè)備的安全性和保密性。
為什么要用SNMP
隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,在網(wǎng)絡(luò)不斷普及的同時(shí)也給網(wǎng)絡(luò)管理帶來(lái)了一些問(wèn)題:網(wǎng)絡(luò)設(shè)備數(shù)量成幾何級(jí)數(shù)增加,使得網(wǎng)絡(luò)管理員對(duì)設(shè)備的管理變得越來(lái)越困難;同時(shí),網(wǎng)絡(luò)作為一個(gè)復(fù)雜的分布式系統(tǒng),其覆蓋地域不斷擴(kuò)大,也使得對(duì)這些設(shè)備進(jìn)行實(shí)時(shí)監(jiān)控和故障排查變得極為困難。
網(wǎng)絡(luò)設(shè)備種類多種多樣,不同設(shè)備廠商提供的管理接口(如命令行接口)各不相同,這使得網(wǎng)絡(luò)管理變得愈發(fā)復(fù)雜。
在這種背景下,SNMP應(yīng)運(yùn)而生,SNMP是廣泛應(yīng)用于TCP/IP網(wǎng)絡(luò)的網(wǎng)絡(luò)管理標(biāo)準(zhǔn)協(xié)議,該協(xié)議能夠支持網(wǎng)絡(luò)管理系統(tǒng),用以監(jiān)測(cè)連接到網(wǎng)絡(luò)上的設(shè)備是否有任何引起管理上關(guān)注的情況。通過(guò)"利用網(wǎng)絡(luò)管理網(wǎng)絡(luò)"的方式:網(wǎng)絡(luò)管理員可以利用SNMP平臺(tái)在網(wǎng)絡(luò)上的任意節(jié)點(diǎn)完成信息查詢、信息修改和故障排查等工作,工作效率得以提高。
屏蔽了設(shè)備間的物理差異,SNMP僅提供最基本的功能集,使得管理任務(wù)與被管理設(shè)備的物理特性、網(wǎng)絡(luò)類型相互獨(dú)立,因而可以實(shí)現(xiàn)對(duì)不同設(shè)備的統(tǒng)一管理,管理成本低。
設(shè)計(jì)簡(jiǎn)單、運(yùn)行代價(jià)低,SNMP采用"盡可能簡(jiǎn)單"的設(shè)計(jì)思想,其在設(shè)備上添加的軟件/硬件、報(bào)文的種類和報(bào)文的格式都力求簡(jiǎn)單,因而運(yùn)行SNMP給設(shè)備造成的影響和代價(jià)都被最小化。
SNMP的基本組件
SNMP基本組件包括網(wǎng)絡(luò)管理系統(tǒng)NMS(Network Management System)、代理進(jìn)程(Agent)、被管對(duì)象(Managed Object)和管理信息庫(kù)(Management Information Base)。
優(yōu)勢(shì)
- 1、簡(jiǎn)單易用:SNMP協(xié)議是一種簡(jiǎn)單易用的協(xié)議,使用方便、易于管理。
- 2、標(biāo)準(zhǔn)化:SNMP協(xié)議是一種標(biāo)準(zhǔn)化的協(xié)議,被廣泛應(yīng)用于網(wǎng)絡(luò)管理領(lǐng)域。
- 3、實(shí)時(shí)監(jiān)控:SNMP協(xié)議可以實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)設(shè)備的性能和狀態(tài),及時(shí)發(fā)現(xiàn)和解決問(wèn)題。
- 4、集中管理:SNMP協(xié)議可以通過(guò)集中管理工具對(duì)網(wǎng)絡(luò)設(shè)備進(jìn)行統(tǒng)一管理,提高管理效率和管理水平。
- 5、可擴(kuò)展性:SNMP協(xié)議具有良好的可擴(kuò)展性,可以適應(yīng)不同的網(wǎng)絡(luò)管理需求和應(yīng)用場(chǎng)景。
應(yīng)用
網(wǎng)絡(luò)設(shè)備管理:SNMP協(xié)議是一種常用的網(wǎng)絡(luò)設(shè)備管理協(xié)議,用于監(jiān)控和管理路由器、交換機(jī)、服務(wù)器和打印機(jī)等網(wǎng)絡(luò)設(shè)備。
網(wǎng)絡(luò)性能監(jiān)控:SNMP協(xié)議可以實(shí)時(shí)監(jiān)控網(wǎng)絡(luò)設(shè)備的性能指標(biāo),如CPU利用率、內(nèi)存使用率、網(wǎng)絡(luò)流量等,幫助管理員及時(shí)發(fā)現(xiàn)和解決性能問(wèn)題。
安全管理:SNMP協(xié)議可以用于監(jiān)控和管理操作系統(tǒng)、數(shù)據(jù)庫(kù)、應(yīng)用程序等系統(tǒng)和軟件,保證系統(tǒng)正常運(yùn)行和高效管理。
云計(jì)算管理:SNMP協(xié)議可以用于云計(jì)算環(huán)境中的網(wǎng)絡(luò)管理和監(jiān)控,幫助管理員及時(shí)發(fā)現(xiàn)和解決云環(huán)境中的問(wèn)題。
二、開發(fā)集成
<!-- https://mvnrepository.com/artifact/org.snmp4j/snmp4j --> <dependency> <groupId>org.snmp4j</groupId> <artifactId>snmp4j</artifactId> <version>2.7.0</version> </dependency>
https://mvnrepository.com/artifact/org.snmp4j/snmp4j
目前最新版本3.7.7,目前以2.7.0版本為例。
三、基礎(chǔ)OID
import java.math.BigDecimal; /** * snmp協(xié)議工具類配置文件 */ public class SnmpConfig { private SnmpConfig(){} /** * get cpu描述信息 */ public static final String SNMPGET_CPUDESC=".1.3.6.1.2.1.1.1.0.255.1"; /** * walk 網(wǎng)絡(luò)接口描述 */ public static final String SNMPWALK_IFDESCR=".1.3.6.1.2.1.2.2.1.2"; /** * walk 接口物理地址 */ public static final String SNMPWALK_IFPHYSADDRESS=".1.3.6.1.2.1.2.2.1.6"; /** * get IO負(fù)載 */ public static final String SNMPGET_IOLOAD=".1.3.6.1.2.1.1.1.0.255.0"; /** * 硬盤大小 */ public static final String SNMPGET_DSKTOTAL=".1.3.6.1.4.1.2021.9.1.6"; /** * walk cpu 負(fù)載 */ public static final String SNMPWALK_HRPROCESSLOAD=".1.3.6.1.2.1.25.3.3.1.2"; /** * walk cpu 空閑率 */ public static final String SNMPWALK_SSCPUIDLE=".1.3.6.1.4.1.2021.11.11.0"; /** * walk 存儲(chǔ)設(shè)備描述 */ public static final String SNMPWALK_HRSTORAGEDESCR=".1.3.6.1.2.1.25.2.3.1.3"; /** * walk 存儲(chǔ)設(shè)備描述 */ public static final String SNMPWALK_AHU=".1.3.6.1.2.1.25.2.3.1.4"; /** * walk 存儲(chǔ)設(shè)備描述 */ public static final String SNMPWALK_AUR=".1.3.6.1.2.1.25.2.3.1.5"; /** *walk 存儲(chǔ)設(shè)備使用大小 * 內(nèi)存使用多少,跟總?cè)萘肯喑褪钦加寐? */ public static final String SNMPWALK_HRSTORAGEUSED=".1.3.6.1.2.1.25.2.3.1.6"; /** *walk 內(nèi)存占用 * 各個(gè)進(jìn)程占用的內(nèi)存 */ public static final String SNMPWALK_MEMORY_WIN=".1.3.6.1.2.1.25.5.1.1.2"; /** *walk 存儲(chǔ)設(shè)備使用率 * */ public static final String SNMPWALK_DSKPERCENT=".1.3.6.1.4.1.2021.9.1.9"; /** * get 獲取內(nèi)存大小 */ public static final String SNMPGET_HRMEMORYSIZE=".1.3.6.1.2.1.25.2.2.0"; /** * 獲取機(jī)器名 */ public static final String SNMPWALK_SYSNAME=".1.3.6.1.2.1.1.5"; /** * 性能參數(shù)ID-cpu使用率 */ public static final Integer PERFORMANCE_PARAM_CPUUSAGE=1; /** * 性能參數(shù)ID-內(nèi)存使用率 */ public static final Integer PERFORMANCE_PARAM_MEMORYUSAGE=2; /** * 性能參數(shù)ID-io帶寬占用率 */ public static final Integer PERFORMANCE_PARAM_IOUSAGE=3; /** * decimal 類型1024,用于除法計(jì)算 */ public static final BigDecimal DEVIDE_NUM=new BigDecimal("1024"); /** * get方式獲取內(nèi)存大小 */ public static final String GET_MEMORY="1.3.6.1.2.1.25.2.2.0"; /** * 獲取系統(tǒng)描述 */ public static final String SYS_DSC="1.3.6.1.2.1.1.1.0"; /** * 獲取網(wǎng)絡(luò)接口數(shù)量 */ public static final String IF_NUM="1.3.6.1.2.1.2.1.0"; /** * 獲取cpu核數(shù) */ public static final String CPU_NUM="1.3.6.1.2.1.25.3.3.1.2"; }
四、snmp信息采集工具類
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; import org.snmp4j.Snmp; import org.snmp4j.event.ResponseEvent; import org.snmp4j.mp.SnmpConstants; 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.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.List; /** * snmp協(xié)議工具類 * 獲取服務(wù)器cpu,內(nèi)存,及硬盤占用 */ public class SnmpUtil { private static Logger logger = LogManager.getLogger(SnmpUtil.class); private static Snmp snmp = null; private CommunityTarget target; @SuppressWarnings("squid:S3010") public SnmpUtil(String intranetDeviceIp, Integer snmpPort) throws IOException { if (snmp == null) { snmp = new Snmp(new DefaultUdpTransportMapping()); snmp.listen(); } //初始化CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString("public")); target.setVersion(SnmpConstants.version2c); target.setAddress(new UdpAddress(intranetDeviceIp + "/" + snmpPort)); target.setTimeout(1000); target.setRetries(1); } private ResponseEvent snmpGet(String oid) { PDU pdu = new PDU(); pdu.addOID(new VariableBinding(new OID(oid))); ResponseEvent re=null; try { re = snmp.get(pdu, target); }catch (Exception e){ logger.info("snmpGet 異常"+e.getMessage()); } return re; } private List<TableEvent> snmpWalk(String oid) { TableUtils utils = new TableUtils(snmp, new DefaultPDUFactory(PDU.GETBULK)); OID[] columnOid = new OID[]{new OID(oid)}; return utils.getTable(target, columnOid, null, null); } /** * 獲取cpu負(fù)載 * @return */ public BigDecimal getCpuUsage() { List<TableEvent> list = snmpWalk(SnmpConfig.SNMPWALK_HRPROCESSLOAD); BigDecimal usage = new BigDecimal("0"); for (TableEvent tableEvent : list) { try { String s=tableEvent.toString().split("=")[3].split("]")[0].trim(); if (!"-4,exception".equals(s)){ usage=usage.add(new BigDecimal(tableEvent.toString().split("=")[3].split("]")[0].trim())); }else { return new BigDecimal("-1"); } } catch (Exception e) { logger.info("獲取cpu負(fù)載失敗"+e.getMessage()); return new BigDecimal("-1"); } } usage = usage.divide(new BigDecimal(list.size()),2,BigDecimal.ROUND_HALF_UP); return usage; } /** * 獲取cpu使用率 * @return */ public BigDecimal getCpu() { BigDecimal totalSize; ResponseEvent responseEvent = snmpGet(SnmpConfig.SNMPWALK_SSCPUIDLE); if(responseEvent!=null&&responseEvent.getResponse()!=null){ totalSize=new BigDecimal(responseEvent.getResponse().toString().split("=")[4].split("]")[0].trim()); }else { return new BigDecimal("-1"); } return new BigDecimal("100").subtract(totalSize); } /** * 獲取磁盤占用率 * @return */ public BigDecimal getDiskUsageForWindows() { BigDecimal multiply=new BigDecimal("-1"); try { BigDecimal diskSize = getDiskSize(); BigDecimal diskUsed = getDiskUsed(); if (BigDecimal.ZERO.compareTo(diskSize)<0&&BigDecimal.ZERO.compareTo(diskUsed)<0){ multiply = getDiskUsed().divide(getDiskSize(), 3, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); } }catch (Exception e){ logger.info("獲取windows磁盤占用異常"+e.getMessage()); } return multiply; } /** * 獲取磁盤占用率 * @return */ public BigDecimal getDiskUsage() { BigDecimal totalSize=null; //org.snmp4j.util.TableEvent[index=null,vbs=null,status=-1,exception=null,report=null] List<TableEvent> tableEvents = snmpWalk(SnmpConfig.SNMPWALK_DSKPERCENT); if(tableEvents.isEmpty()){ totalSize = getDiskUsageForWindows(); return totalSize; } for(int i=0;i<tableEvents.size();i++){ if ("-1,exception".equals(tableEvents.get(i).toString().split("=")[3].split("]")[0].trim())){ return new BigDecimal("-1"); } String s=tableEvents.get(i).toString().split("=")[3].split("]")[0].trim(); if (!"-4,exception".equals(s)){ totalSize= new BigDecimal(tableEvents.get(i).toString().split("=")[3].split("]")[0].trim()); }else { return new BigDecimal("-1"); } } return totalSize; } /** * 獲取內(nèi)存使用率 * @return */ public BigDecimal getMemoryUsage(){ BigDecimal usage; BigDecimal totalSize; try { ResponseEvent event = snmpGet(SnmpConfig.SNMPGET_HRMEMORYSIZE); if (event != null && event.getResponse() != null) { totalSize = new BigDecimal(event.getResponse().toString().split("=")[4].split("]")[0].trim()); usage = getMemoryUsed(); return usage.multiply(new BigDecimal("100")).divide(totalSize, 0, BigDecimal.ROUND_HALF_UP); } else { return new BigDecimal("-1"); } }catch (Exception e){ logger.info("獲取內(nèi)存使用率失敗"+e.getMessage()); return new BigDecimal("-1"); } } /** * 獲取內(nèi)存已使用 * @return */ public BigDecimal getMemoryUsed(){ List<TableEvent> list=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEDESCR); int index=0; BigDecimal usedMemory=new BigDecimal("0"); for(int i=0;i<list.size();i++){ String trim = list.get(i).toString().split("=")[3].split("]")[0].trim(); if(trim.contains("Physical memory")){ //linux系統(tǒng) index=i; List<TableEvent> usedList=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED); usedMemory= new BigDecimal(usedList.get(index).toString().split("=")[3].split("]")[0].trim()); }else if (trim.contains("Physical Memory")){ //windows系統(tǒng) List<TableEvent> list1=snmpWalk(SnmpConfig.SNMPWALK_MEMORY_WIN); BigDecimal re=new BigDecimal("0"); for (int j=0;j<list1.size();j++){ String trim1 = list1.get(j).toString().split("=")[3].split("]")[0].trim(); BigDecimal b = new BigDecimal(trim1); re=re.add(b); } return re; }else if(trim.contains("Memory buffers")){ //linux系統(tǒng) index=i; List<TableEvent> usedList=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED); usedMemory= usedMemory.subtract(new BigDecimal(usedList.get(index).toString().split("=")[3].split("]")[0].trim())); }else if(trim.contains("Cached memory")){ //linux系統(tǒng) index=i; List<TableEvent> usedList=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED); usedMemory= usedMemory.subtract(new BigDecimal(usedList.get(index).toString().split("=")[3].split("]")[0].trim())); } } return usedMemory; } /** * 獲取磁盤 * @return */ public BigDecimal getDiskSize(){ List<TableEvent> list=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEDESCR); BigDecimal diskSize=new BigDecimal(-1); if (!list.isEmpty()){ diskSize=new BigDecimal("0"); List<TableEvent> usedList1=snmpWalk(SnmpConfig.SNMPWALK_AHU); List<TableEvent> usedList2=snmpWalk(SnmpConfig.SNMPWALK_AUR); for(int i=0;i<list.size();i++){ boolean re=list.get(i).toString().split("=")[3].split("]")[0].trim().contains(":")||list.get(i).toString().split("=")[3].split("]")[0].trim().contains("/"); if(re){ diskSize=diskSize.add(new BigDecimal(usedList1.get(i).toString().split("=")[3].split("]")[0].trim()).multiply(new BigDecimal(usedList2.get(i).toString().split("=")[3].split("]")[0].trim())).divide(new BigDecimal("1073741824"),2,BigDecimal.ROUND_HALF_UP)); } } } return diskSize; } /** * 獲取磁盤已使用 * @return */ public BigDecimal getDiskUsed(){ List<TableEvent> list=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEDESCR); BigDecimal diskSize=new BigDecimal(-1); if (!list.isEmpty()){ diskSize=new BigDecimal("0"); List<TableEvent> usedList1=snmpWalk(SnmpConfig.SNMPWALK_AHU); List<TableEvent> usedList2=snmpWalk(SnmpConfig.SNMPWALK_HRSTORAGEUSED); for(int i=0;i<list.size();i++){ boolean re=list.get(i).toString().split("=")[3].split("]")[0].trim().contains(":")||list.get(i).toString().split("=")[3].split("]")[0].trim().contains("/"); if(re){ diskSize=diskSize.add(new BigDecimal(usedList1.get(i).toString().split("=")[3].split("]")[0].trim()).multiply(new BigDecimal(usedList2.get(i).toString().split("=")[3].split("]")[0].trim())).divide(new BigDecimal("1073741824"),2,BigDecimal.ROUND_HALF_UP)); } } } return diskSize; } /** * 獲取IO負(fù)載 * @return */ public Float getIOUsage(){ ResponseEvent event=snmpGet(SnmpConfig.SNMPGET_IOLOAD); if(event!=null&&event.getResponse()!=null){ float usage=Float.parseFloat(event.getResponse().toString().split("=")[4].split("]")[0].trim()); if(usage>1){ return usage; }else{ return usage*100; } } return null; } /** * 獲取性某性能參數(shù)數(shù)據(jù) * @param parameterId * @return */ public Object getData(Integer parameterId) { Object data=null; try{ if(parameterId.equals(SnmpConfig.PERFORMANCE_PARAM_CPUUSAGE)){ data=getCpuUsage(); }else if(parameterId.equals(SnmpConfig.PERFORMANCE_PARAM_MEMORYUSAGE)){ data=getMemoryUsage(); }else if(parameterId.equals(SnmpConfig.PERFORMANCE_PARAM_IOUSAGE)){ data=getIOUsage(); } }catch(Exception e){ logger.info("獲取性能參數(shù)異常"+e.getMessage()); } return data; } /** * 獲取設(shè)備物理地址 * @return */ public String getMacAddress(){ try { List<TableEvent> list = snmpWalk(SnmpConfig.SNMPWALK_IFDESCR); int index = 0; for (int i = 0; i < list.size(); i++) { if (list.get(i).toString().split("=")[3].split("]")[0].trim().contains("eth")) { index = i; } } List<TableEvent> ifAddressList = snmpWalk(SnmpConfig.SNMPWALK_IFPHYSADDRESS); return ifAddressList.get(index).toString().split("=")[3].split("]")[0].trim(); }catch (Exception e){ logger.info("獲取物理地址失敗"+e.getMessage()); return "failure"; } } /** * 獲取設(shè)備內(nèi)存大小 單位為GB * @return */ public String getMemoryDesc() { ResponseEvent event =snmpGet(SnmpConfig.SNMPGET_HRMEMORYSIZE); Long bytes =Long.parseLong(event==null?"0":event.getResponse().toString().split("=")[4].split("]")[0].trim()); float gb =bytes/1024.0f/1024.0f; DecimalFormat decimalFormat =new DecimalFormat(".00"); return decimalFormat.format(gb)+"GB"; } /** * @throws IOException * 獲取cpu描述信息 * @return */ public String getCpuDesc() throws IOException { ResponseEvent event=snmpGet(SnmpConfig.SNMPGET_CPUDESC); return event==null? "":event.getResponse().toString().split("=")[4].split("]")[0].trim().split(":")[1].trim(); } /** * 獲取存儲(chǔ)設(shè)備大小 (空盤空間不足百分百) * @param deviceCode * @return */ public BigDecimal getDiskSize(String deviceCode){ List<TableEvent> list = snmpWalk(SnmpConfig.SNMPGET_DSKTOTAL); BigDecimal diskSize=new BigDecimal(-1); if (list!=null){ try { for (TableEvent tableEvent:list){ diskSize=new BigDecimal(tableEvent.toString().split("=")[3].split("]")[0].trim()).divide(SnmpConfig.DEVIDE_NUM).divide(SnmpConfig.DEVIDE_NUM,2,RoundingMode.HALF_UP); } }catch (Exception e){ logger.info("獲取磁盤大小失敗"+e.getMessage()); } } if (BigDecimal.ZERO.compareTo(diskSize)>0){ diskSize = getDiskSize(); } return diskSize; } /** * 獲取磁盤描述 * @param deviceCode * @return * @throws IOException */ public BigDecimal getDiskDesc(String deviceCode) { return getDiskSize(deviceCode).divide(SnmpConfig.DEVIDE_NUM,2,RoundingMode.HALF_UP).divide(SnmpConfig.DEVIDE_NUM,2,RoundingMode.HALF_UP); } /** * snmp協(xié)議檢測(cè) */ public boolean snmpCheck() { ResponseEvent re=snmpGet(".1.3.6.1.4.1.2021.255.1"); return re == null || re.getResponse() != null; } /** * 獲取機(jī)器名 * @return */ public String getSysName(){ String name=null; try{ List<TableEvent> list = snmpWalk(SnmpConfig.SNMPWALK_SYSNAME); if (list!=null){ for (TableEvent tableEvent:list){ name=(tableEvent.toString().split("=")[3].split("]")[0].trim()); } } }catch (Exception e){ logger.info("獲取機(jī)器名失敗"+e.getMessage()); } return name; } /** * 獲取內(nèi)存總大小(實(shí)際值) * @return */ public BigDecimal getMemoryTotalSize(){ try { ResponseEvent event = snmpGet(SnmpConfig.GET_MEMORY); if (event!=null&&event.getResponse()!=null){ String trim = event.getResponse().toString().split("=")[4].split("]")[0].trim(); return new BigDecimal(trim).divide(SnmpConfig.DEVIDE_NUM,2, RoundingMode.HALF_UP).divide(SnmpConfig.DEVIDE_NUM,2, RoundingMode.HALF_UP); }else { throw new RuntimeException("獲取內(nèi)存信息失敗"); } } catch (Exception e) { logger.info("獲取內(nèi)存總大小失敗"+e.getMessage()); } return new BigDecimal("-1"); } /** * 獲取系統(tǒng)描述 * @return */ public String getSysDsc(){ try { ResponseEvent event = snmpGet(SnmpConfig.SYS_DSC); if (event!=null&&event.getResponse()!=null){ return event.getResponse().toString().split("=")[4].split("]")[0].trim(); }else { throw new RuntimeException("獲取系統(tǒng)描述信息失敗"); } } catch (Exception e) { logger.info("獲取系統(tǒng)描述信息失敗"+e.getMessage()); } return "failure"; } /** * 獲取接口數(shù) * @return */ public Integer getIfNumber(){ try { ResponseEvent event = snmpGet(SnmpConfig.IF_NUM); if (event!=null&&event.getResponse()!=null){ String trim = event.getResponse().toString().split("=")[4].split("]")[0].trim(); return Integer.parseInt(trim); }else { throw new RuntimeException("獲取接口信息失敗"); } } catch (Exception e) { logger.info("獲取接口數(shù)量失敗"+e.getMessage()); } return -1; } /** * 獲取cpu核數(shù)(n個(gè)cpu有n條數(shù)據(jù)) * @return */ public Integer getCpuNum(){ List<TableEvent> list = snmpWalk(SnmpConfig.CPU_NUM); Integer num=-1; if (list!=null){ num=list.size(); } return num; } public static void main(String[] args) throws IOException { String snmpIp = "127.0.0.1"; Integer snmpPort = 161; SnmpUtil snmpUtil = new SnmpUtil(snmpIp, snmpPort); System.out.println("機(jī)器名稱"+snmpUtil.getSysName()); System.out.println("磁盤大小 "+ snmpUtil.getDiskSize("devide")); System.out.println("物理地址"+snmpUtil.getMacAddress()); System.out.println("cpu "+snmpUtil.getCpuUsage()); } }
到此這篇關(guān)于Java使用snmp協(xié)議實(shí)現(xiàn)采集服務(wù)器信息的文章就介紹到這了,更多相關(guān)Java snmp采集服務(wù)器信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring?IOC容器的Bean管理XML自動(dòng)裝配過(guò)程
這篇文章主要為大家介紹了spring?IOC容器Bean管理基于XML的自動(dòng)裝配過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05java synchronized加載加鎖-線程可重入詳解及實(shí)例代碼
這篇文章主要介紹了java synchronized加載加鎖-線程可重入詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-02-02Java實(shí)現(xiàn)在正則表達(dá)式中控制大小寫的方法
這篇文章主要介紹了Java實(shí)現(xiàn)在正則表達(dá)式中控制大小寫的方法,結(jié)合實(shí)例形式分析了java正則表達(dá)式中傳遞控制參數(shù)的功能與相關(guān)操作技巧,需要的朋友可以參考下2017-04-04spring boot 下對(duì)JSON返回值去除null和空字段操作
這篇文章主要介紹了spring boot 下對(duì)JSON返回值去除null和空字段操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒ń榻B
這篇文章主要給大家介紹了關(guān)于feign服務(wù)端發(fā)現(xiàn)異??蛻舳颂幚淼姆椒?,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用feign具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07springboot實(shí)現(xiàn)瀏覽器截屏并添加文字
大家好,本篇文章主要講的是springboot實(shí)現(xiàn)瀏覽器截屏并添加文字,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02