基本介绍
SNMP4J是一个用Java来实现SNMP(简单网络管理协议)协议的开源项目.它支持以命令行的形式进行管理与响应。SNMP4J是纯面向对象设计与SNMP++(用C++实现SNMPv1/v2c/v3)相类似。
SNMP4J API 提供以下下特性:
- 支持MD5和SHA验证,DES,3DES,AES128、AES192和AES256加密的SNMPv3。
- 支持MPv1,MPv2C和MPv3,带执行的可阻塞的信息处理模块。
- 全部PDU格式。
- 可阻塞的传输拓扑。支持UPD、TCP、TLS 。
- 可阻塞的超时模块。
- 同步和异步请求。
- 命令发生器以及命令应答器的支持。
- 基于Apache license的开源免费。
- JAVA 1.4.1或更高版本(2.0或更高版本需要jdk1.6及以上的支持)。
- 基于LOG4J记录日志。
- 使用GETBULK实现Row-based的有效的异步表格获取。
- 支持多线程。
官网:http://www.snmp4j.org/
SNMP4J Maven repository:https://server.oosnmp.net/dist/
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
1 | CommunityTarget target = new CommunityTarget(); |
2 | target.setCommunity( new OctetString( "public" )); |
3 | target.setAddress(targetAddress); |
4 | target.setVersion(SnmpConstants.version1); |
User Target
1 | UserTarget target = new UserTarget(); |
2 | target.setAddress(targetAddress); |
4 | // set timeout to 500 milliseconds -> 2*500ms = 1s total timeout |
6 | target.setVersion(SnmpConstants.version3); |
7 | target.setSecurityLevel(SecurityLevel.AUTH_PRIV); |
8 | target.setSecurityName( new OctetString( "MD5DES" )); |
[二]PDU 协议数据单元
- PDU(协议数据单元),用来表示管理站跟代理站点进行通信的数据。包括PDU的类型、传输的数据集合、错误说明等。
- 除Snmpv1 Trap外,其他操作类型的PDU大致相同。
- Snmp4j针对Snmp的各个版本,开发了三个有关PDU的类。PDU(针对Snmpv2c)、PDUv1(针对Snmpv1)、ScopedPDU(针对Snmpv3),但三个类除各自特别的一些参数外,都基本相同。所以Snmp4j在设计的时候,将PDU设计成另外两个的超类,使他们能够共享大部分功能。
[1] PDU基本介绍
1)pdu类型(Snmpv1支持5种,get、set、getnext、trap、getresponse,Snmpv2c增加了getbulk、inform)
int getType()
void setType(int type)
2)错误(主要有6种错误,请参见RFC)
void setErrorStatus(int status)
int getErrorStatus()
String getErrorStatusText()
void setErrorIndex(int index)
int getErrorindex()
3)变量
void add(VariableBinding vb) // 对于除get、getnext、getbulk外
void addAll(VariableBinding[] vbs) // 对于除get、getnext、getbulk外的
void addOID(VariableBinding vb) // 对于get、getnext、getbulk
void addAllOID(VariableBinding[] vbs) // 对于get、getnext、getbulk
VariableBinding get(int i)
VariableBinding[] toArray()
Vector getVariableBindings()
void set(int i,VariableBinding vb)
void remove(int i)
void clear()
int size()
[2.] PDUv1
PDUv1继承了PDU,除Snmp v1 trap操作外 ,其它都跟PDU相同。因为Snmp v1的Trap设计PDU不同于其他操作的PDU,它包括:对象标识符(OID)、代理ip地址(agent-addr)、时间戳(time-stamp)、通用代理类型(generic-trap)、特定代理类型(specific-trap)。所以相应的增加了对这些字段的get/set操作。具体参见API文档。
[3.] ScopedPDU
SnmpV3采用了不同安全策略,它的PDU也增加了有关安全方面的几个字段:上下文名称(ContextName)、上下文引擎ID(contextEngineID)等,其它PDU字段属于USM来管理。
所以ScopedPDU在PDU的基础上增加了相应的get/set操作。参见API。
[4.]代码示例:
SNMPv1/v2c GETNEXT PDU
2 | pdu.add( new VariableBinding( new OID( "1.3.6.1.2.1.1.1" ))); // sysDescr |
3 | pdu.add( new VariableBinding( new OID( "1.3.6.1.2.1.2.1" ))); // ifNumber |
4 | pdu.setType(PDU.GETNEXT); |
SNMPv3 GETBULK PDU
1 | ScopedPDU pdu = new ScopedPDU(); |
2 | pdu.add( new VariableBinding( new OID( "1.3.6.1.2.1.2.1" ))); // ifNumber |
3 | pdu.add( new VariableBinding( new OID( "1.3.6.1.2.1.2.2.1.10" ))); // ifInOctets |
4 | pdu.add( new VariableBinding( new OID( "1.3.6.1.2.1.2.2.1.16" ))); // ifOutOctets |
5 | pdu.setType(PDU.GETBULK); |
6 | pdu.setMaxRepetitions( 50 ); |
7 | // Get ifNumber only once |
9 | // set context non-default context (default context does not need to be set) |
10 | pdu.setContextName( new OctetString( "subSystemContextA" )); |
11 | // set non-default context engine ID (to use targets authoritative engine ID |
12 | // use an empty (size == 0) octet string) |
13 | pdu.setContextEngineID(OctetString.fromHexString( "80:00:13:70:c0:a8:01:0d" )); |
SNMPv1 TRAP PDU
1 | PDUv1 pdu = new PDUv1(); |
2 | pdu.setType(PDU.V1TRAP); |
3 | pdu.setGenericTrap(PDUv1.COLDSTART); |
SNMPv2c/SNMPv3 INFORM PDU
1 | ScopedPDU pdu = new ScopedPDU(); |
2 | pdu.setType(PDU.INFORM); |
4 | long sysUpTime = (System.currentTimeMillis() - startTime) / 10 ; |
5 | pdu.add( new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTime))); |
6 | pdu.add( new VariableBinding(SnmpConstants.snmpTrapOID, SnmpConstants.linkDown)); |
8 | pdu.add( new VariableBinding( new OID( "1.3.6.1.2.1.2.2.1.1" +downIndex), |
9 | new Integer32(downIndex))); |
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。