好的,这是Windows特定的问题。
我需要能够访问连接到计算机的打印机的墨水量。可能是直接连接或网络连接。
我认识到每台打印机(或打印机公司)可能会有所不同,但我在哪里可以找到它们如何向PC显示墨水量的信息。另外,阅读此信息的最佳语言是什么?
答案 0 :(得分:12)
好的,这是OS不可知的答案......: - )
如果打印机不是非常便宜的型号,它将内置支持SNMP(简单网络管理协议)。 SNMP查询可以从存储在其MIB(管理信息库)中的网络设备返回当前值。
对于打印机,有一个名为Printer MIB的标准定义。 Printer MIB为prtMarkerSuppliesLevel
定义标准名称和树位置(ASN.1 notation中的OID == 对象标识符),在墨水标记打印机的情况下映射到墨水量。
请注意,SNMP还允许私有扩展到标准MIB。大多数打印机供应商确实在其“私有MIB”中隐藏了许多其他信息,但标准信息应始终通过打印机MIB OID的查询提供。
实际上,每种编程语言都有标准库,可以帮助您从自己的应用程序中进行特定的SNMP查询。
其中一个实现是开源,称为Net-SNMP
,它还附带了一些强大的命令行工具来运行SNMP查询。
我认为查询所有油墨的所有等级的OID是.1.3.6.1.2.1.43.11.1.1.9
(this webpage确认我相信)但我现在无法验证,因为我没有目前在我的局域网中有一台打印机。因此,用于查询墨水量的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地址。
答案 1 :(得分:5)
我有一个支持SNMP的HP 8600 pro N911a可以进行一些挖掘,因此以下命令可能对您有所帮助。请注意,此特定模型存在一些固件问题,您无法使用snmpget查询“magenta”,但是您会看到snmpwalk的值(执行某种递归下钻)。
OLD:您可以查询值的名称和顺序,但到目前为止我找不到“最大值”来计算一个干净的百分比;(。我猜到目前为止这些值是相对于255的,所以除以2.55得出百分比。
更新:马塞洛的暗示很棒!从寄存器.8。*你可以读取每个墨盒的最大级别,我完全错误,假设最大值只能是8位值。我更新了示例脚本以读取最大值并计算c
还有一些讨论over there at Cacti forums。 一个答案证实墨水水平以百分比形式测量(值15是枚举中的“百分比”):
# 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
您需要安装net-snmp软件包。如果您不在Linux上,则可能需要为您的首选操作系统挖掘SNMP命令行工具。
# 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
在我的Linux机器上,我使用以下脚本进行一些漂亮的打印:
#!/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);'
答案 2 :(得分:2)
我真的很喜欢tseeling的方法!
作为补充,我发现OID ... .9
的最大值不是他所猜测的255,但实际上每个墨盒的数量会有所不同。这些值可以从OID .1.3.6.1.2.1.43.11.1.1.8
获得(通过除以这些值获得的结果与通过从hplip运行hp-inklevels命令获得的结果相匹配。
我编写了自己的脚本,输出如下所示的CSV(假设打印机IP地址为192.168.1.20):
# ./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 over 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;
}'
答案 3 :(得分:0)
另一种方法可能是使用ipp。虽然我尝试过的大多数打印机都支持这两种打印机,但是我发现一台仅适用于ipp的打印机和一台仅适用于snmp的打印机。
使用 static void Main(string[] args)
{
var jsonString = " {'key1':'value1','key2':'value2','Type':'value3'} ";
var jsonObject = JValue.Parse(jsonString);
var JsonObject_1 = jsonObject;
dynamic JsonObject_2 = jsonObject;
dynamic d_type_1 = JsonObject_1.Type;
dynamic d_type_2 = JsonObject_2.Type;
}
的简单方法:
ipptool
:colors.ipp
{
VERSION 2.0
OPERATION Get-Printer-Attributes
GROUP operation-attributes-tag
ATTR charset "attributes-charset" "utf-8"
ATTR naturalLanguage "attributes-natural-language" "en"
ATTR uri "printer-uri" $uri
ATTR name "requesting-user-name" "John Doe"
ATTR keyword "requested-attributes" "marker-colors","marker-high-levels","marker-levels","marker-low-levels","marker-names","marker-types"
}
ipptool -v -t ipp://192.168.2.126/ipp/print colors.ipp
"colors.ipp":
Get-Printer-Attributes:
attributes-charset (charset) = utf-8
attributes-natural-language (naturalLanguage) = en
printer-uri (uri) = ipp://192.168.2.126/ipp/print
requesting-user-name (nameWithoutLanguage) = John Doe
requested-attributes (1setOf keyword) = marker-colors,marker-high-levels,marker-levels,marker-low-levels,marker-names,marker-types
colors [PASS]
RECEIVED: 507 bytes in response
status-code = successful-ok (successful-ok)
attributes-charset (charset) = utf-8
attributes-natural-language (naturalLanguage) = en-us
marker-colors (1setOf nameWithoutLanguage) = #00FFFF,#FF00FF,#FFFF00,#000000,none
marker-high-levels (1setOf integer) = 100,100,100,100,100
marker-levels (1setOf integer) = 6,6,6,6,100
marker-low-levels (1setOf integer) = 5,5,5,5,5
marker-names (1setOf nameWithoutLanguage) = Cyan Toner,Magenta Toner,Yellow Toner,Black Toner,Waste Toner Box
marker-types (1setOf keyword) = toner,toner,toner,toner,waste-toner
具有当前的墨粉/墨水量,marker-levels
是最大值(到目前为止,我在这里只看到100s),marker-high-levels
描述了每个字段的含义(提示:对于颜色您可能要在第一个空格后剥离所有内容,许多打印机在此字段中包括墨盒类型。
注意:以上内容与杯子2.3.1相同。在2.2.1中,我不得不将关键字指定为一个字符串(marker-names
)。或者可以完全保留,然后返回所有关键字。
有关可用属性的更多信息(打印机之间可能有所不同):TryGetMember
有关执行ipp调用的更多信息(包括python示例):https://www.cups.org/doc/spec-ipp.html