最近用到SNMP编程,下了个开源包snmp4j,目的是要获取路由器上的oid信息,路由器的snmp版本是v3,程序代码如下:
import java.io.IOException;
import java.net.BindException;
import java.util.Vector;import org.snmp4j.CommandResponder;
import org.snmp4j.CommandResponderEvent;
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.ScopedPDU;
import org.snmp4j.Snmp;
import org.snmp4j.TransportMapping;
import org.snmp4j.UserTarget;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.MPv3;
import org.snmp4j.mp.MessageProcessingModel;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.security.AuthMD5;
import org.snmp4j.security.PrivDES;
import org.snmp4j.security.SecurityLevel;
import org.snmp4j.security.SecurityModels;
import org.snmp4j.security.SecurityProtocols;
import org.snmp4j.security.USM;
import org.snmp4j.security.UsmUser;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.UdpAddress;
import org.snmp4j.smi.Variable;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;public class GetSnmpV3 { private Snmp snmp = null; private Address targetAddress = null;
UserTarget target = null;
TransportMapping transport = null;
public void initComm() throws IOException {
   targetAddress = GenericAddress.parse("udp:192.168.6.1/161");
   transport = new DefaultUdpTransportMapping();
   snmp = new Snmp(transport);
   USM usm = new USM(SecurityProtocols.getInstance(),
                     new OctetString(MPv3.createLocalEngineID()), 0);
   SecurityModels.getInstance().addSecurityModel(usm);
   transport.listen();    snmp.getUSM().addUser(new OctetString("MD5DES"),
                   new UsmUser(new OctetString("MD5DES"),
                               AuthMD5.ID,
                               new OctetString("MD5DESUserAuthPassword"),
                               PrivDES.ID,
                               new OctetString("MD5DESUserPrivPassword")));
// create the target
   snmp.listen();
target = new UserTarget();
target.setAddress(targetAddress);
target.setRetries(1);
target.setTimeout(5000);
target.setVersion(SnmpConstants.version3);
target.setSecurityLevel(SecurityLevel.AUTH_PRIV);
target.setSecurityName(new OctetString("MD5DES"));
} public void sendPDU() throws IOException {
PDU pdu = new ScopedPDU();
   pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5")));
   pdu.setType(PDU.GETNEXT);    //  send the PDU
        ResponseEvent response = snmp.send(pdu, target);
        PDU responsePDU = response.getResponse();        Address peerAddress = response.getPeerAddress();
        System.out.println("Received response from: "+
         peerAddress);
        System.out.println(responsePDU);
        
    
        // 向Agent发送PDU,并接收Response
ResponseEvent respEvnt = snmp.send(pdu, target);
System.out.println("Received response from: "+
respEvnt.getPeerAddress());
 // dump response PDU
 System.out.println(respEvnt.getResponse().toString()); // 解析Response
if (respEvnt != null && respEvnt.getResponse() != null) {
Vector variableBindings = respEvnt.getResponse()
.getVariableBindings();
Vector<VariableBinding> recVBs = variableBindings; for (int n = 0; n < recVBs.size(); n++) {
VariableBinding recVB = recVBs.elementAt(n);
System.out.println(recVB.getOid() + " : " + recVB.getVariable());
}
}
} public static void main(String[] args) {
try {
GetSnmpV3 util = new GetSnmpV3();
util.initComm();
util.sendPDU();
} catch (IOException e) {
e.printStackTrace();
}
}
}执行结果为什么是这样的,得不到正确信息??Received response from: 192.168.6.1/161
REPORT[reqestID=0, errorStatus=0, errorIndex=0, VBS[1.3.6.1.6.3.15.1.1.3.0 = 331]]
Received response from: 192.168.6.1/161
REPORT[reqestID=0, errorStatus=0, errorIndex=0, VBS[1.3.6.1.6.3.15.1.1.3.0 = 332]]
1.3.6.1.6.3.15.1.1.3.0 : 332

解决方案 »

  1.   

    pdu.add(new VariableBinding(new OID("1.3.6.1.2.1.1.5"))); 
    这一句,无论输入什么OID,得到的信息都是那样的
    按理说,不同的OID得到的系统信息也应该不一样的
      

  2.   

    怎么我编译你的代码报错噢。G:\Java\Project\test>trans
    src\SnmpExample.java:259: 警告:[unchecked] 未经检查的转换
    找到: java.util.Vector
    需要: java.util.Vector<org.snmp4j.smi.VariableBinding>
    Vector<VariableBinding> recVBs = variableBindings;
                                     ^
    1 警告是什么原因呢?