SNMP4j之基础介绍
blog迁移至:http://www.micmiu.com
官网:http://www.snmp4j.org/
SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似。
snmp4j包,比较重要是三个类:Target、PDU、Snmp
[一]Target,表示被管理的设备
对于一个被管理的设备,它有以下一些属性:Address、协议版本version、community、访问它的用户名和密码、超时时间、重传次数等等。有如下方法:
(1)获取或者设置ip地址
void setAddress(Address address)
Address getAddress()
(2)设置或者获取版本号(支持V1,V2c,V3)
void setVersion(int ver)
int getVersion()
(3)超时时间 ( 单位:milliseconds )
void setTimeout(long out)
long getTimeout()
(4)重传次数
void setRetries(int retries)
int getRetries()
(5)最大PDU大小值
void setMaxSizeRequestPDU(int max)
int getMaxSizeRequestPDU()
[1.] 上面这些对于Snmp三个版本都是相同的,不同的只是在于安全方面,具体来说,Snmpv1,v2c采用共同体(community)方式,安全性很差;SnmpV3采用基于用户的安全(USM)方式,安全性能得到很大提高。
[2.] 对于Snmpv1,v2c,使用Target派生出一个子类CommunityTarget,增加了对Community的方法:
void setCommunity(OctetString community)
OctetString getCommunity()
[3.] 对于SnmpV3,使用其子类UserTarget,增加了一些有关USM安全方面的设置,比如采用的安全模型、安全级别、访问该设备的用户名以及权威引擎ID(authoritative engine ID):
1)安全级别(支持三种安全级别)
void setSecurityLevel(int level)
int getSecurityLevel()
2)访问用户名(该访问用户名称必须在设置USM的时候添加其相应的UsmUser)
void setSecurityName(OctetString name)
OctetString getSecurityName()
3)安全模型(支持三种安全模型)
void setSecurityModel(int model)
int getSecurityModel()
4)权威引擎ID(authoritative engine ID)
void setAuthoritativeEngineID(byte[] id)
byte[] getAuthoritativeEngineID()
[4.]对于Target的代码示例:
Community Target
CommunityTarget target = new CommunityTarget();target.setCommunity(new OctetString("public"));target.setAddress(targetAddress);target.setVersion(SnmpConstants.version1);UserTarget target = new UserTarget();target.setAddress(targetAddress);target.setRetries(1);// set timeout to 500 milliseconds -> 2*500ms = 1s total timeouttarget.setTimeout(500);target.setVersion(SnmpConstants.version3);target.setSecurityLevel(SecurityLevel.AUTH_PRIV);target.setSecurityName(new OctetString("MD5DES"));PDU pdu = new PDU();pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.1"))); // sysDescrpdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.1"))); // ifNumberpdu.setType(PDU.GETNEXT);ScopedPDU pdu = new ScopedPDU();pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.1"))); // ifNumberpdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.10"))); // ifInOctetspdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.16"))); // ifOutOctetspdu.setType(PDU.GETBULK);pdu.setMaxRepetitions(50);// Get ifNumber only oncepdu.setNonRepeaters(1);// set context non-default context (default context does not need to be set)pdu.setContextName(new OctetString("subSystemContextA"));// set non-default context engine ID (to use targets authoritative engine ID// use an empty (size == 0) octet string)pdu.setContextEngineID(OctetString.fromHexString("80:00:13:70:c0:a8:01:0d"));PDUv1 pdu = new PDUv1();pdu.setType(PDU.V1TRAP);pdu.setGenericTrap(PDUv1.COLDSTART);
ScopedPDU pdu = new ScopedPDU();pdu.setType(PDU.INFORM);// sysUpTimelong sysUpTime = (System.currentTimeMillis() - startTime) / 10;pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTime)));pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, SnmpConstants.linkDown));// payloadpdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.1"+downIndex), new Integer32(downIndex)));