Ejemplo conexión a un chip smartcard, utilizando Java
import java.util.List; import javax.smartcardio.Card; import javax.smartcardio.CardChannel; import javax.smartcardio.CardException; import javax.smartcardio.CardTerminal; import javax.smartcardio.ATR; import javax.smartcardio.CommandAPDU; import javax.smartcardio.ResponseAPDU; import javax.smartcardio.TerminalFactory; /** * Clase que maneja las conexiones PC/SC * * @version 2.0 Marzo de 2014 * @author Julio Chinchilla */ public class SCardConexion { private Card card = null; private CardChannel channel = null; /** * Devuelve una lista de objetos tipo CardTerminal, donde viene toda la * información de las terminales PC/SC conectadas * @return * @throws CardException */ public synchronized List<CardTerminal> terminals () throws CardException { TerminalFactory factory = TerminalFactory.getDefault(); return factory.terminals().list(); } /** * Metodo conncet abre la conección utilizando un canal básico con el PC/SC * @param t número de lector PC/SC conectado al puerto USB * @param protocol protocolo a utilizar durante la conección utilice ("T=0", "T=1", * o "T=CL"), o "*" para conectar al protocolo disponible durante la conexion * @return Un objeto de tipo ATR que contiene el mensaje de contacto Anwer to reset * @see <a href="http://es.wikipedia.org/wiki/Tarjeta_inteligente">WikiES: Tarjeta inteligente</a> * @see <a href="http://en.wikipedia.org/wiki/Answer_to_reset">WikiEng: Answer to reset</a> * @throws CardException */ public synchronized ATR connect (int t, String protocol) throws CardException { CardTerminal terminal = this.terminals().get(t); card = terminal.connect(protocol); card.beginExclusive(); channel = card.getBasicChannel(); return card.getATR(); } /** * Metodo transmit, transmite un comando hacia el canal abierto de la conexión PC/SC * @param apdu recibe un objeto de tipo CommandAPDU * @return Un objeto de tipo ResponseAPDU que contiene la data de respuesta Response Data Lr y SW1-SW2 * @see <a href="http://es.wikipedia.org/wiki/Application_Protocol_Data_Unit">WikiES: Application Protocol Data Unit</a> * @throws CardException */ public synchronized ResponseAPDU transmit (CommandAPDU apdu) throws CardException { return channel.transmit(apdu); } /** * Metodo disconnect, desconeta la conexion PC/SC terminando el canal exclusivo * @throws CardException */ public synchronized void disconnect () throws CardException { card.endExclusive(); card.disconnect(true); } }
Hola…muchas gracias por el ejemplo…muy claro, pero tengo una duda, sabes como escribir y leer en las tarjetas?? gracias
buena pregunta, no he tenido la oportunidad de hacerlo, pero seguro que debes tener un writer smartcard… saludos…
Muchas gracias por el ejemplo la verdad esta muy claro y muy bien explicado, pero tengo una duda como se cual es el número de lector PC/SC conectado al puerto USB
lo siento si mi pregunta es muy obvia y de ante mano te agradezco
saludos,
Hola por default si solo hay un lector conectado es el 0. Pero para eso está método terminals() que lo puedes llamar antes de hacer la conexión y te va devolver todos los lectores conectados…
Muchas gracias por tu pronta respuesta Julio, te comento que e llamado previamente el método terminals() pero no me retorna nada pero al enviarle como parámetro 0 si conecta con la tarjeta, ahora bien quiero leer un DPI para un proyecto de la universidad pero no se que mandarle como CommandAPDU tu me podrías ayudar?
Gracias por el apoyo
Lo que te devuelve es una Lista de objetos CardTerminal, ese objeto trae sus metodos como getName() o isCardPresent(), no devuelve el número de objeto pero en el recorrido de la lista puedes agrear el número usando el del recorrido. Por cierto: Voy a estar dando una charla en el Java Day 2017, los temas a abarcar son: Conexiones SmartCard y Lectura de Tarjetas de crédito, tocaré temas como los estándares IS7816 y el EMV. La idea es ver el tema de SmartCard desde cero y tocar estándares que usan las tarjetas de crédito, asi como ciertos detalles de operaciones con bits y la libería smartcardio de java.
Hola Gracias por los ejemplos e información proporcionada, me ha servido de ayuda. Yo también estoy haciendo un proyecto sobre esto, pero al igual a al comentario de la persona anterior me confunde un poco el tema de CommandAPDU y los datos obtenidos. Gracias por compartir.
Voy a estar dando una charla en el Java Day 2017, los temas a abarcar son: Conexiones SmartCard y Lectura de Tarjetas de crédito, tocaré temas como los estándares IS7816 y el EMV.