获取标签的数据负载

Get the data payload of a tag

我有一些使用 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

您可以获得 NfcA 对象,如下所示:

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

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

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

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

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

无论如何,您需要找到 out/know 并实施标签所使用的协议,以便从中检索任何数据。如果您的 "tag" 是支付卡,则可能会在 EMV Contactless Specifications for Payment Systems. If your tag is a passport, this is specified in ICAO 9303 中指定。

  • 如果您的标签是内存布局平坦的内存标签,它通常会有简单的读取命令,这些命令将地址偏移量和长度作为参数。此外,可能有访问控制机制要求您提供 key/password.

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

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