获取标记的数据有效负载

时间:2015-04-18 14:27:25

标签: android nfc smartcard ndef contactless-smartcard

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

2 个答案:

答案 0 :(得分:1)

你可以得到NfcA对象:

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

通过发送APDU之后可以与标记进行通信:

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

答案 1 :(得分:1)

从非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支付卡属于这一类。