2012-08-25 109 views
3

好的,這是一個Windows特定的問題。如何以編程方式訪問打印機的墨水量?

我需要能夠訪問連接到計算機的打印機的墨水量。可能是直接連接或網絡連接。

我意識到每臺打印機(或至少打印機公司)可能會有所不同,但我可以在哪裏找到有關如何向PC顯示墨水量的信息。此外,閱讀此信息的最佳語言是什麼?

+0

對於網絡打印機,最簡單的方法可能是從其網絡界面獲取信息。 – aland

+0

我在哪裏可以找到這樣的文檔? – Cruncher

+2

我不知道這樣的文檔是否存在,但是你可以解析web界面返回的html來查找你的數據,這通常不是一個大問題。 – aland

回答

9

好吧,這是一個與操作系統無關的答案... :-)

如果打印機是不是一個很小氣鬼模式,這將有內置的支持SNMP(簡單網絡管理協議)。 SNMP查詢可以從存儲在其MIB(管理信息庫)中的網絡設備返回當前值。

對於打印機,有一個定義爲Printer MIB的標準。對於prtMarkerSuppliesLevel,打印機MIB定義標準名稱和樹位置(OID == 對象標識符ASN.1 notation),其中在墨水標記打印機的情況下映射到墨水水平。

請注意,SNMP還允許專用擴展到標準MIB。大多數打印機供應商確實在其「專用MIB」中隱藏了許多其他信息,但標準信息應始終可通過Printer MIB OID的查詢獲得。

實際上,每種編程語言都有標準庫,可以幫助您從自己的應用程序中進行特定的SNMP查詢。

一個這樣的實現是開源的,名爲Net-SNMP,它還附帶了一些強大的命令行工具來運行SNMP查詢。

認爲的OID查詢所有級別的所有油墨是.1.3.6.1.2.1.43.11.1.1.9this webpage證實了我認爲),但我無法驗證,現在,因爲我不此刻在我的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地址。

+1

重要的是要注意,prtMarkerSuppliesLevel不會爲您提供墨水量測量。用於確定這個供應水平的度量單位可以從墨水值到估計剩餘紙張在用完之前剩餘的範圍。您需要檢查打印機正在使用的prtMarkerSuppliesSupplyUnit值。到目前爲止,我已經看到了19種預定義的測量類型,其中只有3種與墨量有關 –

5

我有一臺支持SNMP的HP 8600 pro N911a,可以進行一些挖掘工作,因此以下命令可能會對您有所幫助。注意這個特定的模型有一些固件問題,你不能用snmpget查詢「magenta」,但是你會看到snmpwalk的值(它會進行某種遞歸下鑽)。你可以查詢名稱和值的順序,但是我找不到「最大值」來計算一個乾淨的百分比到目前爲止;(。我猜到目前爲止這些值是相對於255,所以除以2.55得到一個百分比

更新:Marcelo的提示很棒!從寄存器.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

我真的很喜歡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 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; 
}' 
相關問題