SNMP:“简单网络管理协议”,用于网络管理的协议。SNMP用于网络设备的管理。SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了“读”操作;管理员需要向设备执行设置操作,所以SNMP提供了“写”操作;设备需要在重要状况改变的时候,向管理员通报事件的发生,所以SNMP提供了“Trap”操作。
OID(Object Identifier,对象标识符又称为物联网域名)是由ISO/IEC、ITU-T国际标准化组织上世纪80年代联合提出的标识机制,采用分层树形结构对任何类型的对象(包括实体对象、虚拟对象、复合对象等)进行全球无歧义、唯一命名。OID具有分层灵活、扩展性强、跨异构系统等优势,并可兼容现有标识机制,已经广泛应用于信息安全、医疗卫生、网络管理等领域。
如果在本机进行测试SNMP进程查询需要开启本机的SNMP服务,开启步骤:
通过snmp实现进程监控代码:
SNMP监控OID的WALK请求方式:
/**
*
*/
package com.hfvast.monitor.snmp;
import java.io.IOException;
import java.util.Vector;
import org.apache.log4j.Logger;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.Integer32;
import org.snmp4j.smi.Null;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
/**
* @author Administrator
*
*/
public class SnmpLocal {
private static Logger log = Logger.getLogger(SnmpLocal.class);
private Snmp snmp = null;
private Address targetAddress = null;
// 进程oid
private String oid = ".1.3.6.1.2.1.25.4.2.1.2";
// 进程路径oid
// private String oid = ".1.3.6.1.2.1.25.4.2.1.4";
public void initComm() throws IOException {
// 设置Agent方的IP和端口192.168.1.108
targetAddress = GenericAddress.parse("udp:127.0.0.1/161");
TransportMapping transport = new DefaultUdpTransportMapping();
transport.listen();
snmp = new Snmp(transport);
}
/**
* 获取walk类型的OID
*
* @throws IOException
*/
public void sendPDU_Process() throws IOException {
// 设置
CommunityTarget target = new CommunityTarget();
target.setAddress(targetAddress);
// 设置snmp的共同体
target.setCommunity(new OctetString("public"));
// 设置超时重连的次数
target.setRetries(2);
// 设置超时时间
target.setTimeout(100);
// 设置使用snmp的版本,有三个版本version1:0,version2c:1,version3:3
target.setVersion(SnmpConstants.version1);
// 创建PDU
PDU request = new PDU();
// 调用的add方法绑定要查询的OID
request.add(new VariableBinding(new OID(oid)));
request.setType(PDU.GET);
Vector<VariableBinding> vector = new Vector<>();
boolean finished = false;
while (!finished) {
ResponseEvent response = snmp.getNext(request, target);
PDU pduResponse = response.getResponse();
VariableBinding variableBinding = pduResponse.get(0);
// Variable variable = variableBinding.getVariable();
// checkMonitorNoSuchException(variable,deviceEntity);
// check finish
finished = checkWalkFinished(new OID(oid), request, variableBinding);
if (!finished) {
vector.add(variableBinding);
// Set up the variable binding for the next entry.
request.setRequestID(new Integer32(0));
request.set(0, variableBinding);
} else {
if (log.isDebugEnabled()) {
log.debug("SNMP walk OID has finished.");
}
}
}
for (VariableBinding variableBinding : vector) {
System.out.println(variableBinding.getSyntax());
System.out.println(variableBinding.getOid() + "----" + variableBinding.getVariable());
System.out.println(variableBinding.getBERLength());
}
}
public static boolean checkWalkFinished(OID targetOID, PDU pdu, VariableBinding vb) {
boolean finished = false;
if (pdu.getErrorStatus() != 0) {
log.debug("[true] responsePDU.getErrorStatus() != 0 ");
log.debug(pdu.getErrorStatusText());
finished = true;
} else if (vb.getOid() == null) {
log.debug("[true] vb.getOid() == null");
finished = true;
} else if (vb.getOid().size() < targetOID.size()) {
log.debug("[true] vb.getOid().size() < targetOID.size()");
finished = true;
} else if (targetOID.leftMostCompare(targetOID.size(), vb.getOid()) != 0) {
log.debug("[true] targetOID.leftMostCompare() != 0");
finished = true;
} else if (Null.isExceptionSyntax(vb.getVariable().getSyntax())) {
log.debug("[true] Null.isExceptionSyntax(vb.getVariable().getSyntax())");
finished = true;
} else if (vb.getOid().compareTo(targetOID) <= 0) {
log.debug("[true] Variable received is not lexicographic successor of requested " + "one:");
log.debug(vb.toString() + " <= " + targetOID);
finished = true;
}
return finished;
}
public static void main(String[] args) {
try {
SnmpLocal util = new SnmpLocal();
util.initComm();
// util.sendPDU();
util.sendPDU_Process();
} catch (IOException e) {
e.printStackTrace();
}
}
}
SNMP监控OID的GET请求方式:
/**
* 获取get类型的OID
*
* @throws IOException
*/
public void sendPDU() throws IOException {
// 设置 target
CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(targetAddress);
// 通信不成功时的重试次数
target.setRetries(2);
// 超时时间
target.setTimeout(1500);
target.setVersion(SnmpConstants.version1);
// 创建 PDU
PDU pdu = new PDU();
// windows基本信息
pdu.add(new VariableBinding(new OID(".1.3.6.1.2.1.1.1.0")));
// pdu.add(new VariableBinding(new OID(oid)));
// MIB的访问方式
pdu.setType(PDU.GETNEXT);
// 向Agent发送PDU,并接收Response
ResponseEvent respEvnt = snmp.send(pdu, target);
// 解析Response
if (respEvnt != null && respEvnt.getResponse() != null) {
Vector<? extends VariableBinding> recVBs = respEvnt.getResponse().getVariableBindings();
System.out.println("相应结果:" + recVBs);
for (int i = 0; i < recVBs.size(); i++) {
VariableBinding recVB = recVBs.elementAt(i);
System.out.println(recVB.getOid() + " ---> " + recVB.getVariable());
}
} else {
System.err.println("respEvnt为空");
}
}