6

わかりました、これは Windows 固有の質問です。

コンピュータに接続されたプリンタのインク レベルにアクセスできる必要があります。おそらく直接接続、またはネットワーク接続。

プリンター (または少なくともプリンター会社) ごとに異なる可能性が高いことは認識していますが、インクレベルを PC に明らかにする方法に関する情報はどこにありますか。また、この情報を読むのに最適な言語は何ですか?

4

4 に答える 4

13

さて、これは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.9snmpget

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 で「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);'
于 2014-01-28T12:47:50.040 に答える