好吧,这是Windows的具体问题。
我需要能够访问连接到计算机的打印机的墨水量。 可能是直接连接,或网络连接。
我承认,它可能会为每个打印机(或打印机公司至少),但我在哪里可以找到他们如何显示墨水量,以一台PC的信息不同。 此外,什么是阅读这些信息的最好的语言?
好吧,这是Windows的具体问题。
我需要能够访问连接到计算机的打印机的墨水量。 可能是直接连接,或网络连接。
我承认,它可能会为每个打印机(或打印机公司至少),但我在哪里可以找到他们如何显示墨水量,以一台PC的信息不同。 此外,什么是阅读这些信息的最好的语言?
好吧,这是一个与操作系统无关的答案... :-)
如果打印机是不是一个很小气鬼模式,这将有内置支持SNMP (简单网络管理协议)。 SNMP查询可以从存储在他们的MIB(管理信息库)的网络设备返回当前值。
对于打印机有一个标准定义了一个叫做打印机MIB 。 打印机MIB定义了标准的名称和树中的位置(OID的==在对象标识符 ASN.1符号 ),用于prtMarkerSuppliesLevel
这在油墨的标记打印机的情况下映射到墨水量。
请注意,SNMP也允许私有扩展标准MIB。 大多数打印机厂商的确隐藏在他们的“私有MIB”的信息很多附加件,虽然标准的信息应该总是通过打印机MIB的OID的查询可用。
几乎每一个编程语言有标准库,它可以帮助你从你自己的应用程序作出具体的SNMP查询。
一个这样的实现是开源的,叫Net-SNMP
,其中还附带了一些功能强大的命令行工具来运行SNMP查询。
我想查询所有级别的所有油墨的OID是.1.3.6.1.2.1.43.11.1.1.9
( 此网页证实了我认为),但我不能左右验证,现在,因为我没有一台打印机在我LAN的时刻。 所以NET-SNMP的snmpget
命令来查询墨水量应该是这样的:
snmpget \
-c public \
192.168.222.111 \
".1.3.6.1.2.1.43.11.1.1.9"
其中, public
是标准团体字符串和192.168.222.111
您打印机的IP地址。
I have an SNMP-capable HP 8600 pro N911a around to do some digging, so the following commands may help you a bit. Beware that this particular model has some firmware problems, you can't query "magenta" with snmpget, but you see a value with snmpwalk (which does some kind of recursive drill-down).
OLD: You can query the names and sequence of values, but I couldn't find the "max value" to calculate a clean percentage so far ;(. I'm guessing so far the values are relative to 255, so dividing by 2.55 yields a percentage.
Update: Marcelo's hint was great! From Registers .8.* you can read the max level per cartridge, and I was totally wrong assuming the max value can only be an 8-bit value. I have updated the sample script to read the max values and calculate c
There is also some discussion over there at Cacti forums. One answer confirms that the ink levels are measured as percent (value 15 is "percent" in an enumeration):
# snmpwalk -v1 -c public 192.168.100.173 1.3.6.1.2.1.43.11.1.1.7
SNMPv2-SMI::mib-2.43.11.1.1.7.0.1 = INTEGER: 15
SNMPv2-SMI::mib-2.43.11.1.1.7.0.2 = INTEGER: 15
SNMPv2-SMI::mib-2.43.11.1.1.7.0.3 = INTEGER: 15
SNMPv2-SMI::mib-2.43.11.1.1.7.0.4 = INTEGER: 15
You need to install the net-snmp package. If you're not on Linux you might need some digging for SNMP command line tools for your preferred OS.
# snmpwalk -v1 -c public 192.168.100.173 1.3.6.1.2.1.43.11.1.1.6.0
SNMPv2-SMI::mib-2.43.11.1.1.6.0.1 = STRING: "black ink"
SNMPv2-SMI::mib-2.43.11.1.1.6.0.2 = STRING: "yellow ink"
SNMPv2-SMI::mib-2.43.11.1.1.6.0.3 = STRING: "cyan ink"
SNMPv2-SMI::mib-2.43.11.1.1.6.0.4 = STRING: "magenta ink"
# snmpwalk -v1 -c public 192.168.100.173 1.3.6.1.2.1.43.11.1.1.9.0
SNMPv2-SMI::mib-2.43.11.1.1.9.0.1 = INTEGER: 231
SNMPv2-SMI::mib-2.43.11.1.1.9.0.2 = INTEGER: 94
SNMPv2-SMI::mib-2.43.11.1.1.9.0.3 = INTEGER: 210
SNMPv2-SMI::mib-2.43.11.1.1.9.0.4 = INTEGER: 174
# snmpwalk -v1 -c praxis 192.168.100.173 1.3.6.1.2.1.43.11.1.1.8.0
SNMPv2-SMI::mib-2.43.11.1.1.8.0.1 = INTEGER: 674
SNMPv2-SMI::mib-2.43.11.1.1.8.0.2 = INTEGER: 240
SNMPv2-SMI::mib-2.43.11.1.1.8.0.3 = INTEGER: 226
SNMPv2-SMI::mib-2.43.11.1.1.8.0.4 = INTEGER: 241
On my Linux box I use the following script to do some pretty-printing:
#!/bin/sh
PATH=/opt/bin${PATH:+:$PATH}
# get current ink levels
eval $(snmpwalk -v1 -c praxis 192.168.100.173 1.3.6.1.2.1.43.11.1.1.6.0 |
perl -ne 'print "c[$1]=$2\n" if(m!SNMPv2-SMI::mib-2.43.11.1.1.6.0.(\d) = STRING:\s+"(\w+) ink"!i);')
# get max ink level per cartridge
eval $(snmpwalk -v1 -c praxis 192.168.100.173 1.3.6.1.2.1.43.11.1.1.8.0 |
perl -ne 'print "max[$1]=$2\n" if(m!SNMPv2-SMI::mib-2.43.11.1.1.8.0.(\d) = INTEGER:\s+(\d+)!i);')
snmpwalk -v1 -c praxis 192.168.100.173 1.3.6.1.2.1.43.11.1.1.9.0 |
perl -ne '
my @c=("","'${c[1]}'","'${c[2]}'","'${c[3]}'","'${c[4]}'");
my @max=("","'${max[1]}'","'${max[2]}'","'${max[3]}'","'${max[4]}'");
printf"# $c[$1]=$2 (%.0f)\n",$2/$max[$1]*100
if(m!SNMPv2-SMI::mib-2.43.11.1.1.9.0.(\d) = INTEGER:\s+(\d+)!i);'
我真的很喜欢tseeling的做法!
作为补充,我发现了OID最大值... .9
是不是255由他的猜测,但它实际上每单个卡盒变化。 该值可从OID获得.1.3.6.1.2.1.43.11.1.1.8
(由这些值除以所得到的结果相匹配通过运行而获得的那些HP-inklevels从HPLIP命令。
我写我自己的脚本像下面(假设打印机IP地址192.168.1.20是),其输出的CSV:
# ./hpink 192.168.1.20
black,73,366,19.9454
yellow,107,115,93.0435
cyan,100,108,92.5926
magenta,106,114,92.9825
值是按照该顺序: <color_name>,<level>,<maxlevel>,<percentage>
脚本源(人会注意到我通常喜欢在awk perl的上方时,让人不解的是很简单的):
#!/bin/sh
snmpwalk -v1 -c public $1 1.3.6.1.2.1.43.11.1.1 | awk '
/.*\.6\.0\./ {
sub(/.*\./,"");
split($0,TT,/[ "]*/);
color[TT[1]]=TT[4];
}
/.*\.8\.0\./ {
sub(/.*\./,"");
split($0,TT,/[ "]*/);
maxlevel[TT[1]]=TT[4];
}
/.*\.9\.0\./ {
sub(/.*\./,"");
split($0,TT,/[ "]*/);
print color[TT[1]] "," TT[4] "," maxlevel[TT[1]] "," TT[4] / maxlevel[TT[1]] * 100;
}'