2013-04-10 387 views
0

我在Android中使用SNMP。我想獲得打印機狀態。我正在使用Snmp4Android.jar和OID 1.3.6.1.2.1.25.3.5.1.1。請參考此鏈接Printer Status使用SNMP OID獲取打印機狀態

SnmpActivity.java這裏

public class SnmpActivity extends Activity { 

private static String ipAddress = "PrinterIP"; 

private static String port = "Port"; 

private static String oidValue = "1.3.6.1.2.1.25.3.5.1.1"; 

public static Snmp snmp; 
public static CommunityTarget comtarget; 
static PDU pdu; 
static OID oid; 
static VariableBinding req; 
Button b; 
private static final String tag = "SNMP CLIENT"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    System.setProperty("java.net.preferIPv4Stack", "true"); 
    System.setProperty("java.net.preferIPv6Addresses", "false"); 

    b = (Button) findViewById(R.id.buttonClick); 
    b.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      try { 
       sendSnmpRequest(oidValue); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 
} 



private void sendSnmpRequest(String oid) throws Exception { 

     ResponseEvent response; 
     OctetString community1 = new OctetString("public"); 
     String host = ipAddress + "/" + port; 
     Address tHost = new UdpAddress(host); 
     TransportMapping transport = new DefaultUdpTransportMapping(); 
     transport.listen(); 
     CommunityTarget comtarget = new CommunityTarget(); 
     comtarget.setCommunity(community1); 
     comtarget.setVersion(SnmpConstants.version1); 
     comtarget.setAddress(tHost); 
     comtarget.setRetries(2); 
     comtarget.setTimeout(5000); 
     PDU pdu = new PDU(); 
     pdu.add(new VariableBinding(new OID(oid))); 
     pdu.setType(PDU.GET); 
     snmp = new Snmp(transport); 
     response = snmp.get(pdu, comtarget); 
     if (response != null) { 
      Log.i(tag, "Got Response from Agent " 
        + response.getResponse().toString()); 
      PDU responsePDU = response.getResponse(); 
      if (responsePDU != null) { 
       int errorStatus = responsePDU.getErrorStatus(); 
       int errorIndex = responsePDU.getErrorIndex(); 
       String errorStatusText = responsePDU.getErrorStatusText(); 

       if (errorStatus == PDU.noError) { 
        Log.i(tag, 
          "Snmp Get Response = " 
            + responsePDU.getVariableBindings()); 
        Toast.makeText(
          getApplicationContext(), 
          "Snmp Get Response = " 
            + responsePDU.getErrorStatusText(), 
          Toast.LENGTH_LONG).show(); 

        System.out 
          .println("--" + responsePDU.getVariableBindings()); 

       } else { 
        Log.i((String) tag, "Error: Request Failed"); 
        Log.i(tag, "Error Status = " + errorStatus); 
        Log.i(tag, "Error Index = " + errorIndex); 
        Log.i(tag, "Error Status Text = " + errorStatusText); 
       } 

      } else { 
       Log.i(tag, "Error: Response PDU is null"); 
      } 
     } else { 
      Log.i(tag, "Error: Agent Timeout... "); 
     } 
     snmp.close(); 
    } 

謝謝...

+0

你的代碼現在輸出什麼? – 2013-04-22 14:59:16

+0

if(errorStatus == PDU.noError)this is not working else this part if this condition is now showing Log.i((String)tag,「Error:Request Failed」); Log.i(tag,「Error Status =」+ errorStatus); Log.i Log.i(tag,「Error Index =」+ errorIndex); Log.i(標記,「錯誤狀態文本=」+ errorStatusText); – user4232 2013-04-22 15:23:18

+0

什麼是錯誤狀態,索引和文本?通過SNMP進行通信的問題可能有多種原因,最有可能是防火牆阻止udp端口161,設備不在該端口上偵聽,錯誤的團體字符串... – 2013-04-23 06:35:51

回答

1

使用net-snmp或一些其他可用的MIB瀏覽器(例如,通過iReasoning)。您可能會發現hrPrinterTable(OID .1.3.6.1.2.1.25.3.5)中沒有數據。

如果有一些行,則將OID更改爲1.3.6.1.2.1.25.3.5.1.1.1(在末尾添加1)。這是第一行hrPrinterStatus的正確OID。