我的 Windows PC 上连接了一个 NFC 读取器,并且我编写了一个 C 程序来使用 Windows SCARD API(用 C 语言)。这涉及从 Winscard.dll 执行以下 SCARD API 方法:
SCardEstablishContext: to initialize a context
SCardListReaders: to enumerate the readers available
SCardGetStatusChange: to check if an NFC tag is present on a reader
SCardConnect: to connect to the NFC tag when it is present
SCardTransmit: to exchange a request/response with the NFC tag
上述命令在 Microsoft 在线帮助中有详细记录。我调用上述 API 方法的 C 代码效果很好。当我的程序调用 SCardTransmit 方法时,我将以下 5 个字节序列发送到 NFC 标签:
0xFF 0xCA 0x00 0x00 0x00
我不知道这 5 个字节是什么意思,也不知道这个消息是如何构造的——我在几个 NFC 在线教程中找到了这个字节序列,但没有任何解释。当 SCardTransmit 方法返回时,接收缓冲区将填充 9 个字节:
0x04 0x3c 0xf4 0x1d 0x6f 0x61 0x80 0x90 0x00
前7个字节是NFC标签的UID。我不知道最后两个字节 0x90 0x00 是什么意思。
我的问题是,这些低级 NFC 命令记录在哪里?我完全不知道序列
0xFF 0xCA 0x00 0x00 0x00
是如何构造的。为什么命令以 0xFF
开头? 0xCA
是什么意思?为什么有3个零字节?
我知道在请求中发送
0xFF 0xCA 0x00 0x00 0x00
的唯一方法是阅读一些在线 NFC 教程,他们说这 5 个字节查询 NFC 标签的 UID。它有效。但是这个命令记录在哪里呢?所有其他低级 NFC 命令都记录在哪里?
例如,如果我想从 NFC 标签读取内存块,我将使用 SCardTransmit 发送什么序列的请求字节?似乎没有人谈论您用来与 NFC 标签交互的这些低级命令。
如果没有阅读器硬件和所使用的 NFC 标签硬件的详细信息,很难准确回答,但这里有一些提示。
首先是读卡器硬件,详细信息可以在其数据表中找到,例如常见的 USB 读卡器是 acr122u,其 数据表 在第 4.1 节中概述,
0xFF
是一个“伪 APDU”,用于发送到非iso 7816(NFC Type 4),特别是0xCA 0x00 0x00 0x00
是为了要求Mifare Classic(非NFC标准)标签。
如您所见,它返回 ID 加上
90 00h
,即 ADPU“操作成功完成”。代码。
您可以从标签的数据表中获取有关每种类型标签支持的命令的更多详细信息,例如Mifare Classic 或 NTAG21X(NFC 类型 2)
通常,标签可以支持的命令集多于每个 NFC 类型标准的 NFC 类型标准链接所需的最小命令集,类型 - 1、2、3、4
NFC Type 4 标签支持 iso 7816-4 ADPU,但 APDU 非常灵活,有一些行业标准命令,但各个标签也可以支持其他命令。
最后,Ndef 标准 NFC 数据格式用于以标准方式在 NFC 标准类型标签上存储数据(更多详细信息此处)