2014-01-07 62 views
2

我想添加一个客户端到我的snmp协议程序。我将此代码为我的主要方法:在SNMP协议NullPointerException

public static void main(String[] args) throws IOException{ 
     SimpleSnmpClient client = new SimpleSnmpClient("udp:10.0.0.50/161"); 
     String sysDescr = client.getAsString(new OID(".1.3.6.1.2.1.1.1.0")); 
     System.out.println(sysDescr); 
    } 

,我从中学到的网站说,输出应该是关于某种大约运行该程序的设备信息。

我SimpleSnmpClient代码:

public class SimpleSnmpClient { 

    private String address; 

    private Snmp snmp; 


    public static void main(String[] args) throws IOException{ 
     SimpleSnmpClient client = new SimpleSnmpClient("udp:10.0.0.50/161"); 
     String sysDescr = client.getAsString(new OID(".1.3.6.1.2.1.1.1.0")); 
     System.out.println(sysDescr); 
    } 

    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); 
     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()); 

     @SuppressWarnings("unchecked") 
      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(); 
    } 
} 

但我收到NullPointerException异常:

Exception in thread "main" java.lang.NullPointerException 
    at org.bihe.SimpleSnmpClient.getAsString(SimpleSnmpClient.java:70) 
    at org.bihe.SimpleSnmpClient.main(SimpleSnmpClient.java:41) 

它指的是行:

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

,我不知道为什么这是怎么回事?任何人都可以帮我解决这个问题吗?

回答

3

如果你超时,你可以得到一个空响应。从ResponseEvent文档:“a PDU instance if a response has been received. If the request timed out then null will be returned.

也许你的服务器没有启动或不可用。尝试访问它与一些已知的应用程序,如snmpwalk只是为了区分您的代码与网络问题。

+0

你能不能帮我,我怎么能使用snmpwalk的?如果是我可以找到的应用程序?我使用的是Windows 8,我安装了net-snmp,并且还从windows功能中添加了snmp。他们是否依赖这个问题? –

+0

看起来snmpwalk可能带有net-snmp。看看提供的例子。 http://www.net-snmp.org/docs/man/snmpwalk.html –

+0

如何在Windows中运行此命令? %snmpwalk -mALL -v1 -cpublic snmp_agent_Ip_address系统? –

1

您尝试获取响应的设备是否具有社区字符串集?社区就像一个密码,并被设置在一个设备上,以防止人们在未经授权的情况下从该设备获取信息。如果社区字符串不正确,您将不会收到回复。

0

确保您为SNMP服务代理添加了相同的社区字符串。

窗户... 开放服务 - >右键单击SNMP - >安全选项卡下 - >添加团体字符串