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