ACR38 阅读器和 SLE4442 Java 延迟

Posted

技术标签:

【中文标题】ACR38 阅读器和 SLE4442 Java 延迟【英文标题】:ACR38 Readers and SLE4442 Java delay 【发布时间】:2014-03-12 10:05:32 【问题描述】:

我有智能卡 USB 读卡器(ACR38 和 ACR38 CCID)。我有一些 C# 代码可以完美地连接、发送 apdu 命令与 winscard.dll((SCardEstablishContext、SCardConnect、SCardControl 方法)。

我需要使用 java 来执行此操作,并且我使用 javax.smartcardio api,其中包含一些类似于此的代码: PCSC sample in java

检测到读卡器和插入的卡正常,但尝试连接时有延迟(15-20 秒)。此延迟仅在第一次插入卡时出现。如果我提取插入同一张卡,则没有延迟。如果我提取卡并插入另一张卡,则再次延迟。我无法连接前 15-20 秒,无论是否运行 java 程序。

当读卡器/卡连接后,我可以完美发送apdu命令。

否则用C#和winscard.dll api,没有延迟。

我用win7、win8、ACR38阅读器、ACR38 CCID阅读器测试...

为什么会有这个延迟?

【问题讨论】:

如果您展示了工作 C# 代码的最小版本,如果 Java coe 导致延迟,则展示最小版本将会很有帮助。 javax.smartcardio SCARD_SHARE_SHARED and SLEE4442 delay的可能重复 【参考方案1】:

如果这种情况仅在您所描述的第一次插入卡时发生,则可能某些其他进程可能对读卡器打开了独占连接。它可能是 Windows 内置的证书传播服务或一些类似的应用程序,它们是您可能已安装的卡中间件的一部分。也可能是 Windows 更新尝试为您的卡下载微型驱动程序。

【讨论】:

好的,但是为什么 C# 代码(基于 winscard.dll)可以毫无延迟地工作? Java 在其内部实现中也使用了 winscard.dll。也许延迟与您调用时执行的通信协议检测有关:Card card = terminal.connect("*"); 如果可以执行,您可以尝试使用“T=0”、“T=1”或“T=CL”而不是“*”吗更快? 我使用了相同的协议,未定义,winscard.dll 为“0”,Java 为“*”....可以将 sharemode 传递给 javax.smarcardio 以使用 Direct 模式进行测试? 我不确定。我想检查 javax.smartcardio.* 源代码,但我在互联网上的任何地方都找不到它(也许它是 Oracle 的专有部分?)。但是,如果您能以某种方式获取从 JRE 发出的 PCSC (winscard.dll) 调用的日志,这可能会有所帮助。通过简单的谷歌搜索,我找到了The APDU spying tool,但我以前从未使用过。 好的...我测试了所有可能的模式和 java 代码。 Jariq 是对的……有些东西与操作系统相关。我用win 8.1测试了这个并且有延迟......否则win 7效果很好。放卡时没有启动任何司机助手,但卡在前20秒没有响应。有什么想法吗?

以上是关于ACR38 阅读器和 SLE4442 Java 延迟的主要内容,如果未能解决你的问题,请参考以下文章

ACR1222 ACOS6 生成密钥返回无效 INS (6D 00)

使用 ACR122 NFC 阅读器读取苹果支付令牌

使用 ACR1252U NFC 标签阅读器读取 NTag213 上的所有记录

ACR122U 发送直接命令返回 -2 和分段错误

无需拔下插头即可重新连接 USB 设备 (ACR122U)

ACR122U - 传输 APDU 时出现 InvalidDeviceStateException