javasnmpsnmp4j

scan IP without SNMP agent


Using as an example a following code from https://www.jitendrazaa.com/blog/java/snmp/create-snmp-client-in-java-using-snmp4j/ to monitor a network when I send OIDs to an empty IP or to a device without SNMP the program throws an exception.

I use a for loop to read IPs. I have tried to change the flow of execution in different ways without success.

the program falls in the getAsStrint method with java.lang.NullPointerException

public class SNMPManager {

Snmp snmp = null;
String address = null;

/**
 * Constructor
 *
 * @param add
 */
public SNMPManager(String add) {
    address = add;
}

public static void main(String[] args) throws IOException {
/**
* Port 161 is used for Read and Other operations
* Port 162 is used for the trap generation
*/


    for (int i = 37; i < 40; i++) {

        System.out.println("ip x.x.x." + i);
        SNMPManager client = new SNMPManager("udp:192.168.1." + i + "/161");
        //SNMPManager client = new SNMPManager("udp:192.168.1.37/161");
        client.start();
        /**
        * OID - .1.3.6.1.2.1.1.1.0 => SysDec
        * OID - .1.3.6.1.2.1.1.5.0 => SysName
        * => MIB explorer will be usefull here, as discussed in previous article
        */

        String sysDescr = client.getAsString(new OID(".1.3.6.1.2.1.1.5.0"));
        System.out.println(".1.3.6.1.2.1.1.5.0" + " - SysName: " + sysDescr);

        String sysDescr2 = client.getAsString(new OID(".1.3.6.1.2.1.1.1.0"));
        System.out.println(".1.3.6.1.2.1.1.1.0" + " - SysDec: " + sysDescr2);
    }
}

/**
 * Start the Snmp session. If you forget the listen() method you will not
 * get any answers because the communication is asynchronous
 * and the listen() method listens for answers.
 *
 * @throws IOException
 */
private void start() throws IOException {
    TransportMapping transport = new DefaultUdpTransportMapping();
    snmp = new Snmp(transport);
// Do not forget this line!
    transport.listen();
}

/**
 * Method which takes a single OID and returns the response from the agent as a String.
 *
 * @param oid
 * @return
 * @throws IOException
 */
public String getAsString(OID oid) throws IOException {
    ResponseEvent event = get(new OID[]{oid});
    return event.getResponse().get(0).getVariable().toString();
}

/**
 * This method is capable of handling multiple OIDs
 *
 * @param oids
 * @return
 * @throws IOException
 */
public ResponseEvent get(OID oids[]) throws IOException {
    PDU pdu = new PDU();
    for (OID oid : oids) {
        pdu.add(new VariableBinding(oid));
    }
    pdu.setType(PDU.GET);
    ResponseEvent event = snmp.send(pdu, getTarget(), null);
    if (event != null) {
        return event;
    }
    throw new RuntimeException("GET timed out");
}

/**
 * This method returns a Target, which contains information about
 * where the data should be fetched and how.
 *
 * @return
 */
private Target getTarget() {
    Address targetAddress = GenericAddress.parse(address);
    CommunityTarget target = new CommunityTarget();
    target.setCommunity(new OctetString("public"));
    target.setAddress(targetAddress);
    target.setRetries(2);
    target.setTimeout(1500);
    target.setVersion(SnmpConstants.version2c);
    return target;
}

Solution

  • make getAsString(OID oid) method like this

    public String getAsString(OID oid) throws IOException {
        ResponseEvent event = get(new OID[]{oid});
        if(event.getResponse() != null){
            return event.getResponse().get(0).getVariable().toString();
        } else {
            return "no target"
        }
    }
    

    there are no target that is why null pointer exception