JavaSmartCardIO-如何处理PC / SC连接的超时异常?

时间:2015-12-25 04:01:22

标签: smartcard javacard smartcard-reader pcsc

当读卡器连接到卡并发送命令时,如果发送命令和接收响应的时间是,系统通知超时异常是否自动?
如果是这样,PC / SC的超时值是多少?
或者我必须定义这个值?

1 个答案:

答案 0 :(得分:3)

嗯,当阅读器中没有可用的卡时,有两种方法可用于处理异常:

  

boolean sun.security.smartcardio.TerminalImpl.waitForCardAbsent(long     timeout)抛出CardException [虚拟]

     

等待此终端中的卡不存在或超时到期。   如果方法由于超时过期而返回,则返回false。   否则返回true。

     

如果调用此方法,此终端中不存在卡,则为   马上回来。

     

参数: 超时如果为正,则阻止最多超时毫秒;如果为零,则无限期阻塞;一定不能否定

     

返回:如果方法因过期超时而返回false,否则返回true。

     

例外: IllegalArgumentException 如果超时为负, CardException 如果操作失败

     

实施javax.smartcardio.CardTerminal

     

文件TerminalImpl.java第136行的定义。

     

boolean sun.security.smartcardio.TerminalImpl.waitForCardPresent(long timeout)抛出CardException [虚拟]

     

等待此终端中存在卡或超时到期。   如果方法由于超时过期而返回,则返回false。   否则返回true。

     

如果调用此方法时此终端中存在卡,则为   马上回来。

     

参数:如果为正则超时,阻止最多超时毫秒;如果为零,则无限期阻塞;一定不能否定

     

返回:如果方法因过期超时而返回false,否则返回true。

     

例外: IllegalArgumentException 如果超时为负, CardException 如果操作失败实现   javax.smartcardio.CardTerminal

     

文件TerminalImpl.java第132行的定义。

对于卡的响应超时,您应首先检查您的阅读器手册。除了向卡发送APDU命令之外,一些智能卡读卡器还具有一些附加功能。该命令称为“伪APDU”。例如,我有一个 ACR38 联系智能卡读卡器,我在其手册中找到了以下内容:

(来自here第14页) enter image description here

最后,如果您在读者手册中没有找到任何有用的内容,我认为您有两种选择:

  • 在多线程java程序中实现始终执行的timeout方法,并在发送每个命令后计算时间,并检查响应时间是否大于特定值。如果时间大于您的特定值,则调用disconnect方法并重新连接,然后您可以以这种方式处理它。
  • 使用PCSC / CCID库函数来控制此超时。

检查以下链接,我认为您可以在那里找到有用的东西来实现目标:

http://www.openscdp.org/ocf/api/de/cardcontact/opencard/terminal/smartcardio/PCSCIOControl.html

http://ludovic.rousseau.free.fr/softwares/pcsc-perl/PCSC.html

https://github.com/credentials/smartcardjs/blob/master/ext/scuba/acr122provider/src/net/sourceforge/scuba/smartcards/ACR122TerminalFactorySpi.java

http://myacr38.blogspot.com/2007/05/program.html