2012-07-25 269 views
2

我得到了一個EMV智能卡,我想與我的手機進行通信。 通訊本身沒有問題通過IsoDep,但我無法弄清楚如何獲得ATR。 據我所知,意圖應包含ATR,有人可以告訴我我需要的代碼嗎?Android/NFC:從智能卡(EMV)讀取ATR

或者,如果這是不可能的,也許有人知道如何使用像SELECT這樣的命令來重置卡片,其答案是ATR。

回答

2

非接觸式卡沒有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()

+0

ATR的目的是什麼?它與hilayer響應有什麼關係?它能讓我從卡上獲取更多數據嗎? – Scott 2013-10-06 11:10:46

-1

非接觸式卡片返回ATR。但是,您無法從當前的android NFC API獲取ATR。 Android NFC API僅從ATR返回歷史字節。

非接觸卡返回ATR的原因: 請注意ATR是7816重置的答案。閱讀器(本例中的nfc電話)使用通過非接觸式接口ISO 14443-4傳輸的ISO 7816(T = CL)APDU交換與智能卡交談。由於在這種情況下有ISO 7816,您將獲得ATR。

+2

非接觸式卡做** NOT **提供真正的ATR(應答 - 重置),因爲它們不經過ISO 7816-3重置程序。 (雖然卡片可能包含EF.ATR文件,其中包含通常包含在ATR中的數據。)T = CL(基本上是* ISO 14443-4 *中定義的傳輸協議)具有ATS(answer-to-select)類型A(它接近於ATR,因爲它也包含歷史字節)和類型B的答覆(ATTRIB)(這是'getHiLayerResponse()'的數據來自哪裏)。 – 2013-10-30 21:01:13

+0

我可以從使用A&B卡的SCM讀卡器的非接觸卡獲得ATR。正如你指出的那樣,這可能不是傳統意義上的「真實」。 但是,它確實返回ATR。 – Trung 2013-11-05 21:51:26

+2

那麼,卡片不會返回該ATR。相反,您所看到的是由PC/SC驅動程序生成的僞ATR,它將智能卡讀卡器連接到應用程序。僞ATR(**不生成**或由卡「返回」)用於將關於非接觸式協議的信息傳遞給應用層(否則不可見)。由於Android不使用PC/SC通過NFC訪問智能卡,因此此處也涉及** no ** ATR。 – 2013-11-05 22:33:33