通过SNMP实现进程监控及进程路径

    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为空");
		}

	}


猜你喜欢

转载自blog.csdn.net/qq_41307443/article/details/80913548