我正在制作使用ISO-DEP(ISO 14443-4)作为TagTechnology的NFC应用程序。 我尝试使用DESFire EV1执行身份验证。
如果命令的链接没有暂停,则认证很有效。
但是,如果例如,我做了一些需要时间的事情(比如NATIVE_AUTHENTICATION_COMMAND_P1之后的Thread.Sleep)我在卡的认证命令部分2期间得到了错误0x911C(“不支持命令代码”)。 Normaly在取消身份验证时出现错误。就像卡在认证过程中得到另一个命令一样,没有任何关于它的信息。
问题是我的应用程序除了发送selectApplication,Authentication Part 1,Sleep和Part 2之外什么都不做。 我在C ++中使用PCSC Reader尝试了相同的代码,睡眠不是问题,即使有5秒的睡眠,身份验证也可以在我的计算机上运行。 所以我想知道Android即使在将Intent提供给应用程序之后或者如果帧等待时间(ISO 14443-4)无效或者NDEF“拉”打破了身份验证或者......
(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();
如果有人有想法,因为我完全迷失了:)
更新 在迈克尔罗兰的帮助和他的提示之后;我已经使用读取器模式API和NDEF检查禁用并延迟存在检查到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 :(得分:2)
对于Broadcom的NFC芯片组,您遇到了NFC堆栈的已知问题。该问题已为人所知(请参阅此Android bug report,类似的内容也适用于非基于APDU的标记)。
在您的情况下,问题是当手机和标签之间的连接空闲时,Android会自动执行状态检查。虽然对NXP的NFC堆栈正确实现了此状态检查,但Broadcom版本使用READ BINARY命令(对于IsoDep卡)或等效的READ命令(对于其他标记技术)。
因此,如果您的命令序列很慢,Android可能会在您的命令之间的某处发送READ BINARY APDU。
不幸的是,这个错误仍然存在于Android 4.4.2中,对我来说似乎还不清楚谷歌最终是否会对此做些什么。 更新:从Android 5开始有一种新的状态检查机制。
如果你使用Android 4.4,你可以采取一些措施来避免这个错误:使用新的reader-mode API来调整存在检查超时。如果您不使用NDEF,您甚至可以完全禁用状态检查。