# SNMP - NullPointerException simplesnmpclient



## Nisbo (14. Jan 2017)

Servus,

ich spiele gerade etwas mit SNMP rum und möchte von einem Gerät im lokalen Netzwerk Werte auslesen, das funktioniert mit dem MIB Browser (iReasoning MIB browser) auch ohne Probleme

In Java nutze ich dazu "snmp4j" mit dem "simplesnmpclient"


```
package xxxxxxEDITxxxxx

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.Target;
import org.snmp4j.TransportMapping;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.event.ResponseListener;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.Address;
import org.snmp4j.smi.GenericAddress;
import org.snmp4j.smi.OID;
import org.snmp4j.smi.OctetString;
import org.snmp4j.smi.VariableBinding;
import org.snmp4j.transport.DefaultUdpTransportMapping;
import org.snmp4j.util.DefaultPDUFactory;
import org.snmp4j.util.TableEvent;
import org.snmp4j.util.TableUtils;


/**
* Simplest client possible
*
* @author johanrask
*
*/
public class SimpleSnmpClient {

    private String address;

    private Snmp snmp;
   

    public SimpleSnmpClient(String address) {
        super();
        this.address = address;
        try {
            start();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // Since snmp4j relies on asynch req/resp we need a listener
    // for responses which should be closed
    public void stop() throws IOException {
        snmp.close();
    }

    private void start() throws IOException {
        TransportMapping<?> transport = new DefaultUdpTransportMapping();
        snmp = new Snmp(transport);
        // Do not forget this line!
        transport.listen();
    }
   
    public String getAsString(OID oid) throws IOException {
        ResponseEvent event = get(new OID[]{oid});
        return event.getResponse().get(0).getVariable().toString();
    }
   
   
    public void getAsString(OID oids,ResponseListener listener) {
        try {
            snmp.send(getPDU(new OID[]{oids}), getTarget(),null, listener);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
   
   
    private PDU getPDU(OID oids[]) {
        PDU pdu = new PDU();
        for (OID oid : oids) {
            pdu.add(new VariableBinding(oid));
        }
           
        pdu.setType(PDU.GET);
        return pdu;
    }
   
    public ResponseEvent get(OID oids[]) throws IOException {
       ResponseEvent event = snmp.send(getPDU(oids), getTarget(), null);
       if(event != null) {
           return event;
       }
       throw new RuntimeException("GET timed out");     
    }
   
    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);
        System.out.println("Test: "+target.toString());
// gibt aus
// Test: CommunityTarget[address=192.168.178.43/161,version=1,timeout=1500,retries=2,securityLevel=1,securityModel=1,securityName=public,preferredTransports=null]

        return target;
    }

    /**
     * Normally this would return domain objects or something else than this...
     */
    public List<List<String>> getTableAsStrings(OID[] oids) {
        TableUtils tUtils = new TableUtils(snmp, new DefaultPDUFactory());
       
        List<TableEvent> events = tUtils.getTable(getTarget(), oids, null, null);
       
        List<List<String>> list = new ArrayList<List<String>>();
        for (TableEvent event : events) {
            if(event.isError()) {
                throw new RuntimeException(event.getErrorMessage());
            }
            List<String> strList = new ArrayList<String>();
            list.add(strList);
            for(VariableBinding vb: event.getColumns()) {
                strList.add(vb.getVariable().toString());
            }
        }
        return list;
    }
   
    public static String extractSingleString(ResponseEvent event) {
        return event.getResponse().get(0).getVariable().toString();
    }
}
```

Aufruf (ja ich weiß toller Name der Methode )

```
private void test() throws IOException{
        SimpleSnmpClient client = new SimpleSnmpClient("udp:192.168.178.43/161");
        String sysDescr = client.getAsString(new OID(".1.3.6.1.4.1.40297.1.2.1.2.5.0"));
        System.out.println("Ende: " + sysDescr);
    }
```

nun wirft er mir ne NullPointerExeption hier:

```
return event.getResponse().get(0).getVariable().toString();
```

IP: 192.168.178.43
Port: 161
OID: .1.3.6.1.4.1.40297.1.2.1.2.5.0
SNMP Version: 1
stimmen und sind so auch im MiB Browser eingetragen, readcommunity ist beim MiB Browser leer

Da ich schon allgemein bei Java kein Profi bin und hier absoluter Neuling stehe ich jetzt auf dem Schlauch


----------



## Nisbo (14. Jan 2017)

Ich hab den Fehler gefunden, es muss 
target.setVersion(0);
heißen für die Version 1, warum auch immer


----------

