天天看點

SNMP4j之基礎介紹

[color=red]blog遷移至[/color]:[url=http://www.micmiu.com]http://www.micmiu.com[/url]

官網:[url=http://www.snmp4j.org/]http://www.snmp4j.org/[/url]

SNMP4J是一個用Java來實作SNMP(簡單網絡管理協定)協定的開源項目.它支援以指令行的形式進行管理與響應。SNMP4J是純面向對象設計與SNMP++(用C++實作SNMPv1/v2c/v3)相類似。

[size=large]snmp4j包,比較重要是三個類:[color=red]Target、PDU、Snmp[/color][/size]

[size=large][color=blue][一]Target,表示被管理的裝置[/color][/size]

對于一個被管理的裝置,它有以下一些屬性: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()

[color=blue][4.]對于Target的代碼示例:[/color]

Community Target

CommunityTarget target = new CommunityTarget();
target.setCommunity(new OctetString("public"));
target.setAddress(targetAddress);
target.setVersion(SnmpConstants.version1);
           

User Target

UserTarget target = new UserTarget();
target.setAddress(targetAddress);
target.setRetries(1);
// set timeout to 500 milliseconds -> 2*500ms = 1s total timeout
target.setTimeout(500);
target.setVersion(SnmpConstants.version3);
target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
target.setSecurityName(new OctetString("MD5DES"));
           

[size=large][color=blue][二]PDU 協定資料單元[/color][/size]

[list]

[*] PDU(協定資料單元),用來表示管理站跟代理站點進行通信的資料。包括PDU的類型、傳輸的資料集合、錯誤說明等。

[*] 除Snmpv1 Trap外,其他操作類型的PDU大緻相同。

[*] Snmp4j針對Snmp的各個版本,開發了三個有關PDU的類。PDU(針對Snmpv2c)、PDUv1(針對Snmpv1)、ScopedPDU(針對Snmpv3),但三個類除各自特别的一些參數外,都基本相同。是以Snmp4j在設計的時候,将PDU設計成另外兩個的超類,使他們能夠共享大部分功能。[/list][color=blue]

[1] PDU基本介紹[/color]

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()

[color=blue][2.] PDUv1[/color]

PDUv1繼承了PDU,除Snmp v1 trap操作外 ,其它都跟PDU相同。因為Snmp v1的Trap設計PDU不同于其他操作的PDU,它包括:對象辨別符(OID)、代理ip位址(agent-addr)、時間戳(time-stamp)、通用代理類型(generic-trap)、特定代理類型(specific-trap)。是以相應的增加了對這些字段的get/set操作。具體參見API文檔。

[color=blue][3.] ScopedPDU[/color]

SnmpV3采用了不同安全政策,它的PDU也增加了有關安全方面的幾個字段:上下文名稱(ContextName)、上下文引擎ID(contextEngineID)等,其它PDU字段屬于USM來管理。

是以ScopedPDU在PDU的基礎上增加了相應的get/set操作。參見API。

[color=blue][4.]代碼示例:[/color]

SNMPv1/v2c GETNEXT PDU

PDU pdu = new PDU();
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.1"))); // sysDescr
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.1"))); // ifNumber
pdu.setType(PDU.GETNEXT);
           

SNMPv3 GETBULK PDU

ScopedPDU pdu = new ScopedPDU();
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.1"))); // ifNumber
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.10"))); // ifInOctets
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.16"))); // ifOutOctets
pdu.setType(PDU.GETBULK);
pdu.setMaxRepetitions(50);
// Get ifNumber only once
pdu.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"));           

SNMPv1 TRAP PDU

PDUv1 pdu = new PDUv1();
pdu.setType(PDU.V1TRAP);
pdu.setGenericTrap(PDUv1.COLDSTART);
           

SNMPv2c/SNMPv3 INFORM PDU

ScopedPDU pdu = new ScopedPDU();
pdu.setType(PDU.INFORM);
// sysUpTime
long sysUpTime = (System.currentTimeMillis() - startTime) / 10;
pdu.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTime)));
pdu.add(new VariableBinding(SnmpConstants.snmpTrapOID, SnmpConstants.linkDown));
// payload
pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.2.2.1.1"+downIndex),
                            new Integer32(downIndex)));
           

繼續閱讀