public void ConnectToSmartCard() { try { TerminalFactory factory = TerminalFactory.getDefault(); List<CardTerminal> terminals = factory.terminals().list(); System.out.println("Terminals: " + terminals); // get the first terminal // CardTerminals.State. CardTerminal terminal = terminals.get(0); if (terminal.isCardPresent()) { JOptionPane.showMessageDialog(null, "Card is Present"); this.terminal = terminal; } else { JOptionPane.showMessageDialog(null, "Card is absent.Connnect it in 5 secs\nWaiting..."); terminal.waitForCardPresent(5000); JOptionPane.showMessageDialog(null, "Time is Up!\nBye!!!"); return; } // establish a connection with the card Card card = terminal.connect("*"); this.card1 = card; } catch (CardException ce) { } }
/** * Used to get the name of the readers connected. * * @return A list of the names. */ public ArrayList<String> getReadersName() { ArrayList<String> list = new ArrayList<>(); try { for (CardTerminal terminal : terminalFactory.terminals().list()) list.add(terminal.getName()); } catch (CardException exception) { } return list; }
/** * Function to connect to the MSC * * @throws TokenException */ public void connect() throws TokenException { int i, j; try { /* * Get all available terminals.. */ TerminalFactory factory = TerminalFactory.getDefault(); List<CardTerminal> terminals = factory.terminals().list(); if (terminals.isEmpty()) { throw new TokenException("No terminals found"); } /* * Select appropriate terminal */ CardTerminal terminal = null; for (i = 0; i < terminals.size(); i++) { /* * Try the known terminal names the msc-driver uses.. */ for (j = 0; j < TERMINAL_NAMES.length; j++) { if (terminals.get(i).getName().startsWith(TERMINAL_NAMES[j])) { terminal = terminals.get(i); break; } } } if (terminal == null || !terminal.isCardPresent()) { throw new TokenException("No G&D MSC found in terminal(s)"); } /* * Establish a connection with the myCard */ myCard = terminal.connect("T=1"); myChannel = myCard.getBasicChannel(); /* * Of the several AIDs in distribution, try to select one that * actually works.. ;) */ boolean appSelected = false; for (i = 0; i < APPLET_IDS.length; i++) { if (appSelected = selectApplet(APPLET_IDS[i])) { break; } } if (!appSelected) { throw new TokenException("Could not select Applet"); } } catch (TokenException e) { throw e; } catch (Exception e) { throw new TokenException("Some exception occured: " + e.toString()); } }
public synchronized List<CardTerminal> list(State state) throws CardException { // System.out.println("list"); if (state == null) { throw new NullPointerException(); } try { String[] readerNames = SCardListReaders(contextId); List<CardTerminal> list = new ArrayList<CardTerminal>(readerNames.length); if (stateMap == null) { // If waitForChange() has never been called, treat event // queries as status queries. if (state == CARD_INSERTION) { state = CARD_PRESENT; } else if (state == CARD_REMOVAL) { state = CARD_ABSENT; } } for (String readerName : readerNames) { CardTerminal terminal = implGetTerminal(readerName); ReaderState readerState; switch (state) { case ALL: list.add(terminal); break; case CARD_PRESENT: if (terminal.isCardPresent()) { list.add(terminal); } break; case CARD_ABSENT: if (terminal.isCardPresent() == false) { list.add(terminal); } break; case CARD_INSERTION: readerState = stateMap.get(readerName); if ((readerState != null) && readerState.isInsertion()) { list.add(terminal); } break; case CARD_REMOVAL: readerState = stateMap.get(readerName); if ((readerState != null) && readerState.isRemoval()) { list.add(terminal); } break; default: throw new CardException("Unknown state: " + state); } } return Collections.unmodifiableList(list); } catch (PCSCException e) { throw new CardException("list() failed", e); } }
public boolean IsCardPresent() { boolean Ispresent = false; if (card1 != null && terminal != null) { try { if (terminal.isCardPresent()) { Ispresent = true; } else { Ispresent = false; } } catch (CardException ce) { } } else { // JOptionPane.showMessageDialog(null,"SmartCard Initialization Problem\nBye!!!"); } return Ispresent; }
/** * What is doing the thread. * * <p>Will check if there is a reader available containing the wanted name (will call {@link * TerminalListener#cardReaderRemoved()} ()} if a listener is removed or added). If it is the case * it will wait for a card placed, call {@link TerminalListener#cardAdded(RFIDCard)}, wait for the * card to be removed then call {@link TerminalListener#cardRemoved()} */ @Override public void run() { while (!Thread.interrupted()) { if (terminalFactory == null) try { Thread.sleep(500); } catch (InterruptedException e) { } boolean lastPresent = this.isPresent; try { final CardTerminals terminalList = terminalFactory.terminals(); CardTerminal cardTerminal = null; try { for (CardTerminal terminal : terminalList.list()) if (terminal.getName().equals(this.terminalName)) { cardTerminal = terminal; this.isPresent = true; break; } } catch (CardException exception) { } if (cardTerminal == null) this.isPresent = false; if (this.isPresent != lastPresent) { if (this.isPresent) logger.log(Level.INFO, "Starting listening terminal " + cardTerminal.getName()); else logger.log(Level.INFO, "Stopped listening"); for (TerminalListener listener : this.listenersTerminal) if (this.isPresent) listener.cardReaderAdded(); else listener.cardReaderRemoved(); } if (!this.isPresent) continue; logger.log(Level.INFO, "Waiting for card..."); cardTerminal.waitForCardPresent(0); logger.log(Level.INFO, "Card detected"); this.lastCard = getCardInfos(cardTerminal.connect("*")); for (TerminalListener listener : this.listenersTerminal) listener.cardAdded(this.lastCard); cardTerminal.waitForCardAbsent(0); this.lastCard = null; logger.log(Level.INFO, "Card removed"); for (TerminalListener listener : this.listenersTerminal) listener.cardRemoved(); } catch (Exception exception) { logger.log(Level.WARNING, "", exception); } } }
static List<CardTerminal> waitForCards( List<? extends CardTerminal> terminals, long timeout, boolean wantPresent) throws CardException { // System.out.println("waitForCards"); // the argument sanity checks are performed in // javax.smartcardio.TerminalFactory or TerminalImpl long thisTimeout; if (timeout == 0) { timeout = TIMEOUT_INFINITE; thisTimeout = TIMEOUT_INFINITE; } else { // if timeout is not infinite, do the initial call that retrieves // the status with a 0 timeout. Otherwise, we might get incorrect // timeout exceptions (seen on Solaris with PC/SC shim) thisTimeout = 0; } String[] names = new String[terminals.size()]; int i = 0; for (CardTerminal terminal : terminals) { if (terminal instanceof TerminalImpl == false) { throw new IllegalArgumentException( "Invalid terminal type: " + terminal.getClass().getName()); } TerminalImpl impl = (TerminalImpl) terminal; names[i++] = impl.name; } int[] status = new int[names.length]; Arrays.fill(status, SCARD_STATE_UNAWARE); try { while (true) { // note that we pass "timeout" on each native PC/SC call // that means that if we end up making multiple (more than 2) // calls, we might wait too long. // for now assume that is unlikely and not a problem. status = SCardGetStatusChange(contextId, thisTimeout, status, names); thisTimeout = timeout; List<CardTerminal> results = null; for (i = 0; i < names.length; i++) { boolean nowPresent = (status[i] & SCARD_STATE_PRESENT) != 0; if (nowPresent == wantPresent) { if (results == null) { results = new ArrayList<CardTerminal>(); } results.add(implGetTerminal(names[i])); } } if (results != null) { return Collections.unmodifiableList(results); } } } catch (PCSCException e) { if (e.code == SCARD_E_TIMEOUT) { return Collections.emptyList(); } else { throw new CardException("waitForCard() failed", e); } } }