gpt4 book ai didi

java - 通过 javax.smartcardio 读取幻影 NFC 标签

转载 作者:行者123 更新时间:2023-11-29 05:36:52 26 4
gpt4 key购买 nike

我有一个用于 tikitag 网络服务的旧 NFC 阅读器(后来更名为 touchatag ,最终在 2012 年左右被废弃)。由于该网站不再可用,我无法再找到原始的 tikitag/touchatag 驱动程序。经过一番搜索,我发现这款NFC阅读器是一款通用的ACS ACR122U USB阅读器,并从here安装了合适的驱动程序。 .我的系统是 Windows 7(64 位)。

首先,我尝试了 NFC Tools library用于对 NFC 标签进行高级读写访问。我收到一条错误消息,说遇到了不受支持的标签;尽管阅读器上没有标签,甚至在附近也没有标签。似乎其他开发人员也遇到了与此库相同的错误,如图所示 here .请注意,此标签会被无限期地检测到(因此,它不会在检测到一次后就消失)。

我将所需的低级代码复制到一个单独的类中(即,独立于 NFC 工具库)。您可以在下面找到这段代码(类似的代码也可以在教程中找到):

import java.util.List;

import javax.smartcardio.Card;
import javax.smartcardio.CardTerminal;
import javax.smartcardio.TerminalFactory;

import org.nfctools.utils.NfcUtils;

public class NdefTest {

public static void main(String[] args) throws Exception {
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
CardTerminal terminal = terminals.get(0);

if (terminal.waitForCardPresent(5000)) {
Card card = terminal.connect("T=0");
System.out.println(NfcUtils.convertBinToASCII(card.getATR().getHistoricalBytes()));
}
}
}

此代码检测到与使用 NFC 工具库时完全相同的“幻影”标签。因此,这个问题似乎与 NFC 工具库无关(正如库开发人员在响应错误报告时暗示的那样)。要么我遗漏了什么,要么问题与安装的驱动程序、NFC 读取器硬件或 javax.smartcardio 中的一些未修复错误有关(按可能性顺序列出)。

我曾尝试卸载上述驱动程序并让 Windows 7 自行安装合适的驱动程序(称为“Microsoft Usbccid Smartcard Reader (WUDF)”),这会导致与上述相同的错误。我没有尝试过其他阅读器,因为我只有一个。

(注意:这个 NFC 阅读器在 Windows 设备概览中的名称是“CCID USB Reader”,而不是“ACS ACR122”或其他相关名称。不知道这是否重要,只是想我会提到它。 ).

有没有人遇到过这个问题,并设法解决了?

更新

好的,我试过在检测到模拟标签后向阅读器发送 CLF 命令;即获取连接的 PICC 的 ATS(ACR122U manual 的第 11 页):

TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();

// (this is the correct terminal)
CardTerminal terminal = terminals.get(0);

if (terminal.waitForCardPresent(5000)) {
Card card = terminal.connect("*");

CardChannel channel = card.getBasicChannel();

// (I tried both 0x00 and 0x01 as P1, as well as 0x05 for Le)
CommandAPDU getAts = new CommandAPDU(0xFF, 0xCA, 0x00, 0x00, 0x04);
ResponseAPDU response = channel.transmit(getAts);

System.out.println(response.getSW1());
System.out.println(response.getSW2());
}

但我不断收到错误响应代码 (0x63 0x00)。关于我可能做错了什么的任何想法?

最佳答案

您遇到的问题是此版本的 ACR122U 阅读器以某种非标准方式使用 PC/SC (CCID)。

您使用 PC/SC API 检测到的“卡”实际上是读卡器模拟的虚拟卡(允许 PC/SC API 打开连接,即使没有卡存在)或智能卡芯片读卡器的 SAM 插槽(读卡器外壳内的接触卡)。

无论哪种情况,该阅读器仅将 PC/SC 用作该阅读器中使用的非接触式前端芯片 (NXP PN532) 的 native 命令的传输协议(protocol)。因此,如果您想使用阅读器的非接触式功能,就必须使用 CLF 的 native 命令集。查看ACR122U API documentationlibnfc实现更多细节。

关于java - 通过 javax.smartcardio 读取幻影 NFC 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19199875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com