Получить состояние принтера с помощью SNMP OID

Я работаю с SNMP в Android. Я хочу получить статус принтера. Я использую Snmp4Android.jar и OID 1.3.6.1.2.1.25.3.5.1.1. Перейдите по этой ссылке Статус принтера< /а>.

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();
    }

Спасибо...


person user4232    schedule 10.04.2013    source источник
comment
Каков результат вашего кода сейчас?   -  person L.R.    schedule 22.04.2013
comment
if (errorStatus == PDU.noError) это не работает, иначе часть этого, если теперь отображается условие, т.е. Log.i((String) tag, Error: Request Failed); Log.i(тег, статус ошибки = + errorStatus); Log.i(тег, индекс ошибки = + errorIndex); Log.i(тег, Текст статуса ошибки = + errorStatusText);   -  person user4232    schedule 22.04.2013
comment
И какой статус ошибки, индекс и текст? Проблемы со связью через SNMP могут иметь несколько причин, скорее всего, брандмауэр блокирует порт udp 161, устройство не прослушивает этот порт, неправильная строка сообщества, ...   -  person L.R.    schedule 23.04.2013
comment
Ошибка: Ошибка запроса Статус ошибки = 2 Индекс ошибки = 1 Текст статуса ошибки = Нет такого имени. В любом случае спасибо за ответ....   -  person user4232    schedule 23.04.2013


Ответы (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 в конце). Это правильный OID для hrPrinterStatus в первой строке.

person L.R.    schedule 24.04.2013