使用 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 获取打印机状态的主要内容,如果未能解决你的问题,请参考以下文章

如何获取Cisco设备OID值来监控各种物理及逻辑状态信息

SNMP:创建自定义 OID

为啥snmp采集到的华为端口速率不准确

zabbix上华为交换机snmp OID查询温度信息配置

获取华为OID

Zabbix SNMP LLD实践(自动发现)