6

好的,这是一个特定于 Windows 的问题。

我需要能够访问连接到计算机的打印机的墨水量。可能是直接连接,也可能是网络连接。

我认识到每台打印机(或至少是打印机公司)可能会有所不同,但我在哪里可以找到它们如何向 PC 显示墨水量的信息。另外,阅读这些信息的最佳语言是什么?

4

4 回答 4

13

好的,这是一个与操作系统无关的答案...... :-)

如果打印机不是非常便宜的型号,它将内置对SNMP(简单网络管理协议)的支持。SNMP 查询可以从存储在其 MIB(管理信息库)中的网络设备返回当前值。

对于打印机,有一个称为Printer 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这个网页证实了我的看法)但我现在无法验证,因为我的局域网中目前没有打印机。所以 Net-SNMPsnmpget查询墨水量的命令应该是这样的:

snmpget                       \
  -c public                   \
   192.168.222.111            \
   ".1.3.6.1.2.1.43.11.1.1.9"

public标准社区字符串192.168.222.111打印机的 IP 地址在哪里。

于 2012-08-26T09:15:07.820 回答
5

我有一个支持 SNMP 的 HP 8600 pro N911a 来做一些挖掘工作,所以下面的命令可能会对你有所帮助。请注意,此特定模型存在一些固件问题,您无法使用 snmpget 查询“洋红色”,但您会看到 snmpwalk 的值(它执行某种递归向下钻取)。

旧:您可以查询值的名称和序列,但到目前为止我找不到“最大值”来计算一个干净的百分比;(。我猜到目前为止这些值是相对于 255,所以除以 2.55产生一个百分比。

更新:马塞洛的提示很棒!从寄存器 .8.* 您可以读取每个墨盒的最大级别,假设最大值只能是 8 位值,我完全错了。我已更新示例脚本以读取最大值并计算 c

在 Cacti 论坛上也有一些讨论。一个答案确认墨水量以百分比测量(值 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);'
于 2014-01-28T12:47:50.040 回答
2

我真的很喜欢tseeling的方法!

作为补充,我发现 OID 的最大值... .9并不是他猜测的 255,但它实际上因每个墨盒而异。这些值可以从 OID.1.3.6.1.2.1.43.11.1.1.8获得(除以这些值获得的结果与从 hplip.xml 运行 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 而不是 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;
}'
于 2014-10-06T23:03:12.170 回答
2

另一种方法是使用 ipp。虽然我尝试过的大多数打印机都支持这两种打印机,但我找到了一种仅适用于 ipp 的打印机和一种仅适用于我的 snmp 的打印机。

简单的方法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具有当前碳粉/墨水量,marker-high-levels最大(到目前为止,我在这里只看到了 100 个),marker-names描述了每个字段的含义(提示:对于您可能希望在第一个空格之后去除所有内容的颜色,许多打印机在此字段中包含墨盒类型) .

注意:以上是 2.3.1 的杯子。在 2.2.1 中,我不得不将关键字指定为一个字符串 ( "marker-colors,marker-h....)。或者可以完全保留,然后返回所有关键字。

有关可用属性的更多信息(打印机之间可能不同):https
: //www.cups.org/doc/spec-ipp.html 有关执行 ipp 调用的更多信息(包括 python 示例):https ://www.pwg.org/ipp /ippguide.html

于 2020-10-10T10:51:21.683 回答