Как получить уровень чернил в картриджах программно (Epson StatusMonitor + Mac OS X)? - PullRequest
1 голос
/ 24 ноября 2008

Я ищу способ запросить уровень чернил для моего Epson DX 4050 в Mac OS X. Существует некоторый пользовательский интерфейс под названием EPSON StatusMonitor для графического отображения уровней картриджей, но я хотел бы получить его из командной строки. линия, чтобы он мог кормить робота.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 24 ноября 2008

Это будет мероприятие. Либо перепроектируйте приложение StatusMonitor, чтобы узнать, как оно запрашивает драйверы, чтобы определить уровень чернил, либо найдите некоторую документацию для него. Возможно, можно заглянуть в приложение StatusMonitor, чтобы узнать внутренние значения для его виджетов (такое возможно в Windows, хотя и хакерски), но весь процесс, скорее всего, будет провалом во времени:

0 голосов
/ 30 марта 2017

Если принтер поддерживает SNMP, возможно, вам повезет запросить любой инструмент командной строки SNMP. Существуют стандартные определения для принтеров, и они содержат API для запроса текущего и максимального уровня чернил.

Вот как я делаю это с помощью простых команд оболочки Unix (требуется установленный net-snmp). Это не строго Mac, но вы должны понять.

#!/bin/sh

me="${0##*/}"

host="${1:-wp4535}"

base=1.3.6.1.2.1.43.11.1.1

name="WP-4535"

type=$(snmpget -v1 -c public ${host} SNMPv2-MIB::sysDescr.0)

case "$type" in
"SNMPv2-MIB::sysDescr.0 = STRING: EPSON"*)
    type=epson
    ofs=1
;;
*)
    echo "! unknown printer type" 1>&2
    exit 1
;;
esac
echo "# $host $type $name"

# get current ink levels
eval $(snmpwalk -v1 -Ov -OQ -c public ${host} ${base}.6.${ofs} |
perl -ne 'print "c[",++$c,"]=$1\n" if(m!"(\w+) ink!i);')

# get max ink level per cartridge
eval $(snmpwalk -v1 -Ov -OQ -c public ${host} ${base}.8.${ofs} |
perl -ne 'print "max[",++$c,"]=$1\n" if(m!(\d+)!i);')

snmpwalk -v1 -Ov -OQ -c public ${host} ${base}.9.${ofs} |
perl -ne '
    my @c=("","'${c[1]}'","'${c[2]}'","'${c[3]}'","'${c[4]}'");
    my @max=("","'${max[1]}'","'${max[2]}'","'${max[3]}'","'${max[4]}'");
    my $v=$c[++$c];
    printf"# $v=$1 (%.0f)\n",$1/$max[$c]*100 if(m!(\d+)!i);'
...