[SNMP4J] java.lang.NullPointerException: Context engine ID must not be null
FLORENT Philippe
Philippe.FLORENT at edenred.com
Thu Aug 11 09:29:49 CEST 2016
Hello everyone,
- Doing a get on some OID give me "unkown instance" although they work with snmpwalk on the command line and GET works with mib explorer
- So I try to implement an snmp walk in snmp4j but I keep getting that error
Here is the code
I tried to use request.getContextEngineID(), but it is also null
public class SnmpProber
{
private Snmp snmp;
private UserTarget target;
private byte[] authEngineId0=null;
public SnmpProber(String ipAddress,String port,String userName,String authPass,String privPass)
{
try
{
Address targetAddress = GenericAddress.parse("udp:"+ipAddress+"/"+port);
TransportMapping transport = new DefaultUdpTransportMapping();
snmp = new Snmp(transport);
USM usm = new USM(SecurityProtocols.getInstance(),new OctetString(MPv3.createLocalEngineID()), 0);
SecurityModels.getInstance().addSecurityModel(usm);
transport.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(userName));
authEngineId0 = snmp.discoverAuthoritativeEngineID(target.getAddress(), 5000);
if(authEngineId0==null)
System.out.println("cannot connect");
else
{
// add user to the USM
UsmUser usmUser=new UsmUser(new OctetString(userName),
AuthSHA.ID,
new OctetString(authPass),
PrivAES128.ID,
new OctetString(privPass));
snmp.getUSM().addUser(new OctetString("v3DefaultUser"),
new OctetString(authEngineId0),
usmUser);
}
} catch (IOException ex) {
Logger.getLogger(SnmpProber.class.getName()).log(Level.SEVERE, null, ex);
}
}
public boolean isOk()
{
return authEngineId0!=null;
}
class WalkCounts {
public int requests;
public int objects;
}
public List<VariableBinding> walk(String oid)
{
final List<VariableBinding> result;
result = new LinkedList<VariableBinding>();
ScopedPDU request;
request = new ScopedPDU();
request.setType(PDU.GETNEXT);
request.add(new VariableBinding(new OID(oid)));
request.setNonRepeaters(0);
OID rootOID = request.get(0).getOid();
final WalkCounts counts = new WalkCounts();
final long startTime = System.currentTimeMillis();
TreeUtils treeUtils = new TreeUtils(snmp, new DefaultPDUFactory());
TreeListener treeListener = new TreeListener()
{
public boolean next(TreeEvent e) {
counts.requests++;
if (e.getVariableBindings() != null) {
VariableBinding[] vbs = e.getVariableBindings();
counts.objects += vbs.length;
for (int i = 0; i < vbs.length; i++) {
if (result != null) {
result.add(vbs[i]);
}
System.out.println(vbs[i].toString());
}
}
return true;
}
@Override
public void finished(TreeEvent e) {
if ((e.getVariableBindings() != null)
&& (e.getVariableBindings().length > 0)) {
next(e);
}
System.out.println("Total requests sent: "+ counts.requests);
System.out.println("Total objects received: "+ counts.objects);
System.out.println("Total walk time: "+ (System.currentTimeMillis() - startTime)+ " milliseconds");
if (e.isError()) {
System.err.println("The following error occurred during walk:");
System.err.println(e.getErrorMessage());
}
synchronized (this) {
this.notify();
}
}
@Override
public boolean isFinished() {
return true;
}
};
synchronized (treeListener)
{
treeUtils.getSubtree(target, rootOID, null, treeListener); <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< exception here
try
{
treeListener.wait();
}
catch (InterruptedException ex)
{
System.out.println("Tree retrieval interrupted: "+ex);
Thread.currentThread().interrupt();
}
}
return result;
}
public void Release()
{
try {
snmp.close();
} catch (IOException ex) {
Logger.getLogger(SnmpProber.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
More information about the SNMP4J
mailing list