作者: ecsun  鏈接:http://papa.javaeye.com/blog/220536  發(fā)表時(shí)間: 2008年07月28日

聲明:本文系JavaEye網(wǎng)站發(fā)布的原創(chuàng)博客文章,未經(jīng)作者書(shū)面許可,嚴(yán)禁任何網(wǎng)站轉(zhuǎn)載本文,否則必將追究法律責(zé)任!

PDU(協(xié)議數(shù)據(jù)單元),用來(lái)表示管理站跟代理站點(diǎn)進(jìn)行通信的數(shù)據(jù)。包括PDU的類型、傳輸?shù)臄?shù)據(jù)集合、錯(cuò)誤說(shuō)明等。
    除Snmpv1 Trap外,其他操作類型的PDU大致相同。
    Snmp4j針對(duì)Snmp的各個(gè)版本,開(kāi)發(fā)了三個(gè)有關(guān)PDU的類。PDU(針對(duì)Snmpv2c)、PDUv1(針對(duì)Snmpv1)、ScopedPDU(針對(duì)Snmpv3),但三個(gè)類除各自特別的一些參數(shù)外,都基本相同。所以Snmp4j在設(shè)計(jì)的時(shí)候,將PDU設(shè)計(jì)成另外兩個(gè)的超類,使他們能夠共享大部分功能。

(1)PDU
    1)pdu類型(Snmpv1支持5種,get、set、getnext、trap、getresponse,Snmpv2c增加了getbulk、inform)
    int   getType()
    void   setType(int type)
   
    2)錯(cuò)誤(主要有6種錯(cuò)誤,請(qǐng)參見(jiàn)RFC)
    void   setErrorStatus(int   status)
    int   getErrorStatus()
    String    getErrorStatusText()
    void   setErrorIndex(int index)
    int   getErrorindex()

    3)變量
    void add(VariableBinding vb) // 對(duì)于除get、getnext、getbulk外
    void addAll(VariableBinding[] vbs) // 對(duì)于除get、getnext、getbulk外的
    void addOID(VariableBinding vb) // 對(duì)于get、getnext、getbulk
    void addAllOID(VariableBinding[] vbs) // 對(duì)于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相同。因?yàn)镾nmp v1的Trap設(shè)計(jì)PDU不同于其他操作的PDU,它包括:對(duì)象標(biāo)識(shí)符(OID)、代理ip地址(agent-addr)、時(shí)間戳(time-stamp)、通用代理類型(generic-trap)、特定代理類型(specific-trap)。所以相應(yīng)的增加了對(duì)這些字段的get/set操作。具體參見(jiàn)API文檔。

(3)ScopedPDU
    SnmpV3采用了不同安全策略,它的PDU也增加了有關(guān)安全方面的幾個(gè)字段:上下文名稱(ContextName)、上下文引擎ID(contextEngineID)等,其它PDU字段屬于USM來(lái)管理。
    所以ScopedPDU在PDU的基礎(chǔ)上增加了相應(yīng)的get/set操作。參見(jiàn)API。

示例代碼如下:(摘自API文檔)

SNMPv1/v2c GETNEXT PDU
import org.snmp4j.PDU;
import org.snmp4j.smi.*;
...
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
import org.snmp4j.ScopedPDU;
import org.snmp4j.smi.*;
...
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
import org.snmp4j.PDUv1;
...
PDUv1 pdu = new PDUv1();
pdu.setType(PDU.V1TRAP);
pdu.setGenericTrap(PDUv1.COLDSTART);
...SNMPv2c/SNMPv3 INFORM PDU
import org.snmp4j.ScopedPDU;
...
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)));

已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


JavaEye推薦