Canon打印机检查墨水:如何以编程方式访问打印机的墨水级别

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

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

我知道,对于每台打印机(或至少是打印机公司)来说,它可能会有所不同,但我在哪里可以找到它们如何向电脑显示墨水水平的信息。此外,阅读这些信息的最佳语言是什么?

14

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

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

对于打印机,有一个定义为Printer MIB的标准。打印机MIB为0定义标准名称和树位置(OID==对象标识符,在ASN.1 notation中),在墨迹标记打印机的情况下,映射到墨迹级别。

请注意,SNMP还允许对标准MIB进行私有扩展。大多数打印机供应商确实在其“专用MIB”中隐藏了许多其他信息,尽管标准信息应始终通过查询打印机MIB OID可用。

实际上,每种编程语言都有标准库,可以帮助您从自己的应用程序进行特定的SNMP查询。

一个这样的实现是名为Net-SNMP的开源,它还附带了一些强大的命令行工具来运行SNMP查询。

认为查询所有墨水的所有级别的OID是.1.3.6.1.2.1.43.11.1.1.9this webpage证实了我的看法),但我现在无法验证这一点,因为我的LAN中目前没有打印机。因此,Net SNMP的i>1命令用于查询墨水级别,应该类似于:

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

其中,0是标准的社区字符串,1是打印机的IP地址。

5

我身边有一台支持SNMP的HP 8600 pro N911a,可以进行一些挖掘,因此以下命令可能会对您有所帮助。请注意,这个特定的模型有一些固件问题,您不能使用snmpget查询“洋红色”,但您可以使用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);'
3

另一种方法是使用ipp。虽然我尝试的大多数打印机都支持这两种功能,但我发现其中一种只适用于ipp,另一种仅适用于snmp。

使用ipptool的简单方法:

创建文件colors.ipp

{
    VERSION 2.0
    OPERATION Get-Printer-Attributes
    GROUP operation-attributes-tag
    ATTR cht "attributes-cht" "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-cht (cht) = 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-cht (cht) = 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

0有当前的墨粉/墨水量,1是最大值(到目前为止,我在这里只看到了100),2描述每个字段的含义(提示:对于您可能希望在第一个空格后去掉所有内容的颜色,许多打印机在此字段中包括墨盒类型)。

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

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

2

我真的很喜欢泽林的方法!

作为补充,我发现OID... .9的最大值并不像他所猜测的那样是255,但实际上每个盒带的值都不同。这些值可以从OID中获得(除以这些值得到的结果与从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而不是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;
}'

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(291)
Cod14纪念品:为Blackberry生成COD文件
上一篇
Cet六级多少分及格:计算两次之间有多少分钟(how many minutes in a year)
下一篇

相关推荐

  • cvt变速箱结构图解:CVT变速箱的工作原理

    CVT变速箱是一种无级变速箱,它的结构由两个部分组成:输入轴和输出轴。输入轴由发动机驱动,输出轴将变速箱的输出转移到车轮上。输入轴上安装有一个可变的滑轮,它可以改变输入轴的传动比,从而改变变速箱的输出比。另外,输入轴上还安装有一个液压系统,它可以控制滑轮的位置,从而改变输入轴的传动比。…

    2023-04-02 04:00:04
    0 58 84
  • xcode代码格式化快捷键:使用Command + I快速格式化Xcode代码

    格式化的方法格式化的方法Xcode代码格式化快捷键:Option+Command+F…

    2023-07-13 12:44:06
    0 33 50
  • cv树洞柒夜事件CV树洞中的秘密与惊奇

    cv树洞柒夜事件是一个有趣的计算机视觉活动,它提供了一种新的方式来利用计算机视觉技术来探索和发现景观。它始于2020年7月,由一群热爱计算机视觉的研究者和开发者发起,他们希望通过使用机器学习技术来探索景观中的精彩之处。cv树洞柒夜事件的目标是使用机器学习技术来探索景观中的精彩之处,并利用这些发现来改善景观设计。参与者需要使用机器学习技术来探索景观,并利用这些发现来改善景观设计。参与者可以使用Python,OpenCV,TensorFlow等技术来完成任务,并将其发布在GitHub上。…

    2023-01-09 12:42:42
    0 45 46
  • win10怎么cmd打开设置:如何在Windows 10中使用CMD打开设置

    打开“开始”菜单,点击搜索框,输入cmd,然后按下回车键。在弹出的命令提示符窗口中,输入以下代码:start ms-:…

    2023-06-07 01:59:36
    0 77 53
  • win7安装cad2020:如何在Windows 7上安装AutoCAD 2020

    从官网下载CAD 2020的安装包,并双击安装文件;按照安装向导的提示,选择安装语言、安装位置和安装类型;…

    2023-09-28 00:41:59
    0 75 28
  • java protected关键字:使用protected关键字保护类成员的优点

    示例示例关键字是java中的修饰符,它可以修饰类、变量和方法。修饰类:修饰的类只能在同一个包内被访问,如果子类继承了修饰的父类,则子类可以在不同包内访问父类的成员。…

    2023-04-18 04:45:37
    0 13 74
  • codeblocks手机版下载一款强大的跨平台编程工具

    CodeBlocks是一款免费的、开源的、跨平台的C/C++ IDE,支持多种编程语言,可以用来编写、调试和编译代码。目前CodeBlocks的手机版本只支持Android系统,而且只支持C语言,不支持C++。…

    2023-06-25 04:48:50
    0 19 79
  • go和come的区别:去吧!来吧!改变你的未来

    示例示例go和come的区别:Go是一个动词,表示“去”的意思,指的是从一个地方到另一个地方的运动。Come是一个动词,表示“来”的意思,指的是从另一个地方到当前地方的运动。…

    2023-05-25 16:09:00
    0 55 20

发表评论

登录 后才能评论

评论列表(69条)