天天看點

Snmp4j程式設計簡介之二:PDU

Snmp4j程式設計簡介之二: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。

示例代碼如下:(摘自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)));

...