系统环境:win10
注:win10及以下windows平台,在控制面板,程序中,添加snmp服务功能。
可参照:https://jingyan.baidu.com/article/3d69c5515e56b3f0cf02d7bf.html
为方便测试snmp协议,先关闭系统防火墙,后续可根据需要进行防护墙配置。
工具资源下载:https://download.csdn.net/download/csdnyang338/72113747
Snmp服务环境配置:
第一步:在系统设置中,搜索“开发者设置”,勾选开发人员模式
第二步:在系统设置中,搜索“应用和功能”,点击“管理可选功能”
第三步:在添加功能中选择snmp协议,点击安装
第四步:在服务中,找到启动snmp服务,右键,选择属性,在“安全”中添加社区名称:public,重启snmp服务。
Java代码:
添加jar包依赖:
snmp4j
测试代码:
package com.example.snmp;
import org.snmp4j.Snmp;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import java.io.IOException;
import java.util.List;
public class SnmpDemoTest {
public static void main(String[] args) {
SNMPTool SnmpTool = new SNMPTool();
//实例化实体snmp类
SnmpBean snmpBean = new SnmpBean();
snmpBean.setLocalIp("127.0.0.1");
snmpBean.setCommunityName("public");
snmpBean.setHostIp("127.0.0.1");
snmpBean.setPort(161);
snmpBean.setVersion(1);
//测试联通性
try {
//是否连接
System.out.println("连接成功:" + SnmpTool.isEthernetConnection(snmpBean));
} catch (IOException e) {
e.printStackTrace();
}
//获取cpu利用率
List
double sum = 0;
for (String s : result) {
sum += Double.parseDouble(s);
}
int cpu = (int) (sum / result.size());
System.out.println("cpu利用率:"+cpu+"%");
//get方式获取系统内存
try {
Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
snmp.listen();
String strMemory = SnmpTool.sendRequestGet(snmp,".1.3.6.1.2.1.25.2.2.0",snmpBean);
System.out.println("系统内存:"+Math.ceil(Double.parseDouble(strMemory)/1024/1024)+"G");
} catch (IOException e) {
e.printStackTrace();
}
}
}
实体类:
public class SnmpBean {
//分区域,即密码,默认是public
private String communityName;
//服务器ip地址
private String hostIp;
//本机ip地址
private String localIp;
//snmp访问端口号
private Integer port;
//版本
private int version;
//是否同步查询
private int async;
//自行添加set、get
}
Snmp测试工具
package com.example.snmp;
import com.sun.jmx.snmp.internal.SnmpModel;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
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.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
public class SNMPTool {
//获取列表oid数据
public List
Snmp snmp = null;
PDU pdu;
CommunityTarget target;
List
String communityName = snmpBean.getCommunityName();
String hostIp = snmpBean.getHostIp();
int port = snmpBean.getPort();
int version = snmpBean.getVersion();
try {
DefaultUdpTransportMapping dm = new DefaultUdpTransportMapping();
dm.setSocketTimeout(5000);
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);
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);
for(TableEvent e : list){
VariableBinding[] vb = e.getColumns();
if(null == vb)continue;
result.add(vb[0].getVariable().toString());
}
snmp.close();
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(snmp != null)
{
snmp.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
//发送snmp查询请求
public static String sendRequestGet(Snmp snmp, String oid, SnmpBean snmpBean)
throws IOException {
String str=null;
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString(snmpBean.getCommunityName()));
target.setVersion(snmpBean.getVersion());
target.setAddress(new UdpAddress(snmpBean.getHostIp()+"/"+snmpBean.getPort()));
target.setTimeout(5000);
target.setRetries(1);
PDU pdu = new PDU();
pdu.setType(PDU.GET);
pdu.add(new VariableBinding(new OID(oid)));
ResponseEvent responseEvent = snmp.send(pdu, target);
PDU response = responseEvent.getResponse();
if (response == null) {
System.out.println("TimeOut...");//可能原因,1:snmp服务未开启。2:Community未配置
} else {
if (response.getErrorStatus() == PDU.noError) {
Vector extends VariableBinding> vbs = response.getVariableBindings();
for (VariableBinding vb : vbs) {
System.out.println(vb + " ," + vb.getVariable().getSyntaxString());
str = vb.getVariable().toString();
}
} else {
System.out.println("Error:" + response.getErrorStatusText());
}
}
return str;
}
//测试网络是否畅通,类似ping
public boolean isEthernetConnection(SnmpBean bean) throws IOException {
InetAddress ad = InetAddress.getByName(bean.getHostIp());
boolean state = ad.isReachable(2000);// 测试是否可以达到该地址 2秒超时
return state;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)