我一直在开发一个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。所以…我也有这些疑虑:
为了发出SELECT AID,我需要知道我是否处于HCE模式下的设备。当读卡器上有一个标签时,执行此操作毫无意义。因此,我需要知道我对读者有什么样的"东西"。这就是为什么我发布IccPowerOn来检查。
尽管如此,在设置了一些读卡器选项(使用消息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
所以,我被困在这里了。
基本上,当"卡片"出现时,我认为我必须做的是:
- 查询卡以了解它是MifareULC标签还是处于HCE模式的设备
- 如果是处于HCE模式的设备,请发出SELECT AID命令来选择我的应用程序
- 获取UID等
这样做的最佳方法是什么?
问候,
Carlos Santos
嗯,我不喜欢这种方法,但我设法解决了这个问题。
事实上,如果检测到设备处于HCE模式时PC_to_RDR_IccPowerOn失败,为什么不尝试下一个SELECT AID命令。。。
因此,在收到一个无效的响应后,我现在发送命令SELECT AID。现在,Android应用程序收到包裹并回答OK("9000")。
无论如何,如果有人知道更好、更可靠的方法,请在这里分享。
致以亲切的问候。