使用 SNMP OID 获取打印机状态
Posted
技术标签:
【中文标题】使用 SNMP OID 获取打印机状态【英文标题】:Get Printer Status Using SNMP OID 【发布时间】:2013-04-10 10:55:24 【问题描述】:我正在使用 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();
谢谢...
【问题讨论】:
你的代码现在的输出是什么? if (errorStatus == PDU.noError) this is not working else part of this if condition is now show ie, Log.i((String) tag, "Error: Request Failed"); Log.i(tag, "错误状态 = " + errorStatus); Log.i(tag, "错误索引 = " + errorIndex); Log.i(tag, "错误状态文本 = " + errorStatusText); 错误状态、索引和文本是什么?通过 SNMP 进行通信的问题可能有多种原因,很可能是防火墙阻止了 udp 端口 161、设备未侦听该端口、错误的社区字符串…… 错误:请求失败错误状态 = 2 错误索引 = 1 错误状态文本 = 没有这样的名称,这是输出。无论如何,谢谢你的回复.... 【参考方案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。
【讨论】:
以上是关于使用 SNMP OID 获取打印机状态的主要内容,如果未能解决你的问题,请参考以下文章