わかりました、これは Windows 固有の質問です。
コンピュータに接続されたプリンタのインク レベルにアクセスできる必要があります。おそらく直接接続、またはネットワーク接続。
プリンター (または少なくともプリンター会社) ごとに異なる可能性が高いことは認識していますが、インクレベルを PC に明らかにする方法に関する情報はどこにありますか。また、この情報を読むのに最適な言語は何ですか?
さて、これはOSにとらわれない答えです... :-)
プリンターが非常に安価なモデルでない場合は、SNMP (Simple Network Management Protocol) のサポートが組み込まれています。SNMP クエリは、MIB (管理情報ベース) に格納されているネットワーク デバイスから現在の値を返すことができます。
プリンターには、 Printer MIBと呼ばれる標準定義があります。プリンター MIB は、インク マーキング プリンターがインク レベルにマップされる場合に、標準名とツリーの場所 (OID == ASN.1 表記のオブジェクト識別子) を定義します。prtMarkerSuppliesLevel
SNMP では、標準 MIB へのプライベート拡張も許可されていることに注意してください。ほとんどのプリンター ベンダーは、多くの追加情報を「プライベート MIB」に隠していますが、標準情報は、プリンター MIB OID のクエリを通じて常に利用できるはずです。
ほとんどすべてのプログラミング言語には、独自のアプリケーションから特定の SNMP クエリを作成するのに役立つ標準ライブラリがあります。
Net-SNMP
そのような実装の 1 つは、SNMP クエリを実行するためのいくつかの強力なコマンドライン ツールも付属していると呼ばれるオープン ソースです。
すべてのインクのすべてのレベルを照会するための OID は(この Web ページで私の考えを裏付けています) だと思いますが、現在 LAN 内にプリンターがないため、現時点では確認できません。したがって、インク レベルを照会する Net-SNMP のコマンドは次のようになります。.1.3.6.1.2.1.43.11.1.1.9
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 アドレスです。
私は SNMP 対応の HP 8600 pro N911a を使って掘り下げているので、次のコマンドが少し役立つかもしれません。この特定のモデルにはファームウェアの問題があることに注意してください。snmpget で「magenta」を照会することはできませんが、snmpwalk (ある種の再帰的なドリルダウンを行う) で値が表示されます。
古い: 値の名前とシーケンスを照会できますが、これまでのところ、クリーンなパーセンテージを計算するための「最大値」を見つけることができませんでした;(。これまでのところ、値は 255 に対する相対値であると推測しているので、2.55 で除算しますパーセンテージが得られます。
更新: マルセロのヒントは素晴らしかったです! Registers .8.* から、カートリッジごとの最大レベルを読み取ることができます。最大値が 8 ビット値にしかならないと仮定した私は完全に間違っていました。サンプル スクリプトを更新して、最大値を読み取り、c を計算しました。
また、Cacti フォーラムでも議論が行われています。1 つの回答は、インク レベルがパーセントで測定されていることを確認します (値 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 を使用していない場合は、お好みの OS 用の 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);'