¿Cómo recuperar cartuchos de nivel de tinta mediante programación (Epson StatusMonitor + Mac OS X)?
-
10-07-2019 - |
Pregunta
Estoy buscando una forma de consultar el nivel de tinta de mi Epson DX 4050 en Mac OS X. Hay una interfaz de usuario llamada EPSON StatusMonitor para mostrar los niveles de los cartuchos gráficamente, pero me gustaría obtenerla del comando línea para que pueda alimentar a un robot.
¿Alguna idea?
Solución
Esto va a ser una empresa. Realice ingeniería inversa de la aplicación StatusMonitor para averiguar cómo consulta a los controladores para encontrar el nivel de tinta o busque documentación para ello. Puede ser posible ingresar a la aplicación StatusMonitor para encontrar valores internos para sus widgets (tal cosa es posible con Windows, aunque sea hacky), pero es probable que todo el proceso sea un sumidero de tiempo :(
Otros consejos
Si la impresora admite SNMP, es posible que tenga la suerte de consultar con cualquier herramienta de línea de comandos SNMP. Existen definiciones estándar para impresoras y contienen API para consultar los niveles de tinta actuales y máximos.
Así es como lo hago con comandos simples de shell de Unix (requiere net-snmp instalado). Esto no es estrictamente Mac, pero debes tener una idea.
#!/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);'