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)