[SNMP4J] Strange NullPointerException...

Menard, Matt Matt.Menard at gdc4s.com
Fri May 12 14:23:59 CEST 2006


First off let me say that I'm rather new to SNMP and this is the first
time I've been involved in writing any SNMP code.  The problem I'm
having is when I try to send a GETBULK request to the SNMP agent (SET
and TRAPS do not have this problem; the requests are sent to the server
just fine).  As soon as the "response = snmp.send(request, target);"
line is executed, I receive the following exception.  

 

java.lang.NullPointerException

      at
org.snmp4j.MessageDispatcherImpl.getTransport(MessageDispatcherImpl.java
:204)

      at
org.snmp4j.MessageDispatcherImpl.sendPdu(MessageDispatcherImpl.java:373)

      at org.snmp4j.Snmp.sendMessage(Snmp.java:955)

      at org.snmp4j.Snmp.send(Snmp.java:802)

      at org.snmp4j.Snmp.send(Snmp.java:758)

 

After trying, in vain, to figure this problem out, I thought that if I
passed the Transport to the snmp.send() method directly, it would solve
the problem.  That turned out to be incorrect and it just caused all the
requests to time out.  Here are some of the particulars about this
project:

 

SNMP version: 3

SNMP authentication: MD5

SNMP privacy: AES-128

IDE: JBuilder 2005

Java version: 1.4.1_09

SNMP4J version: 1.7.1

 

I've been banging my head against the wall trying to figure this out for
a few days now.  Like I said, this only happens when I try to execute a
GETBULK request.  I even went so far as to go through the
SnmpRequest.java file that comes with the SNMP4J bundle and copy the
code out there into my class (which you can see in the code included
below) just incase there was something subtle I was missing.  

 

Any help would be greatly appreciated!

 

Thanks,
Matt 

 

//------------- CODE --------------------------------

private PDU sendRequest(String ipAddress,

                        int port,

                        String username,

                        String authPassphrase,

                        String privPassphrase,

                        PDU request,

                        CommandResponder responder)

{

  PDU responsePDU = null;

 

  try

  {

    Snmp snmp = createSnmpSession(username, authPassphrase,
privPassphrase);

 

 

 

    // Create the target and set the individual attributes of this SNMP

    // transaciton.

    Target target = createTarget(username,

                                 authPassphrase,

                                 privPassphrase,

                                 GenericAddress.parse("udp:" + ipAddress
+  "/" + port));

 

    if(responder != null)

    {

      snmp.addCommandResponder(responder);

    }

 

    snmp.listen();

 

    ResponseEvent response = null;

 

    // This is the line that generates the exception.

    response = snmp.send(request, target);

    

    responsePDU = response.getResponse();

 

    snmp.close();

  }

 

  catch(IOException ioe)

  {

    ioe.printStackTrace();

  }

 

  catch(Exception e) 

  {

    e.printStackTrace();

  }

 

  return responsePDU;

}

 

//-------------------------------------------

// addUsmUser, lifted from the SnmpRequest.java class contained

// in the SNMP4J package.

private void addUsmUser(Snmp snmp,

                        String username,

                        String authPassphrase,

                        String privPassphrase)

{

  snmp.getUSM().addUser(new OctetString(username),

                        new UsmUser(new OctetString(username),

                                    AuthMD5.ID,

                                    new OctetString(authPassphrase),

                                    PrivAES128.ID,

                                    new OctetString(privPassphrase)));

}

 

//-------------------------------------------

// Portions of this code were derived from the SnmpRequest.java class...

private Snmp createSnmpSession(String username,

                               String authPassphrase,

                               String privPassphrase) throws IOException

{

  // Setup a transport over UDP

  AbstractTransportMapping transport =  new
DefaultUdpTransportMapping();

 

  Snmp snmp =  new Snmp(transport);

 

  // Setup the user security model which will provide privacy
(encryption)

  // and authentication.

  USM usm = new USM(SecurityProtocols.getInstance(),

                    new OctetString(MPv3.createLocalEngineID()), 0);

 

  SecurityModels.getInstance().addSecurityModel(usm);

  addUsmUser(snmp, username, authPassphrase, privPassphrase);

  return snmp;

}

 

//-------------------------------------------

// This class was also derived from the SnmpRequest.java

// class.

private Target createTarget(String username,

                            String authPassphrase,

                            String privPassphrase,

                            Address targetAddress)

{

  UserTarget target = new UserTarget();

 

  if(authPassphrase != null)

  {

    if(privPassphrase != null)

    {

      target.setSecurityLevel(SecurityLevel.AUTH_PRIV);

    }

 

    else

    {

      target.setSecurityLevel(SecurityLevel.AUTH_NOPRIV);

    }

  }

 

  else

  {

    target.setSecurityLevel(SecurityLevel.NOAUTH_NOPRIV);

  }

 

  target.setAddress(targetAddress);

  target.setRetries(1);

  target.setTimeout(5000);

  target.setVersion(SnmpConstants.version3);

  target.setSecurityName(new OctetString(username));

 

  return target;

}




More information about the SNMP4J mailing list