javasmartcardIO - 如何在发生超时时取消主机和智能卡之间的读取操作?

时间:2015-12-24 03:38:57

标签: javacard

我使用Java智能卡IO框架开发了一个主机应用程序。主机应用程序向卡发送读取命令,并等待接收响应 在此过程中,发生超时(超时值由我定义)。

我想当超时发生时,读取过程将停止。我的问题是如何做到这一点?

- 目前,主机应用程序通过使用基本频道连接到卡。我试图关闭这个频道,但我得到了异常java.lang.IllegalStateException: Cannot close basic logical channel
- 我还尝试通过调用channel = card.openLogicalChannel();打开逻辑通道,但是当主机发送读取命令时,它会收到SW 6D00 - 指令代码不支持或无效。
- 我也试图通过拨打card.disconnect()来断开终端和卡的连接,但我得到了例外

javax.smartcardio.CardException: sun.security.smartcardio.PCSCException: WINDOWS_ERROR_INVALID_HANDLE
    at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:219)
    at sun.security.smartcardio.ChannelImpl.transmit(ChannelImpl.java:90)
    at ISO.ISO7816.readRecords(ISO7816.java:234)
    at javasmartcardio.UI.PTCMainFrame$9.run(PTCMainFrame.java:343)
    at java.lang.Thread.run(Thread.java:745)
Caused by: sun.security.smartcardio.PCSCException: WINDOWS_ERROR_INVALID_HANDLE
    at sun.security.smartcardio.PCSC.SCardTransmit(Native Method)
    at sun.security.smartcardio.ChannelImpl.doTransmit(ChannelImpl.java:189)

1 个答案:

答案 0 :(得分:1)

  

我试图关闭此频道,但我得到了例外   java.lang.IllegalStateException: Cannot close basic logical channel

ISO / IEC 7816-4第9页:

基本频道应永久可用,即无法关闭。其频道编号为零。

  

我还尝试通过调用channel = card.openLogicalChannel();来打开逻辑通道,但是当主机发送读取命令时   收到SW 6D00 - Instruction code not support or invalid.

我认为您收到0x9000来调用openLogicalChannel()方法。如果是这样,您必须首先在逻辑通道上选择您的小程序,然后发送READ命令。要在要发送READ命令的新逻辑通道上选择applet,只需在SELECT APDU命令的CLA部分的低半字节中指定通道编号。 (即0X A4 04 00 <AID Len> <AID>代替00 A4 04 00 <AID Len> <AID> - X是逻辑频道号。)

另一方面,在基本频道上选择小程序并在同一小程序的另一个频道上发送读取命令是不正确的。使用Manage Channel APDU命令打开逻辑通道时,该通道上选定的小程序是卡的默认选定小程序(不是您已选择的小程序)。

关于异常,我想这是与您的读者有关的事情。

我建议你:

  1. 打开基本逻辑通道以外的逻辑通道
  2. 在该逻辑频道上选择您的小程序。
  3. 通过该逻辑通道发送读取命令。
  4. 超时后关闭此逻辑通道。
  5. 跳转到1。