安卓NFC ISODep支持有多成熟?

6

我知道这个问题是一个没有确定答案的“讨论”主题,但我真的很想听听关于在开发 Android NFC APPs 时使用 IsoDep 与 DESFire 卡通信时可以期望什么,特别是使用 APDU 框架。

  • 我是否可以期望发送到特定 DESFire 卡的相同 APDU 帧在 Android 设备和版本中都有相同的响应?
  • 我应该测试哪些 Android 版本和设备作为最低要求以获得合理的覆盖范围?
  • Android 驱动程序中是否常见错误或回归,还是可以期望这些问题早已被解决?
  • 你建议支持哪个最早版本的 Android 以避免太多麻烦?

到目前为止,我的经验出奇的不同(3个设备,3个差异),我真的很希望听听其他开发者的意见。例如:在 S3(Android 4.1.2)上正常工作的相同 APDU 命令,在 S4(Android 4.3)上无法正常工作(在第3个身份验证握手时出现“长度错误”失败,之前一切正常)。这些电话有不同的 NFC 芯片组,但我没有预料到 APDU 帧的抽象级别会有差异。

2个回答

8
这个答案与您在某些设备上可用但在其他设备上不可用的APDU问题有关。正如Michael Roland所指出的,使用NCI NFC堆栈的设备经常发送可能会干扰应用程序发送的APDU的APDU。该问题与此堆栈中存在检查错误有关,并在这里有记录。当在DESFire卡上执行身份验证过程时,这尤其是一个问题,因为它由多个APDU组成,如果被无关的APDU中断,将会失败。但是,在运行Android版本>= 4.4(API级别>= 19)的设备上有一个解决方法。在这些设备上,您可以使用enableReaderMode方法,并使用EXTRA_READER_PRESENCE_CHECK_DELAY额外配置出现检查的频率。通过增加延迟,您可以减少与应用程序APDU干扰的概率。
例如:
    Bundle options = new Bundle();
    options.putInt(NfcAdapter.EXTRA_READER_PRESENCE_CHECK_DELAY, 5000);

    getNfcAdapter().enableReaderMode(
            this,
            new ReaderCallback() {
                @Override
                public void onTagDiscovered(final Tag tag) {
                    // ... authenticate ...
                }
            },
            NfcAdapter.FLAG_READER_NFC_A
                    | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK, options);

1
谢谢,我刚刚在研究这个。我必须重复一遍并说我印象深刻 :) - Karl Ivar Dahl

8
这确实是一个讨论话题,但我认为对于Android NFC开发人员来说仍然相关。因此,在这里提供我的经验报告: 我是否可以期望同样的APDU帧在不同的Android设备和版本中发送时响应相同? 是的,但仅适用于符合ISO/IEC 7816-4要求的APDU命令,并附加了一些限制(例如,并非所有设备都支持扩展长度的APDU,某些设备似乎存在case-1 APDU问题)。
此外,在Broadcom NFC堆栈的最新版本中存在一些已知的错误(请参见下文)。 作为测试,应至少测试哪些Android版本和设备,以便覆盖得比较充分? 到目前为止,我遇到的大部分问题都与具有Broadcom NFC芯片组的三星设备有关。虽然不涉及APDU,但当涉及使用MIFARE Classic时,它们与其他具有Broadcom芯片组的设备表现差异很大。例如,S4会在系统级别上阻塞MIFARE Classic标签,因此不允许读取标签(N)UID。(使用Broadcom芯片组无法从MF Classic读取数据...)
因此,关于测试,我建议每个NFC控制器至少使用一个Nexus设备(即一个具有NXP芯片组和一个具有Broadcom芯片组),以及同样适用于一个或两个其他手机制造商。 (对于三星,具有NXP芯片组的设备在读卡器/写入器模式体验方面与Nexus设备非常相似,因此我认为可以将Nexus S / Galaxy Nexus等与S3看作是等效的。)
关于Android平台,我建议使用您拥有最多用户的平台。(并且还要使用卸载率高的平台。) Android驱动程序中是否常见存在错误或退化,或者我可以期望这些问题早就已经被根除了? 如我之前所说,Broadcom NFC堆栈存在一些已知问题。特别是涉及MIFARE DESFire时,存在已知问题,即NFC堆栈在将其传递给应用程序后向卡发送任意基于APDU的命令。因此,这些命令可能会干扰卡与该应用程序之间正在进行的通信(例如,强制使用基于APDU的通信模式而不是本地命令模式,更改应用程序/文件选择等)。有关详细信息,请参见此错误报告和此stackoverflow问题
并查看错误跟踪器,肯定存在更多未解决的问题。
  • 您建议支持的Android最早版本是多少,以避免太多麻烦?

关于基于APDU(与DESFire或其他卡片)的通信,API 10(Android 2.3.3)及更高版本可以正常工作。当涉及到NFC API的可用性(除了简单的APDU交换)和应用程序设计时,我会坚持使用Android 4.0.3及更高版本。但请记住,最新平台特别是Android 4.3和Android 4.4引入了许多奇怪的行为/错误/(“功能”?)。

为了了解具有NFC设备的用户当前拥有哪些Android版本,我将分享NFC TagInfo的当前设备安装分布情况(尽管这可能略带偏见,因为NFC TagInfo不适用于普通用户):

  1. Android 4.1:36%
  2. Android 4.3:21%
  3. Android 4.2:19%
  4. Android 4.4:18%
  5. Android 4.0.3-4.0.4:4%
  6. Android 2.3.3-2.3.7:2%
  7. Android 4.0-4.0.2:0%
  8. Android 3.2:0%

由于问题的性质,我已将它转移到这里以进行更为开放的讨论。感谢您的反馈。 - Karl Ivar Dahl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接