Lector ACR122U en Java. Parte I

Se va a realizar una pequeño programa en java para conectarnos con un lector ACR122U.

El lector en cuestión es esté:

lector
Lector ACR122U

Lo primero a realizar es instalar los driver dependiendo de la plataforma en este link pueden descargarlos e instalarlos.

Java contiene una api, llamada Java Smart Card I/O API, la cual nos proporciona una serie de clases y metodos suficientes para poder trabajar con lectores de tarjetas inteligentes.

Obtener lista de los lectores disponibles

Primero que nada vamos a trabajar con la clase TerminalFactory, a partir de la cual conoceremos todas las terminales que esten conectadas a las computadora. El código es el siguente:


import java.util.List;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;

public class ACR122U_Wordpress {

    public static void main(String[] args) {
        TerminalFactory terminales = TerminalFactory.getDefault();
        try {
            List cards = terminales.terminals().list();
            System.out.println(cards);
        } catch(CardException e) {
            e.printStackTrace();
        }
    }
}

Para empezar se crea una instanca de la clase TerminalFactory, no tiene constructores por defecto, así que se llama a uno de sus metodos estaticos para inicializarlo, en este caso el método es getDefault(). El objetivo de esta instancia es poder acceder a todas las terminales o lectores que la API soporte.

Enseguida obtenemos una lista de todas las terminales soportadas que se encuentren conectadas, el método terminals() nos devuelve una instancia de CardTerminals, nosotros los convertimos a una lista con la llamada a list(); esta llamada a list() nos puede causar una excepcion de tipo CardException, por eso va encerrado de un bloque try-catch. Para finallizar este programa imprimimos una lista de los lectores conectados.

lectores_conectados
Salida de los lectores conectados

En caso de que tengan conectado su lector y no les aparezca en la lista pueden revisar que sus drivers se hayan instalado correctamente, y que el led de su lector este encendido en rojo, cuando acerquen una tarjeta se prenda en verde; ese es el funcionamiento natural del lector.

Conectarnos a un lector disponible

En la salida anterior nos dimos cuenta de que solo tenemos un lector disponible, así que desde ese escenario, podemos obtener una instalcia al primer objeto de la lista, el cual sería el objeto 0, el programa quedaría de la siguiente forma:

import java.util.List;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CardTerminals;
import javax.smartcardio.TerminalFactory;

public class ACR122U_Wordpress {

    public static void main(String[] args) {
        TerminalFactory terminales = TerminalFactory.getDefault();
        try {
            List cards = terminales.terminals().list();
            CardTerminal lectorACR122U = cards.get(0);
            System.out.println(lectorACR122U.getName());
        } catch(CardException e) {
            e.printStackTrace();
        }
    }
}

Ahora solamente declaramos una instancia de CardTerminal, llamada lectorACR122U, despues imprimimos el nombre del lector llamando al método getName().

El otro método que tenemos para conectarnos al lector es obtener una instancia a traves de su nombre, para esto primero tenemos que descubrir su nombre exacto, en este caso directamente creamos una instancia de CardTerminals y de ahí llamamos a su método getTerminal(«Nombre del dispositivo») pasandole como parametro el nombre del dispositivo. Aquí al no ocupar el método list(), no es necesario una excepcion de CardException, pero si es necesaria una excepcion de NullPointerException.

import javax.smartcardio.CardTerminal;
import javax.smartcardio.CardTerminals;
import javax.smartcardio.TerminalFactory;

public class ACR122U_Wordpress {

    public static void main(String[] args) {
        TerminalFactory terminales = TerminalFactory.getDefault();
        try {
            CardTerminals cards = terminales.terminals();
            CardTerminal lectorACR122U = cards.getTerminal("ACS ACR122 0");
            System.out.println(lectorACR122U.getName());
        } catch(NullPointerException e) {
            e.printStackTrace();
        }
    }
}

En cualquiera de los dos casos la salida es la misma:

nombre_lector
Nombre del lector

Detectar la presencia de una tarjeta

Una vez que nos hayamos conectado a un lector, en este caso al lector ACR122U, vamos a detectar la presencia de una tarjeta, despues de finalizado correctamente el primer bloque try-catch, para conectarnos al dispositivo, buscaremos la presencia de una tarjeta por un tiempo de 2 minutos. El código es el siguiente:

import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.CardTerminals;
import javax.smartcardio.TerminalFactory;

public class ACR122U_Wordpress {

    public static void main(String[] args) {
        TerminalFactory terminales = TerminalFactory.getDefault();
        CardTerminal lectorACR122U;
        try {
            CardTerminals cards = terminales.terminals();
            lectorACR122U = cards.getTerminal("ACS ACR122 0");
        } catch(NullPointerException e) {
            e.printStackTrace();
            return;
        }
        // Bloque para detectar la presencia de una tarjeta por
        // un intervalo de 2 minutos
        try {
           lectorACR122U.waitForCardPresent(120000);
           if(lectorACR122U.isCardPresent()) {
               System.out.println("Se detecto la presencia de una tarjeta");
           } else {
               System.out.println("No se detecto la presencia de una tarjeta");
           }
        } catch(CardException e) {
            e.printStackTrace();
        }
    }
}

Una vez inicializado el objeto lectorACR122U, llamamos al método waitForCardPresent(120000), el cual espera a que el lector detecte la presencia de una tarjeta cerca, recibe como parametro el tiempo en milisegundos que va a esperar, en este caso 2 minutos, 120 segundos o 120000 milisegundos; en caso de que reciba como parametro un 0 entonces esperará indefinidamente, si es un número negativo se producirá un error y el programa finalizará.

Posteriormente cuando detecte una tarjeta cerca, el led del lector se pondrá en verde, sonara una alarma o pitido, y el programa continuará a la siguiente linea; en este caso esta dentro de un bloque if, el cual pregunta si existe una tarjeta disponible(es decir que una tarjeta esta cerca del lector), por medio del metodo isCardPresent(), en caso de que haya una tarjeta cerca retorna true, de lo contrario será false, entonces imprime un mensaje de se detecto una tarjeta.

Si finaliza el tiempo despues de dos minutos y no detecta la presencia de una tarjeta entonces nos envia un mensaje de «No se detecto la presencia de una tarjeta» y el programa finaliza.

tarjeta_presente
Tarjeta presente
tarjeta_no_presente
Tarjeta no presente

Está es la primera parte, donde realizamos una busqueda de los lectores conectados fisicamente a la computadora, acceder a una instancia del lector y detectar cuando una tarjeta sea detectada por el lector.

El la siguiente parte vamos a conocer como grabar una tarjeta con un programa independiente, pero con el mismos lector, para posteriormente realizar un programa que lea los datos dentro de la tarjeta.

1 comentario

  1. Harun Vazquez dice:

    Man, excelente!! Me sacaste un apuro, tengo uno de esos lectores ACR122U y no sabia como hacerlo andar en Java, pero parece ser que con esas librerías genéricas que trae el JDK es posible manipularlo 🙂

    Por cierto, ya saca la parte 2, necesito saber como escribir en la tarjeta 😦

    O no tienes algún dato donde te pueda contactar y me puedas ayudar con este proyecto? Saludos

    Me gusta

Deja un comentario