snmp监控window

  • SNMP协议

    snmp协议是一个cs结构的服务,在被监控的部分安装个server,在获取数据的部分作client。snmp包括Get、Set以及Trap三种基本的方式,get是取数据、set是设置、trap是trap server预设的事件被发生时进行通知,所以需要设个接收IP地址。

    snmp有三个版本v1、v2c、v3,v1较简单、v2c较常用、v3增加的安全性主要是认证和加密传输

    oid是协议中数据的唯一标识。所有数据的存取都靠OID。获取OID不难,只要通过GetNext方法能够获取所有的server端支持的OID,但其数据类型、数据含义要靠MIB文件来说明。所以获取MIB文件很重要,可是像华为的MIB是保密的。

  • window 

    window server 2003、window xp 都支持snmp2c、但未支持v3。server部分的配置启动参见http://support.microsoft.com/kb/324263

    window的oid主要是在

1.3.6.1.2.1.1  基本部分

1.3.6.1.2.1.25 (iso.org.dod.internet.mgmt.mib-2.host)主机部分

1.3.6.1.2.1.2  网络部分

建议装个OidView,看一下。(注意只有7天的试用期)

  • snmp4j编码

开源包snmp4j可用于编码,给v2c例子的。该例子需要类库SNMP4j.jar、log4j-xxx.jar

public class SNMPClient { private Snmp snmp = null; private Address targetAddress = null; public void initComm() throws IOException { // 设置Agent方的IP和端口 targetAddress = GenericAddress.parse("udp:192.168.2.232/161"); TransportMapping transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); transport.listen(); } public ResponseEvent sendPDU(PDU pdu) 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); // 向Agent发送PDU,并返回Response return snmp.send(pdu, target); } public void setPDU() throws IOException { // set PDU PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(new int[] { 1, 3, 6, 1, 2, 1, 1, 7, 0 }), new OctetString("8899"))); pdu.setType(PDU.SET); sendPDU(pdu); } public void getPDU() throws IOException { // get PDU PDU pdu = new PDU(); pdu.setType(PDU.GET); // 1.3.6.1.2.1.25.2.2.0 物理内存 pdu.setMaxRepetitions(5); pdu.setNonRepeaters(0); pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.9.65539")));// pcName readResponse(sendPDU(pdu)); } public void readResponse(ResponseEvent respEvnt) { // 解析Response System.out.println("----------解析Response-------------"); if (respEvnt != null && respEvnt.getResponse() != null) { Vector<VariableBinding> recVBs = respEvnt.getResponse() .getVariableBindings(); for (int i = 0; i < recVBs.size(); i++) { VariableBinding recVB = recVBs.elementAt(i); String out=recVB.getOid() + " "+recVB.getVariable().getSyntaxString()+" "; switch (recVB.getSyntax()) { //case SMIConstants.EXCEPTION_END_OF_MIB_VIEW: //case SMIConstants.EXCEPTION_NO_SUCH_INSTANCE: //case SMIConstants.EXCEPTION_NO_SUCH_OBJECT: case SMIConstants.SYNTAX_COUNTER32: out = recVB.getOid() + " COUNTER32 " + recVB.getVariable(); break; case SMIConstants.SYNTAX_COUNTER64: out = recVB.getOid() + " COUNTER64 " + recVB.getVariable(); break; case SMIConstants.SYNTAX_GAUGE32: //case SMIConstants.SYNTAX_UNSIGNED_INTEGER32: out = recVB.getOid() + " GAUGE32 " + recVB.getVariable(); break; case SMIConstants.SYNTAX_INTEGER: //case SMIConstants.SYNTAX_INTEGER32: out = recVB.getOid() + " INTEGER " + recVB.getVariable(); break; case SMIConstants.SYNTAX_IPADDRESS: out = recVB.getOid() + " IPADDRESS " + recVB.getVariable(); break; //case SMIConstants.SYNTAX_NULL: //case SMIConstants.SYNTAX_OBJECT_IDENTIFIER: case SMIConstants.SYNTAX_OCTET_STRING: //case SMIConstants.SYNTAX_BITS: String tmp = recVB.getVariable().toString(); if (tmp.length() >2 && tmp.charAt(2)==':'){ //out += OctetString.fromHexString(tmp).toASCII(' ').trim(); out += tmp; }else out += tmp; break; case SMIConstants.SYNTAX_OPAQUE: out = recVB.getOid() + " OPAQUE " + recVB.getVariable(); break; case SMIConstants.SYNTAX_TIMETICKS: out = recVB.getOid() + " TIMETICKS " + ((TimeTicks)recVB.getVariable()).toMilliseconds(); break; default: out += recVB.getVariable(); } System.out.println(out); } } } public static void main(String[] args) { System.out.println("----------start-------------"); try { SNMPClient util = new SNMPClient(); util.initComm(); // util.setPDU(); util.getPDU(); } catch (IOException e) { e.printStackTrace(); } } /** * 从Octet string到Date String * @param d * @return */ public static String toDate(String d){ String[] ss = d.split(":"); if (ss.length==8){ int year = Integer.parseInt(ss[0]+ss[1], 16); int month = Integer.parseInt(ss[2], 16); int day = Integer.parseInt(ss[3], 16); int hour = Integer.parseInt(ss[4], 16); int minute = Integer.parseInt(ss[5], 16); int second = Integer.parseInt(ss[6], 16); //int minsecond = Integer.parseInt(ss[7], 16); Formatter formatter = new Formatter(); return formatter.format("%1$4d-%2$02d-%3$02d %4$02d:%5$02d:%6$02d", new Integer[]{year,month,day,hour,minute,second}).toString() ; }else{ return ""; } } }

 

 

你可能感兴趣的:(Date,String,server,object,null,Integer)