我目前正在尝试使用Android上的HCE与设备进行通信。我创建了自己的NFC服务,扩展了HostApduService
类,在AndroidManifest.xml
中声明了NFC部分,并创建了指定AID的apduservice.xml
。
当我在Nexus4或Nexus 5(4.4.4)设备上运行我的应用程序时,所有工作都按预期工作(!),我从设备接收APDU数组并发回答案,然后继续使用专有协议。所以似乎上面的配置部分已正确设置。
然而,当我在 Sony Xperia Z2(4.4.2),三星Galaxy S5(4.4.2)或 Motorola上部署我的应用程序时Moto X(4.4.3) processCommandApdu()
中的代码甚至没有被称为。该方法的第一行包含一个我根本看不到的日志输出。
根据编译的列表here,我的设备应该支持HCE。
当我点击设备前面的(不工作)手机时,我得到以下日志输出,但我似乎无法找到错误代码的确切含义:
D/STATUSBAR-NetworkController(1085): refreshSignalCluster - setNWBoosterIndicators(false)
D/STATUSBAR-NetworkController(1085): refreshSignalCluster: data=-1 bt=false
D/STATUSBAR-IconMerger(1085): checkOverflow(504), More:false, Req:false Child:6
D/HostEmulationManager(1277): notifyHostEmulationActivated
D/HostEmulationManager(1277): notifyHostEmulationData
D/HostEmulationManager(1277): call findSelectAid - 1
D/HostEmulationManager(1277): Selecting next, last or previous AID occurrence is not supported
D/NfcService(1277): onSeListenDeactivated - Skip this one, user select the onHost apk temporarily
D/HostEmulationManager(1277): notifyHostEmulationDeactivated
E/NfcNfa(1277): UICC/ESE[0x402] is not activated
我在哪里可以查找错误代码0x402
?
此处为apduservice.xml
:
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/service_desc"
android:requireDeviceUnlock="false">
<aid-group android:description="@string/aid_description"
android:category="other">
<aid-filter android:name="F04B4142413134" />
<aid-filter android:name="F0404B75737469"/>
</aid-group>
</host-apdu-service>
我通过Nexus 5收到的APDU命令如下所示,它看起来好像它遵循APDU规范来选择应用程序:
output: [00, a4, 04, 00, 07, f0, 4b, 41, 42, 41, 31, 34]
00 -> class
a4 -> instruction select
04 -> P1, select by name
00 -> P2
07 -> length of the following aid
rest -> corresponds to the first aid-filter
奖金问题:
如何在android OS源代码中设置断点,例如HostApduService.java
?我可以打开文件并查看代码但设置断点没有任何效果,至少在视觉上它没有显示,在调试模式下运行时,它也不会在那个地方中断。
我猜想当android应该选择与指定AID相对应的应用程序时会发生一些事情。我的问题与this one有些相关,但答案与付款有关,这对我没什么帮助。
为什么我无法在其他设备上运行它?提前谢谢。
答案 0 :(得分:4)
同时我找出了问题的根源。按照Michael Roland的建议,我试图找出读者发送的APDU命令。我测试了我的应用程序与我可以得到的所有Android手机,并发现所有具有NFC控制器的手机由恩智浦表示无法正常工作。
原因是NXP芯片发送的随机ID不符合我的读者所期望的标准(如here所述)。 它应该按照这个看:
0x08, A, B, C
其中A,B和C是随机的。但是NXP芯片发送的ID在哪里常数
0x1, 0x2, 0x3, 0x4
或者在第一个0x08之后有7个字节是随机的,而不是仅仅是3个字节。
这导致读者发送一个没有使用android触发器的APDU来调用我的processCommandApdu()
方法。
答案 1 :(得分:1)
错误
E/NfcNfa(1277): UICC/ESE[0x402] is not activated
在你的情况下,并不是真正的相关错误。重要的信息是
D/HostEmulationManager(1277): Selecting next, last or previous AID occurrence is not supported
这清楚地表明SELECT(通过DF名称/ AID)命令的P2字节不等于0x00。当前的Android HCE实现要求应用程序选择命令使P2等于0x00(表示选择&#34;首先或仅出现所选AID / DF名称的#34;)。请参阅HostEmulationManager.java:437。
因此,您需要确保阅读器端正在发送适当的命令以供应用程序选择。
答案 2 :(得分:0)
问题是由于某种原因导致棒棒糖不支持发送的APDU中的卡标识符或CID。因此,当阅读器发送带有CID的下一个命令时,手机将禁用该命令并保持接收模式。因此,这需要在没有CID的情况下发送APDU命令。解决方法是联系设备制造商以支持不需要CID的卡,如@SOERGI所说。