简单的可以看SNMP4j的说明文档,比如Package org.snmp4j的说明文档就详细说明了怎么使用,一般大致如下:
1、创建Target
User TargetUserTarget 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"));
    
2、创建PDU
SNMPv3 GETBULK PDUimport 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"));
...3、创建SNMP
import org.snmp4j.*;
import org.snmp4j.smi.*;
import org.snmp4j.mp.SnmpConstants;
...
TransportMapping transport =
    new DefaultUdpTransportMapping(new UdpAddress("0.0.0.0/161"));
Snmp snmp = new Snmp(transport);
if (version == SnmpConstants.version3) {
    byte[] localEngineID =
        ((MPv3)snmp.getMessageProcessingModel(MessageProcessingModel.MPv3)).createLocalEngineID();
    USM usm = new USM(SecurityProtocols.getInstance(),
                      new OctetString(localEngineID), 0);
    SecurityModels.getInstance().addSecurityModel(usm);
    snmp.getUSM().addUser(securityName, new UsmUser(securityName,
                                                    authProtocol,
                                                    authPassphrase,
                                                    privProtocol,
                                                    privPassphrase));4、利用snmp进行同步或者异步发送
  同步发送:
import org.snmp4j.*;
...
snmp.listen();ResponseEvent response = snmp.send(requestPDU, target);
if (response.getResponse() == null) {
    // request timed out
    ...
}
else {
    System.out.println("Received response from: "+
                       response.getPeerAddress());
    // dump response PDU
    System.out.println(response.getResponse().toString());
}snmp.close();  // 关闭把上面的代码组合起来基本上就可以了,如果要想复杂一点的代码,SNMP4J的源代码包中
org.snmp4j.tools.console包下的SnmpRequest.java就是一个很好的例子。

解决方案 »

  1.   

    UsmUser构造函数的参数怎么填?
      

  2.   

    构造Snmp v3版本的Snmp一般如下添加UsmUser:// 构造snmp
    Snmp snmp = new Snmp(new DefaultUdpTransportMapping());
    // 构造usm
    USM usm = new USM(SecurityProtocols.getInstance(),new OctetString(MPv3.createLocalEngineID()),0);
    // 添加usm
    SecurityModels.getInstance().addSecurityModel(usm);
    // 添加UsmUser
    snmp.getUSM().addUser(securityName, new UsmUser(securityName,
    authProtocol,
    authPassphrase,
    privProtocol,
                    privPassphrase));1)依据RFC3411,目前snmp4j(1.8.2)的SecurityModel大致有三种模式: SECURITY_MODEL_SNMPv1,SECURITY_MODEL_SNMPv2c,SECURITY_MODEL_USM.
    分别对应snmp4j所支持的三种snmp版本:v1,v2c,v3.
    在snmp4j包中,采用了单例模式来实现SecurityModel的管理,就是SecurityProtocols类,它内部维护一个大小为3的哈希表:
    private Hashtable securityModels = new Hashtable(3);
    用来管理三种安全模式.
    2)对于Snmp v3来讲,USM实现了SECURITY_MODEL_USM类型的SecurityModel,并且管理UsmUser.