我有一张 EMV 智能卡,我想用我的手机与之通信。通过 IsoDep 通信本身没有问题,但我不知道如何获得 ATR。据我所知,意图应该包含 ATR,有人可以告诉我我需要的代码吗?
或者,如果这不可能,也许有人知道如何使用 SELECT 之类的命令对卡进行热重置,其中答案是 ATR。
非接触式卡没有 ATR。不过,您可能对 ATS(选择答案)的历史字节感兴趣。您可以通过调用来检索这些getHistoricalBytes()
:
Tag tag = (Tag) intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
IsoDep iso = IsoDep.get(tag);
NfcA nfcA = NfcA.get(tag);
if (nfcA == null || iso == null)
return; // not an IsoDep+NfcA tag
byte[] histBytes = iso.getHistoricalBytes();
...
请记住,这只适用于 ISO 14443 A 类标签 ( NfcA
)。对于 B 类标签 ( NfcB
),您可能需要调查getHiLayerResponse()
.
非接触式卡确实返回 ATR。但是,您无法从当前的 android NFC API 获取 ATR。Android NFC API 仅从 ATR 返回历史字节。
非接触式卡返回 ATR 的原因: 请注意 ATR 是 7816 重置答案。读卡器(本例中为 nfc 电话)使用 ISO 7816 (T=CL) APDU 交换与智能卡通信,该交换通过非接触式接口 ISO 14443-4 传输。由于在这种情况下有 ISO 7816,您将获得 ATR。