通过SNMP获取打印机状态

原创
2016/03/08 12:17
阅读数 4.2K
import org.snmp4j.CommunityTarget;
import org.snmp4j.PDU;
import org.snmp4j.Snmp;
import org.snmp4j.event.ResponseEvent;
import org.snmp4j.mp.SnmpConstants;
import org.snmp4j.smi.*;
import org.snmp4j.transport.DefaultUdpTransportMapping;

import java.io.IOException;
import java.util.Vector;

/**
 * Name	 hrDeviceStatus
 * OID	     .1.3.6.1.2.1.25.3.2.1.5.1
 * MIB	     HOST-RESOURCES-MIB
 * Syntax	 INTEGER {unknown(1), running(2), warning(3), testing(4), down(5)}
 * Access	 read-only
 * Status	 current
 * Descr	 The current operational state of the device described
 * by this row of the table.  A value unknown(1)
 * indicates that the current state of the device is
 * unknown.  running(2) indicates that the device is up
 * and running and that no unusual error conditions are
 * known.  The warning(3) state indicates that agent has
 * been informed of an unusual error condition by the
 * operational software (e.g., a disk device driver) but
 * that the device is still 'operational'.  An example
 * would be a high number of soft errors on a disk.  A
 * value of testing(4), indicates that the device is not
 * available for use because it is in the testing state.
 * The state of down(5) is used only when the agent has
 * been informed that the device is not available for any
 * use.
 * <p/>
 * ------------------------------------------------
 * <p/>
 * Name	 hrPrinterStatus
 * OID	     .1.3.6.1.2.1.25.3.5.1.1.1
 * MIB	     HOST-RESOURCES-MIB
 * Syntax	 INTEGER {other(1),unknown(2),idle(3),printing(4),warmup(5)}
 * Access	 read-only
 * Status	 current
 * DefVal
 * Indexes	 hrDeviceIndex
 * Descr	 The current status of this printer device.
 * <p/>
 * ------------------------------------------------
 * <p/>
 * Name	 hrPrinterDetectedErrorState
 * OID	     .1.3.6.1.2.1.25.3.5.1.2.1
 * MIB	     HOST-RESOURCES-MIB
 * Syntax	 OCTET STRING
 * Access	 read-only
 * Status	 current
 * DefVal
 * Indexes	 hrDeviceIndex
 * Descr	 This object represents any error conditions detected
 * by the printer.  The error conditions are encoded as bits in an octet string, with the following definitions:
 * Condition         Bit #
 * lowPaper              0
 * noPaper               1
 * lowToner              2
 * noToner               3
 * doorOpen              4
 * jammed                5
 * offline               6
 * serviceRequested      7
 * inputTrayMissing      8
 * outputTrayMissing     9
 * markerSupplyMissing  10
 * outputNearFull       11
 * outputFull           12
 * inputTrayEmpty       13
 * overduePreventMaint  14
 * Bits are numbered starting with the most significant
 * bit of the first byte being bit 0, the least
 * significant bit of the first byte being bit 7, the
 * most significant bit of the second byte being bit 8,
 * and so on.  A one bit encodes that the condition was
 * detected, while a zero bit encodes that the condition
 * was not detected.
 * This object is useful for alerting an operator to
 * specific warning or error conditions that may occur,
 * especially those requiring human intervention.
 */

public class SnmpPrinter {


    private Snmp snmp = null;
    private UdpAddress targetAddress = null;
    private static int DEFAULT_PORT = 161;
    private CommunityTarget target;

    public static final String OID_DEVICE_STATUS = "1.3.6.1.2.1.25.3.2.1.5.1";
    public static final String OID_PRINTER_STATUS = "1.3.6.1.2.1.25.3.5.1.1.1";
    public static final String OID_ERROR_STATUS = "1.3.6.1.2.1.25.3.5.1.2.1";

    public SnmpPrinter(String ip) throws IOException {
        this(ip, DEFAULT_PORT);
    }

    public SnmpPrinter(String ip, int port) throws IOException {
        // 设置Agent的IP和端口
        snmp = new Snmp(new DefaultUdpTransportMapping());
        snmp.listen();
        targetAddress = new UdpAddress(String.format("%s/%s", ip, port));
        connTarget();
    }

    public void close() throws IOException {
        snmp.close();
    }

    private void connTarget() {
        target = new CommunityTarget();
        target.setCommunity(new OctetString("public"));
        target.setAddress(targetAddress);
        // 通信不成功时的重试次数
        target.setRetries(3);
        // 超时时间
        target.setTimeout(1500);
        target.setVersion(SnmpConstants.version1);
    }

    private String getPDU(String oid) throws IOException {
        // 创建 PDU
        PDU pdu = new PDU();
        pdu.add(new VariableBinding(new OID(oid)));
        // MIB的访问方式
        pdu.setType(PDU.GET);
        // 向Agent发送PDU,并接收Response
        ResponseEvent respEvnt = snmp.send(pdu, target);
        // 解析Response
        StringBuilder buf = new StringBuilder();
        if (respEvnt != null && respEvnt.getResponse() != null) {
            Vector<? extends VariableBinding> recVBs = respEvnt.getResponse().getVariableBindings();
            // 可能多值,简单拼接
            for (int i = 0, s = recVBs.size(); i < s; i++) {
                VariableBinding recVB = recVBs.elementAt(i);
                buf.append(recVB.getVariable());
                if (i < s - 1) {
                    buf.append(" , ");
                }
            }
        }
        return buf.toString();
    }

    public String getDeviceStatus() throws IOException {
        return getPDU(OID_DEVICE_STATUS);
    }

    public String getPrinterStatus() throws IOException {
        return getPDU(OID_PRINTER_STATUS);
    }

    public String getErrorStatus() throws IOException {
        return getPDU(OID_ERROR_STATUS);
    }

    public static void main(String[] args) throws IOException {
        SnmpPrinter util = new SnmpPrinter("192.168.0.12");
        System.out.println(util.getDeviceStatus());
        System.out.println(util.getPrinterStatus());
        System.out.println(util.getErrorStatus());
        util.close();
    }
}


展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部