我在Android中使用SNMP。我想获得打印机状态。我使用 Snmp4Android.jar 和OID 1.3.6.1.2.1.25.3.5.1.1 。请参阅此链接Printer Status。
这里是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 :(得分:2)
使用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。