根据“
How Network Printing Works”,它实际上取决于打印机的类型和它支持的协议.如果您知道打印机使用的IP和端口,并且您的打印机支持
SNMP(仅选择协议),则可以使用SNMP协议1查询打印机以获取信息. Java lib
SNMP4j可以帮助您实现这一目标.我建议不要使用它,除非打印机,IP和端口永远不会(!)更改您的设置.这是因为你可能遇到几个问题
>如何发现未知的打印机?
>如何发现打印机使用的端口?
>如何发现打印机使用的协议?
让我们假设上面的问题不是什么大问题,并假设每台打印机都支持SNMP.如何从中获取信息?除了使用上面提到的java lib之外,您还可以在终端中使用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一般适用的,也没有提到其他可用的协议.
考虑到所有这些信息,我认为最简单的方法就是检查是否可以通过此代码在其中一个通用打印机端口上建立与打印机的连接
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的情况下才有效.