2014-01-30 107 views
2

我正在製作使用ISO-DEP(ISO 14443-4)作爲TagTechnology的NFC應用程序。 我嘗試使用DESFire EV1執行身份驗證。Android IsoDep命令鏈接失敗

如果命令的鏈接沒有暫停,則認證可以很好地工作。 (如NATIVE_AUTHENTICATION_COMMAND_P1之後的Thread.Sleep)我在卡片的驗證命令部分2中得到錯誤0x911C(「命令代碼不支持」)。 當驗證已被取消時,通常會出現錯誤。就像在認證過程中卡片沒有任何關於它的另一個命令一樣。

問題是我的應用程序沒有做其他任何事情發送selectApplication,驗證第1部分,睡眠和第2部分。 我已經在C++中使用PCSC讀取器嘗試相同的代碼,睡眠不是問題,甚至5秒睡眠認證在我的電腦上有效。 因此,我想知道即使在嚮應用程序提供Intent之後,或者如果幀等待時間(ISO 14443-4)不起作用或NDEF「拉」破壞了身份驗證,Android是否正在使用該卡「玩」。 。

(NATIVE_AUTHENTICATION_COMMAND_P2的值是一個爲例)

final byte[] NATIVE_AUTHENTICATION_COMMAND_P1 = new byte[]{(byte)0x90, (byte)0x0A, (byte)0x00, (byte)0x00, (byte)0x01, (byte)0x00, (byte)0x00}; 
final byte[] NATIVE_AUTHENTICATION_COMMAND_P2 = new byte[]{(byte)0x90, (byte)0xAF, (byte)0x00, (byte)0x00, (byte)0x10, (byte)0xAB, (byte)0xB4, (byte)0x66, (byte)0xA4, (byte)0xE9, (byte)0x99, (byte)0xFF, (byte)0x5C, (byte)0xD7, (byte)0xF3, (byte)0xA7, (byte)0x81, (byte)0x62, (byte)0x2F, (byte)0xFA, (byte)0x16, (byte)0x00}; 
final byte[] NATIVE_SELECT_COMMAND = new byte[]{(byte)0x90,(byte)0x5A,(byte)0x00,(byte)0x00,(byte)0x03,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00}; 

IsoDep tag = IsoDep.get(tagFromIntent); 

tag.connect(); 

byte[] result; 
result = tag.transceive(NATIVE_SELECT_COMMAND); //SUCCESS 
result = tag.transceive(NATIVE_AUTHENTICATION_COMMAND_P1); //SUCCESS 

// Thread.sleep(1000); 

result = tag.transceive(NATIVE_AUTHENTICATION_COMMAND_P2); //result = 0x90AE without Sleep and with Sleep 0x911C ("Command code not supported") 

tag.close(); 

如果有人有一個想法,因爲我完全失去了:)

UPDATE: 邁克爾 - 羅蘭的幫助後,並他的提示;我已經使用NDEF檢查禁用和延遲存在檢查的讀取器模式API到10秒,以使我的鏈接命令完美工作!

@Override 
protected void onResume() { 
    super.onResume(); 
    Bundle options = new Bundle(); 
    options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 10000); 
    mAdapter.enableReaderMode(this, this, NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, options); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    mAdapter.disableReaderMode(this); 
} 
+0

你使用什麼設備?我想用Broadcom的NFC芯片組,對吧? –

+0

我通常使用Nexus 4,它是Broadcom的BCM20793S。 – Liryna

回答

2

您遇到了Broadcom NFC芯片組的NFC堆棧的一個已知問題。這個問題已知很長一段時間(參見Android bug report,類似的情況也適用於基於非APDU的標籤)。

在你的情況,問題是,當手機和標籤之間的連接處於空閒狀態時,Android會自動執行存在檢查。雖然恩智浦NFC堆棧正確實施了在線檢查,但Broadcom版本使用READ BINARY命令(用於IsoDep卡)或等效的READ命令(用於其他標籤技術)。因此,如果您的命令序列較慢,Android可能會在您的命令之間的某處發送READ BINARY APDU。

不幸的是,這個bug在Android 4.4.2中仍然存在,對我來說,谷歌是否最終會做些什麼似乎還不清楚。 更新:從Android 5開始有一種新的存在檢查機制。

但是,如果您使用Android 4.4,則可以採取以下措施來避免該錯誤:使用新的reader-mode API來調整存在檢查超時。如果您不使用NDEF,甚至可以完全禁用狀態檢查。

+0

謝謝,這非常有幫助! 我已經修復我的帖子,修復了我的問題。 – Liryna

+1

好建議,切換到4.4的閱讀器模式!對於以前的Android版本,只需要一點點「黑客」,就可以修補它:http:// www。dematte.org/2014/08/15/AndroidNFCServiceAndThinClientOneProblemAndOneHack.aspx –