当前位置: 代码迷 >> java >> 在没有SNMP代理的情况下扫描IP
  详细解决方案

在没有SNMP代理的情况下扫描IP

热度:58   发布时间:2023-07-31 11:15:17.0

以以下示例为例,当我向空IP发送OID时,以下代码来自或对于没有SNMP的设备,程序将引发异常。

我使用for循环读取IP。 我试图以不同的方式改变执行流程,但没有成功。

该程序位于带有java.lang.NullPointerException的getAsStrint方法中

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

没有目标,这就是为什么空指针异常