Google
 
Web javaenespanol.blogspot.com

Friday, February 08, 2008

Abriendo un cajón de dinero con Java

Hace unos días se me presentó la tarea de abrir un cajón de dinero mediante el puerto serie (RS-232) a través de un sistema de Punto de Venta web. Este cajón, es un POSLine Modelo CD-040.

La caja donde venía, contenía lo siguiente:
  1. Una simple hoja con especificaciones (no presentaba manual).
  2. Una pieza que se coloca en la PC como si de un dispositivo PCI se tratase (misma que servía para alimentar al cajón mediante alguno de los conectores de corriente que normalmente conectamos a los discos duros o lectoras de CD/DVD) y que tiene un jack hembra RJ-11 (los jacks que usan los teléfonos)
  3. El cajón en sí, al cual le salía un cable que tenía el conector RS-232 (puerto serie) y, a manera de bifurcación, un RJ-11, mismo que se conectaba al dispositivo del punto 2.
El problema, fue que el cliente no me dijo del dispositivo del punto 2, y se presentó en mi oficina con el cajón y el cable. Yo, no había tenido contacto con ese tipo de cajones, así que procedí a investigar al respecto.

En las múltiples páginas que consulté decía que los cajones podían ser de dos tipos: Serie, conectado a la PC, o RJ-11, conectado a una impresora de tickets, en este caso, una Epson TM-u220, así que me pareció un trabajo fácil, puesto que, según yo, el cajón era híbrido.
Investigué sobre los comandos de Epson, llegué a varias páginas donde decían cual era el comando, envié el código a la impresora, previamente conectado el cajón mediante el RJ-11 y no pasaba nada, después, procedí a conectar el cajón al puerto serie, y utilicé lo siguiente para abrirlo:

Windows: echo > COM1
Linux: echo >
/dev/ttyS0

por supuesto, abrió, pero el problema era que tenía que ser abierto desde web, así que me puse a investigar sobre cómo hacerlo con Java.

Me encontré con la sorpresa de que Java había quitado el soporte para puertos serie bajo Windows, así es que llegué a dos soluciones alternas: RXTXComm y otra implementación de javax.comm que no recuerdo.

Intenté abrirlo, lo logré, convertí en Applet mi aplicación Java, y volvió a abrir, creé el JAR, firmé el applet, lo cargué en Firefox y nada, me decía que no encontraba la clase principal, hice todo lo que se me ocurrió, puse en PATH el .dll, el rxtxcomm.jar, etc, etc, etc, claro, pasando por el infierno de que Windows refresca la PATH cada que se le ocurre.

La cantidad de código que se tenía que usar para conectar al puerto serie, y sobretodo, la idea de tener que poner archivos externos en la JRE local, no terminaba por convencerme, así que decidí una vía alterna, simplemente ejecutar la linea echo > COM1 desde Java, puesto que los clientes web que accederían al sistema serían windows, además de que el cajón estaría conectado a uno de los clientes, no al servidor (un WAMP).
Entonces, hice lo siguiente:


package cashdrawer;

public class OpenCashDrawer extends Applet{
public void init() {
super.init();
doCall();
}

public static void doCall(){
try {
String[] command={"cmd","/c","echo 'anything' > COM1"};
Process p = Runtime.getRuntime().exec(command);
p.waitFor();
System.out.println(p.exitValue());
}
catch (Exception err) {
err.printStackTrace();
}
}
}

Hice el JAR, firmé el applet y voilá, funcionó!!

Probablemente sea una solución poco ortodoxa, pero hace su tarea, faltaría agregar
que pueda ejecutarse en Linux (eso es facil) y también que se pueda ejecutar como
standalone poniendo el método main.

Espero que les sirva. Hasta pronto.

0 Comments:

Post a Comment

<< Home