基本上,我需要检查n/w打印机的状态,无论它是否打开。有什么办法可以在Java中做到这一点吗?

是否有任何第三方API或工具?

我尝试在Java中使用PrintServiceLookup,但无论是否打开,它都不会给出状态。

另外,如果在Java中无法实现,是否有任何可以在Windows中运行的命令可以给出打印机的状态?

然后,我可以在Java中运行此命令并进行检查。

最佳答案

根据“How Network Printing Works”,它实际上取决于打印机的类型及其支持的协议(protocol)。如果知道打印机使用的IP和端口,并且打印机支持SNMP(只是选择协议(protocol)),则可以使用SNMP协议(protocol)查询打印机信息。 Java库SNMP4j可以帮助您实现这一目标。我建议不要使用它,除非打印机,ip和端口永远不会(!)更改您的设置。这是因为您可能会遇到几个问题

  • 如何发现未知打印机?
  • 如何发现打印机使用的端口?
  • 如何发现打印机使用的协议(protocol)?

  • 让我们假设上述问题不是什么大问题,并假设每台打印机都支持SNMP。如何从中获取信息?除了使用提到的Java库之外,您还可以从终端在Linux中使用snmpget。语法如下:
    snmpget -v1 -c public host-ip OID
    

    OID是打印机的每个属性的object identifier,从页数到碳粉盒信息。如果不添加OID,则会获得可用OID的完整列表。问题的症结在于,尽管所有OID都是标准化的,但OID的使用因品牌而异,并且因打印机型号而异。对于我的惠普,以下工作原理:
    snmpget -v1 -c public 192.168.1.10 iso.3.6.1.2.1.43.17.6.1.5.1.2
    

    并返回
    iso.3.6.1.2.1.43.17.6.1.5.1.2 = STRING: "Ready"
    

    使用OID返回我的HP打印机的状态。但是如果我在佳能上使用相同的OID,我会得到
    Error in packet
    Reason: (noSuchName) There is no such variable name in this MIB.
    Failed object: iso.3.6.1.2.1.43.17.6.1.5.1.2
    

    因此,它甚至没有通用的SNMP,更不用说其他可用的协议(protocol)了。

    考虑到所有这些信息,我认为最简单的方法就是检查是否可以通过此代码在通用打印机端口之一上建立与打印机的连接
    boolean available = false;
    try {
        String serverAddress = "192.168.1.10";
        Socket s = new Socket(serverAddress, 9100);
        s.close();
        available = true;
    } catch (IOException e) {
        available = false;
    }
    System.out.println("printer available: " + available);
    

    当然,这仅在您已经知道打印机ip的情况下才有效。

    10-04 12:36
    查看更多