trovato una soluzione da esempio di card-emul in SDK for PC/SC
in http://www.springcard.com. Qui è il mio codice:
import java.util.List;
import javax.smartcardio.CardException;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;
public class TestPcsc {
public static void main(String[] args) throws CardException {
TerminalFactory tf = TerminalFactory.getDefault();
List<CardTerminal> terminals = tf.terminals().list();
CardTerminal cardTerminal = (CardTerminal) terminals.get(0);
byte[] command = { (byte) 0xE0, (byte) 0x00, (byte) 0x00, (byte) 0x29, (byte) 0x01, (byte) 0x00 };
cardTerminal.connect("DIRECT").transmitControlCommand(CONTROL_CODE(), command);
}
public static int CONTROL_CODE() {
String osName = System.getProperty("os.name").toLowerCase();
if (osName.indexOf("windows") > -1) {
/* Value used by both MS' CCID driver and SpringCard's CCID driver */
return (0x31 << 16 | 3500 << 2);
}
else {
/* Value used by PCSC-Lite */
return 0x42000000 + 1;
}
}
}
Credo che i punti sono:
- Utilizzando
DIRECT
protocollo per ottenere la 'carta'
- Utilizzando
Card::transmitControlCommand
metodo con il codice ottenuto da funzione CONTROL_CODE (copiato dal codice di esempio, non sono sicuro di quale sia la teoria> _ <)
fonte
2015-05-18 15:16:59
... L'ho letto come "Smart Cardio". Sono intelligente, lo prometto! Inoltre, cosa significa ADPU?Non l'ho mai visto prima. –
@QPaysTaxes: è preferibile leggerlo come SmartCardInOut;). APDU o Application Data Protocol Unit è un protocollo per inviare comandi alle smart card e ricevere risposta da loro. Semplicemente è una coda di numeri esadecimali. la lunghezza minima di questi comandi è di 4 byte (intestazione del comando) e la lunghezza minima della risposta della carta è di 2 byte (Parole di stato) – Abraham
Dai un'occhiata alla seguente discussione nella comunità di Oracle, sembra che sia lo stesso problema che hai: https : //community.oracle.com/thread/2193998 – Abraham