我正在尝试使用带有以下代码的 javax.smartcardio API 加载智能卡终端:
public CardTerminal getReadyCardTerminal() throws CardException {
TerminalFactory factory = TerminalFactory.getDefault();
CardTerminals terminals = factory.terminals();
List<CardTerminal> list = terminals.list(State.CARD_PRESENT);
while (list.isEmpty()) {
terminals.waitForChange(1000);
list = terminals.list(State.CARD_PRESENT);
}
CardTerminal cardTerminal = list.get(0);
return cardTerminal;
}
...而且我总是遇到以下异常:
java.lang.IllegalStateException: no terminals
at javax.smartcardio.TerminalFactory$NoneCardTerminals.waitForChange(TerminalFactory.java:145)
在 Windows Vista/7 上一切正常,但我无法让它在 Linux 上运行。我正在使用 Ubuntu 12.04 64 位。
我使用以下命令安装了 pcscd 服务:
sudo apt-get install libccid pcscd libpcsclite-dev libpcsclite1
sudo service pcscd start
pcsc_scan 命令会打印:
PC/SC device scanner
V 1.4.18 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.7.4
Using reader plug'n play mechanism
Scanning present readers...
0: OMNIKEY CardMan 3x21 00 00
Tue Sep 11 15:44:49 2012
Reader 0: OMNIKEY CardMan 3x21 00 00
Card state: Card inserted,
ATR: <some hexa codes>
...
所以一切看起来都很好,但是智能心脏不起作用。我正在尝试使用 Oracle 和 OpenJDK 1.7.0_05、32 和 64 位。
该代码在 Ubuntu 32 位环境中使用 OpenJDK 运行正常(但不是使用 Oracle JDK,不知道为什么)。所以我认为这是从 Java 到 PC/SC 库的 64 位桥的问题。
有任何想法吗?
谢谢。