アンドロイド/NFC:スマートカードから ATR を読み取る (EMV)
質問
携帯電話と通信したい EMV スマートカードを取得しました。通信自体はIsoDep経由で問題なく動作するのですが、ATRを取得する方法がわかりません。私の知る限り、インテントには ATR が含まれているはずですが、そのために必要なコードを教えていただけますか?
あるいは、これが不可能な場合は、答えが ATR である SELECT などのコマンドを使用してカードをウォーム リセットする方法を誰かが知っているかもしれません。
解決
非接触型カードには ATR がありません。ただし、ATS (Answer to Select) の履歴バイトに興味があるかもしれません。これらは呼び出して取得できます 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 Exchangeを使用してスマートカードと協議します。これは、非接触インターフェイスISO 14443-4を介して輸送されます。この場合、ISO 7816があるので、あなたはATRを取得します。
所属していません StackOverflow