ACR122u和Android NFC处于HCE模式时,USB NFC消息PC_to_RDR_IccPowerOn失败



我一直在开发一个POS软件的驱动程序,使用endpoits Bulk-In、Bulk-Out和Interrupt In处理带有libusb的NFC卡。我们使用ACS ACR122u阅读器和Mifare Ultralight C标签。

当中出现一个中断,表示已找到标签时,我执行ICC通电(PC_to_RDR_IccPowerOn消息),并等待标签的。有了MifareULC标签,它工作得很好:

PC > ACR : 62 00 00 00 00 00 03 00 00 00
ACR > PC : 80 14 00 00 00 00 03 00 81 00 3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 68

所以我得到了标签的RID、卡类型等…

然而,当我使用我的Android手机和运行的应用程序(实现HostApduService)时,我得到的是一个错误:

PC > ACR : 62 00 00 00 00 00 03 00 00 00
ACR > PC : 80 05 00 00 00 00 03 00 81 00 3B 80 80 01 01

让我困惑的是,我还需要执行SELECT AID命令来指定应用程序的特定AID。所以…我也有这些疑虑:

  1. 为了发出SELECT AID,我需要知道我是否处于HCE模式下的设备。当读卡器上有一个标签时,执行此操作毫无意义。因此,我需要知道我对读者有什么样的"东西"。这就是为什么我发布IccPowerOn来检查。

  2. 尽管如此,在设置了一些读卡器选项(使用消息PC_to_RDR_XfrBlock)后,我还在启动时尝试了SELECT AID命令。后果错误(0xFE:ICC_MUTE-与ICC通话时CCID超时):

PC > ACR : 6F 0B 00 00 00 00 02 00 00 00 00 A4 04 00 05 F0 01 02 03 04 00
ACR > PC : 80 00 00 00 00 00 02 02 FE 00

所以,我被困在这里了。

基本上,当"卡片"出现时,我认为我必须做的是:

  1. 查询卡以了解它是MifareULC标签还是处于HCE模式的设备
  2. 如果是处于HCE模式的设备,请发出SELECT AID命令来选择我的应用程序
  3. 获取UID等

这样做的最佳方法是什么?

问候,

Carlos Santos

嗯,我不喜欢这种方法,但我设法解决了这个问题。

事实上,如果检测到设备处于HCE模式时PC_to_RDR_IccPowerOn失败,为什么不尝试下一个SELECT AID命令。。。

因此,在收到一个无效的响应后,我现在发送命令SELECT AID。现在,Android应用程序收到包裹并回答OK("9000")。

无论如何,如果有人知道更好、更可靠的方法,请在这里分享。

致以亲切的问候。

最新更新