我已经实现了一个Andoid应用程序 - 服务器端应用程序。服务器与智能卡读卡器通信。当用户触摸按钮时在 Android 应用中,正在为服务器构建连接以对用户进行身份验证。应用之间交换的消息和服务器具有以下格式:
<type> 0x00 0x00 0x00 <length> 0x00 0x00 0x00 <[data]>
- 如果消息的类型值
06
指示智能卡读卡器中的错误。 - 如果消息的类型值
07
指示智能卡中的错误。
我正在使用如下代码与智能卡读卡器进行通信:
// show the list of available terminals
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
System.out.println("Terminals: " + terminals);
// get the first terminal
CardTerminal terminal = terminals.get(0);
// establish a connection with the card
Card card = terminal.connect("T=0");
System.out.println("card: " + card);
CardChannel channel = card.getBasicChannel();
ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
System.out.println("response: " + toString(r.getBytes()));
// disconnect
card.disconnect(false);
智能卡 IO API 具有用于异常的 CardException
类。我的问题是我不知道何时发送 06
或 07
类型的消息,因为我无法区分卡生成的错误和抛出CardException
时由读卡器生成的错误。我该如何管理?
transmit()
方法,用于
ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
仅在与智能卡读卡器错误和读卡器与智能卡之间的通信问题相关的情况下引发异常。当卡本身指示错误时,它不会引发异常。
因此,您可以通过捕获异常来捕获所有与读取器相关的错误:
try {
ResponseAPDU r = channel.transmit(new CommandAPDU(c1));
} catch (IllegalStateException e) {
// channel has been closed or if the corresponding card has been disconnected
} catch (CardException e) {
// errors occured during communication with the smartcard stack or the card itself (e.g. no card present)
}
相反,卡生成的错误指示为响应状态字中编码的错误代码。这些错误不会生成 Java 异常。您可以通过检查状态字(ResponseAPDU
的方法getSW()
(来测试这些错误:
if (r.getSW() == 0x09000) {
// success indicated by the card
} else {
// error or warning condition generated by the card
}