2012-02-07 56 views
3

我想使用android.I簡單的SNMP獲得發現的Java代碼,並嘗試在android.I使用它也重視snmp4j.jar文件android.But我得到了空指針異常,我不得到的,更output.If人對如何在Android的話,請給我建議使用SNMP的任何想法或代碼..SNMP進行Android的

以下是我的代碼,我都試過了,

1 import java.io.IOException; 
2 import org.snmp4j.CommunityTarget; 
3 import org.snmp4j.PDU; 
4 import org.snmp4j.Snmp; 
5 import org.snmp4j.TransportMapping; 
6 import org.snmp4j.event.ResponseEvent; 
7 import org.snmp4j.mp.SnmpConstants; 
8 import org.snmp4j.smi.OID; 
9 import org.snmp4j.smi.OctetString; 
10 import org.snmp4j.smi.UdpAddress; 
11 import org.snmp4j.smi.VariableBinding; 
12 import org.snmp4j.transport.DefaultUdpTransportMapping; 
13 import android.app.Activity; 
14 import android.os.Bundle; 
15 import android.util.Log; 
16 import android.view.View; 
17 import android.view.View.OnClickListener; 
18 import android.widget.Button; 
19 import android.widget.Toast; 
20 
21 public class SNMPClient extends Activity { 
22 
23 private static String ipAddress = "127.0.0.1"; 
24 private static String port = "161"; 
25 //cmd to request from Server 
26 private static String oidValue = "1.3.6.1.2.1.1.5.0"; 
27 private static int snmpVersion = SnmpConstants.version2c; 
28 private static String community = "public"; 
29 
30 public static Snmp snmp; 
31 public static CommunityTarget comtarget; 
32 static PDU pdu; 
33 static OID oid; 
34 static VariableBinding req; 
35 Button b; 
36 private static final String tag = "SNMP CLIENT"; 
37 
38 @Override 
39 public void onCreate(Bundle savedInstanceState) { 
40 super.onCreate(savedInstanceState); 
41 setContentView(R.layout.main); 
42  
43 System.setProperty("java.net.preferIPv4Stack", "true"); 
44  System.setProperty("java.net.preferIPv6Addresses", "false"); 
45  
46 b = (Button) findViewById(R.id.getvalue); 
47 b.setOnClickListener(new OnClickListener() { 
48 
49  public void onClick(View v) { 
50   // TODO Auto-generated method stub 
51   try { 
52    sendSnmpRequest(oidValue); 
53   } catch (IOException e) { 
54    // TODO Auto-generated catch block 
55    e.printStackTrace(); 
56   } catch (Exception e) { 
57    // TODO Auto-generated catch block 
58    e.printStackTrace(); 
59   } 
60 
61  } 
62 }); 
63 } 
64 
65 private void sendSnmpRequest(String cmd) throws Exception { 
66 // Create TransportMapping and Listen 
67 TransportMapping transport = new DefaultUdpTransportMapping(); 
68 transport.listen(); 
69 
70 // Create Target Address object 
71 CommunityTarget comtarget = new CommunityTarget(); 
72 comtarget.setCommunity(new OctetString(community)); 
73 comtarget.setVersion(snmpVersion); 
74 comtarget.setAddress(new UdpAddress(ipAddress + "/" + port)); 
75 comtarget.setRetries(2); 
76 comtarget.setTimeout(1000); 
77 // Prepare PDU 
78 req = new VariableBinding(); 
79 OID oid = new OID(cmd); 
80 req.setOid(oid); 
81 pdu = new PDU(); 
82 pdu.add(req); 
83 Snmp snmp = new Snmp(transport); 
84 Log.i(tag ,"Sending Request to Agent..."); 
85 ResponseEvent response = snmp.get(pdu, comtarget); 
86 // Process Agent Response 
87 if (response != null) { 
88  Log.i(tag,"Got Response from Agent"); //upto this get in Logcat 
89  PDU responsePDU = response.getResponse(); //Here get Null response 
90  if (responsePDU != null) { 
91   int errorStatus = responsePDU.getErrorStatus(); 
92   int errorIndex = responsePDU.getErrorIndex(); 
93   String errorStatusText = responsePDU.getErrorStatusText(); 
94 
95   if (errorStatus == PDU.noError) { 
96    Log.i(tag,"Snmp Get Response = " 
97      + responsePDU.getVariableBindings()); 
98    Toast.makeText(getApplicationContext(), 
99      "Snmp Get Response = " + responsePDU.getVariableBindings(),Toast.LENGTH_LONG).show(); 
100   } else { 
101     Log.i((String) tag,"Error: Request Failed"); 
102     Log.i(tag,"Error Status = " + errorStatus); 
103     Log.i(tag,"Error Index = " + errorIndex); 
104     Log.i(tag,"Error Status Text = " + errorStatusText); 
105    } 
106   } else { 
107    Log.i(tag,"Error: Response PDU is null"); // This get in Logcat 
108   } 
109  } else { 
110   Log.i(tag,"Error: Agent Timeout... "); 
111  } 
112  snmp.close(); 
113 }} 

請任何人有任何解決方案請建議我。在此先感謝.............

在89線獲得空值,所以得到空指針異常.......任何想法或代碼

+0

請提供異常的堆棧跟蹤。它顯示了空指針出現的行號。 – 2012-02-07 15:21:13

回答

2

ResponseEvent.getResponse()文檔(重點是我的):

返回:一個PDU實例,如果收到響應。 如果 請求超時,然後將返回null。

現在很明顯,你可以看到你得到在該行的null響應:

PDU responsePDU = response.getResponse(); 

這是最有可能因爲你試圖做一個SNMP獲取Android設備的本地主機地址,即:

private static String ipAddress = "127.0.0.1"; 
private static String port = "161"; 
// ... 
comtarget.setAddress(new UdpAddress(ipAddress + "/" + port)); 

這沒有意義,因爲你的Android可能沒有運行loc的SNMP服務盟友,那麼如何從未運行的SNMP服務獲得響應?

嘗試改變這種ipAddress到要連接到該設備的地址。

+0

非常感謝。我犯了一個非常愚蠢的錯誤。 – krushnakant 2012-02-08 05:30:40

+0

你有任何想法,如何使用SNMP步行或Android的snmp的GETNEXT ???任何代碼或建議......請... – krushnakant 2012-02-08 05:31:58