不用SNMP代理扫描IP

scan IP without SNMP agent

使用 https://www.jitendrazaa.com/blog/java/snmp/create-snmp-client-in-java-using-snmp4j/ 中的以下代码作为示例来监视网络,当我将 OID 发送到空 IP 或没有 SNMP 的设备时,程序会抛出异常。

我使用 for 循环读取 IP。我曾尝试以不同的方式更改执行流程,但均未成功。

程序落入getAsStrint方法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;
}

像这样制作 getAsString(OID oid) 方法

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"
    }
}

没有目标,这就是空指针异常的原因