JavaSmartCardIO-如何处理 PC/SC 连接超时异常?
Posted
技术标签:
【中文标题】JavaSmartCardIO-如何处理 PC/SC 连接超时异常?【英文标题】:JavaSmartCardIO- How to handle timeout exception of PC/SC connection? 【发布时间】:2015-12-25 04:01:22 【问题描述】:读卡器连接卡发送命令时,如果发送命令和接收响应的时间到了,系统是否会自动通知超时异常? 如果是,PC/SC 的超时值是多少? 或者我必须定义那个值?
【问题讨论】:
您的意思是响应 APDU 超时吗?如果是这样,它应该被自动处理(WTX
用于T=1
和 CLA 补充用于T=0
)。我已经看到至少有一位读者在使用持久命令时遇到了问题(例如那些涉及密钥生成的命令)——我敢打赌WTX
只是被忽略了(然后供应商修复了他们的固件并且错误消失了)。另一个有趣的事情可能是 javacard 的 APDU.waitExtension()
方法(但我从未使用过它,也从未见过有人这样做)并弃用了 PC/SC 的 SCardSetTimeout
...祝你好运!
【参考方案1】:
嗯,当读卡器中没有可用的卡时,有两种方法可用于处理异常:
布尔 sun.security.smartcardio.TerminalImpl.waitForCardAbsent ( long timeout ) 抛出 CardException [虚拟]
等到此终端中没有卡或超时到期。 如果该方法由于超时超时而返回,则返回 false。 否则返回 true。
如果调用此方法时此终端中没有卡,则 立即返回。
参数: timeout 如果为正,则阻塞最多超时毫秒;如果为零,则无限期阻塞;不能是负数
返回:如果方法由于超时而返回,则返回 false,否则返回 true。
异常: IllegalArgumentException 如果超时为负,CardException 如果操作失败
实现javax.smartcardio.CardTerminal。
文件TerminalImpl.java第136行的定义。
布尔 sun.security.smartcardio.TerminalImpl.waitForCardPresent(长时间超时)抛出 CardException [虚拟]
等到此终端中存在卡或超时到期。 如果该方法由于超时超时而返回,则返回 false。 否则返回 true。
如果调用此方法时此终端中存在卡片,则 立即返回。
参数:如果为正则超时,阻塞最多超时毫秒;如果为零,则无限期阻塞;不能是负数
返回:如果方法由于超时而返回,则返回 false,否则返回 true。
异常: IllegalArgumentException 如果超时为负,CardException 如果操作失败 javax.smartcardio.CardTerminal.
文件TerminalImpl.java第132行的定义。
关于卡的响应超时,您应该首先查看您的读卡器手册。一些智能卡读卡器除了向卡发送 APDU 命令外,还有一些附加功能。此命令称为“伪 APDU”。例如,我有一个 ACR38 接触式智能卡读卡器,我在其手册中找到了以下内容:
(来自here 第14页)
最后,如果您在阅读手册中没有发现任何有用的信息,我认为您有两个选择:
在始终执行的多线程 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
【讨论】:
注意:AFAIKPC_to_RDR_XfrBlock
命令在 CCID 协议级别,因此由读卡器驱动程序填充 bBWI
字段值。以上是关于JavaSmartCardIO-如何处理 PC/SC 连接超时异常?的主要内容,如果未能解决你的问题,请参考以下文章
如何处理 MaxUploadSizeExceededException