package cz.frantovo.cipovaKarta; import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; import javax.smartcardio.ATR; import javax.smartcardio.Card; import javax.smartcardio.CardChannel; import javax.smartcardio.CardException; import javax.smartcardio.CardTerminal; import javax.smartcardio.TerminalFactory; import javax.swing.JOptionPane; /** * * @author xkucf03s */ public class Pokusy { private static final Logger log = Logger.getLogger(Pokusy.class.getName()); /** * @param args the command line arguments */ public static void main(String[] args) { try { new Pokusy(); } catch (Exception e) { log.log(Level.SEVERE, "Stala se chyba.", e); } } public Pokusy() throws Exception { System.setProperty("sun.security.smartcardio.library", "/usr/lib/libpcsclite.so.1"); /** Rozpoznáme čtečkové továrny */ TerminalFactory cteckovaTovarna = TerminalFactory.getInstance("PC/SC", null); //TerminalFactory t = TerminalFactory.getDefault(); log.log(Level.INFO, "Typ čtečkové továrny: " + cteckovaTovarna.getType()); /** Vypíšeme si seznam čteček */ for (CardTerminal ctecka : cteckovaTovarna.terminals().list()) { log.log(Level.INFO, "---------------------------"); log.log(Level.INFO, "Terminál: " + ctecka.getName()); pouzijCtecku(ctecka); log.log(Level.INFO, "---------------------------"); } } private void pouzijCtecku(CardTerminal ctecka) throws CardException { if (ctecka.isCardPresent()) { log.log(Level.INFO, "Karta vložena: " + ctecka.isCardPresent()); log.log(Level.INFO, "Čekám na vysunutí karty"); if (ctecka.waitForCardAbsent(1000)) { log.log(Level.INFO, "Karta vysunuta."); } else { log.log(Level.INFO, "Lhůta vypršela, použijeme kartu."); Card karta = ctecka.connect("*"); pouzijKartu(karta); } } else { int l = 10; log.log(Level.INFO, "Čekám na vložení karty (" + l + " vteřin)"); if (ctecka.waitForCardPresent(l * 1000)) { log.log(Level.INFO, "Karta vložena."); Card karta = ctecka.connect("*"); pouzijKartu(karta); } else { log.log(Level.INFO, "Lhůta vypršela, končím program."); } } skenujKarty(ctecka); } private void pouzijKartu(Card karta) throws CardException { log.log(Level.INFO, "Protokol karty: " + karta.getProtocol()); ATR atr = karta.getATR(); String atrString = Arrays.toString(atr.getBytes()); log.log(Level.INFO, "ATR: " + atrString); JOptionPane.showMessageDialog(null, "Vložena karta: " + atrString, "Čipová karta", JOptionPane.INFORMATION_MESSAGE); CardChannel kanal = karta.getBasicChannel(); log.log(Level.INFO, "Číslo kanálu: " + kanal.getChannelNumber()); //ResponseAPDU odpoved = kanal.transmit(new CommandAPDU(poleBajtů)); //log.log(Level.INFO, "Odpověď na PIN: " + Arrays.toString(odpoved.getData())); } private void skenujKarty(CardTerminal ctecka) throws CardException { while (true) { int l = 10; log.log(Level.INFO, "Čekám na vložení karty (" + l + " vteřin)"); if (ctecka.waitForCardPresent(l * 1000)) { log.log(Level.INFO, "Karta vložena."); Card karta = ctecka.connect("*"); pouzijKartu(karta); log.log(Level.INFO, "Čekám na vysunutí karty (" + l + " vteřin)"); if (ctecka.waitForCardAbsent(l * 1000)) { log.log(Level.INFO, "Karta vysunuta."); } else { log.log(Level.INFO, "Lhůta vypršela, končím."); return; } } else { log.log(Level.INFO, "Lhůta vypršela, končím."); return; } } } }