2014-01-30 71 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 –