【问题标题】:Get the data payload of a tag获取标签的数据负载
【发布时间】:2026-02-06 22:45:01
【问题描述】:

我有一些使用 NFC 的卡(例如学生证或借记卡)。这些卡不使用 NDEF 存储数据。如何获取这些卡的有效载荷?

目前,我使用以下代码:

if (intent.getAction() != null && NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction()))
{
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
}

谁能发现我如何获取标签的有效负载?

卡的技术是android.nfc.tech.IsoDepandroid.nfc.tech.NfcA

【问题讨论】:

  • 这取决于卡的技术、卡的类型(内存、javacard)、数据的存储方式……没有通用的方法可以从借记卡和学生证中获取数据。
  • 卡的技术是android.nfc.tech.IsoDep, android.nfc.tech.NfcA。

标签: android nfc smartcard ndef contactless-smartcard


【解决方案1】:

你可以像这样得到NfcA对象:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
NfcA nfcA = NfcA.get(tag);

在您可以通过发送APDU 与标签进行通信后:

byte[] apdu = [...];
byte response = nfcA.transceive(apdu);

【讨论】:

    【解决方案2】:

    从非 NDEF 标签/智能卡获取有效负载很大程度上取决于您使用的标签类型。标签/智能卡的范围从使用平面线性内存结构的简单数据存储到使用基于文件系统的内存结构的数据存储,再到包含可执行程序代码和数据的处理器智能卡。

    在您的情况下,标签基于 NfcA + IsoDep 技术(即,它实现了 ISO/IEC 14443-4 A 类标准化的传输协议)。因此,您的标签不太可能属于简单的线性可寻址内存标签组。相反,您的标签更有可能(尽管不一定正确)实现了一些通信协议,并且可能实现了一些类似于 ISO/IEC 7816-4 中标准化的文件系统结构。

    无论如何,您需要找出/了解并实施标签所说的协议,以便从中检索任何数据。如果您的“标签”是支付卡,则可能在EMV Contactless Specifications for Payment Systems 中指定。如果您的标签是护照,则在ICAO 9303 中指定。

    • 如果您的标签是具有平面内存布局的内存标签,它通常具有简单的读取命令,这些命令将地址偏移量和长度作为参数。此外,可能有一些访问控制机制要求您提供密钥/密码知识证明。

    • 如果您的标签是具有基于文件系统的内存布局的内存标签,它通常具有用于选择和访问文件的命令。这可以基于 ISO/IEC 7816-4。此外,可能有一些访问控制机制要求您提供密钥/密码知识证明。

    • 如果您的标签是处理器智能卡,您通常不能只读取整个数据存储器。卡上执行的程序代码将决定在何种条件下可以访问哪些信息。例如,私钥通常被设计成它们永远不会离开卡。例如。 EMV 支付卡属于这一类。

    【讨论】: