我目前正在为一个非常非常定制的 Linux 内核开发一个 NFC 应用程序,该内核运行在一个 POS 设备中,比如这个 TPS300用于非接触式 NFC 卡。它具有用于与 NFC 卡通信的内置库。我对 NFC 进行了研究,并了解了 NFC 重置命令,该命令应该响应重置答案。我的问题是,该命令是通过正常的 APDU 命令响应方法执行的,还是 reset 是基于硬件的命令?我问这个是因为上面提到的库没有明确的卡片重置命令方法,也没有程序,而且我(到目前为止)还没有找到用于重置 NFC 卡的 APDU 命令。我只知道硬件方法,通过信号到NFC卡的复位端。是否有用于重置卡的明确 APDU 命令,或者自定义操作系统是否会为我负责重置?如果命令存在,它是什么?它是如何应用于非接触式 NFC 卡的?
2 回答
ATR
通常通过向 NFC 控制器(读取器)发出特殊命令来寻求(重置的答案)。APDU
是一个术语,用于指代与 NFC 卡本身 (PICC) 的命令/响应交换。为了给您一些比较的东西,请查看ACR122U 的文档,它是市场上流行的 USB 阅读器之一。它利用大多数操作系统通用的 PCSC USB 驱动程序 (CCID)(从与智能卡控制器的接口演变而来),使其易于在 Windows、Mac 或 Linux 上使用。这是它的流程图:
PCSC 接口有几个命令,但都是从阅读器 API 开始的connect
。对于接触式智能卡,这相当于设置RESET
高线。对于非接触式 (NFC) 卡,这相当于打开 NFC 场(RF 能量脉冲)。如果存在卡,则connect
调用将返回ATR
响应。
查看 PCSC 层下方和 CCID 驱动程序,您可以看到读取器 APIconnect
调用是如何构造的。这是来自nfcpy 项目的代码片段,这是一个NFC 的开源堆栈:
def reset_mode(self):
if (self.ic, self.fw) == ("PN533", "1.48"):
self.command(0x18, [1])
self.write(array("B", [0, 0, 255, 0, 255, 0])) # ack
time.sleep(0.010)
PN533是ACR122U读卡器内的 NFC 控制器(来自 NXP)。命令0x18
指示 NFC 控制器打开 RF 场并尝试从存在的任何标签获取 ATR 响应。一旦ATR
找到一个,就APDU
可以开始交换。比如查询卡片的描述信息:
rsp = self.dev.in_list_passive_target("106A", ""); // for NFC-A type cards
因此,要明确回答您的问题:
- 是否有用于重置卡的明确 APDU 命令,或者自定义操作系统是否会为我负责重置?- 对于 PCSC,这是一个读取器 API
connect
调用。直接与 NFC 控制器对话,可能会有执行此操作的in_list_passive_target
指令,例如 PN533 的命令。 - 如果命令存在,它是什么?- 在您的 POS 中搜索 Linux 设置,查看是否有 CCID 驱动程序或 PCSC 守护程序正在运行。如果没有,您将需要找到用于与 POS NFC 控制器通信的驱动程序。有了它,您应该能够确定打开射频场的等效命令。
- 它是如何应用于非接触式 NFC 卡的?- NFC 卡有很多种类型,但
ATR
在所有这些卡中都常见。
一般来说,关闭射频场并打开它应该“重置”卡。但是,如果您想要更具体的重置机制,那么这将取决于操作系统支持的卡类型以及相关卡。ISO14443-Part3 应该可以帮助您。