gpt4 book ai didi

Android IsoDep 命令链接失败

转载 作者:行者123 更新时间:2023-11-29 00:23:31 26 4
gpt4 key购买 nike

我正在制作一个使用 ISO-DEP (ISO 14443-4) 作为 TagTechnology 的 NFC 应用程序。我尝试使用 DESFire EV1 执行身份验证。

如果命令的链接没有暂停,则身份验证工作得很好。

但是,例如,如果我做了一些需要时间的事情(比如 NATIVE_AUTHENTICATION_COMMAND_P1 之后的 Thread.Sleep),我在卡的身份验证命令第 2 部分期间收到错误 0x911C(“不支持命令代码”)。通常,当身份验证被取消时会出现错误。就像卡在身份验证过程中收到另一条命令一样,但与此无关。

问题是我的应用程序除了发送 selectApplication、Authentication Part 1、Sleep 和 Part 2 之外什么都不做。我已经在 C++ 中使用 PCSC 阅读器尝试了相同的代码,并且 sleep 不是问题所在,即使 sleep 5 秒,身份验证也可以在我的计算机上运行。所以我想知道即使在向应用程序提供 Intent 之后 Android 是否正在“玩”卡,或者帧等待时间(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();

如果有人因为我完全迷路而有想法 :)

更新:在 michael-roland 和他的提示的帮助下;我已将阅读器模式 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);
}

最佳答案

您遇到了 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,则可以采取一些措施来避免该错误:使用新的阅读器模式 API 来调整存在检查超时。如果您不使用 NDEF,您甚至可以完全禁用存在检查。

关于Android IsoDep 命令链接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21460535/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com