【发布时间】:2014-11-20 00:25:32
【问题描述】:
我目前正在尝试与在 android 上使用 HCE 的设备进行通信。我创建了自己的 NFC 服务,它扩展了 HostApduService 类,在 AndroidManifest.xml 中声明了 NFC 部分,并创建了指定 AID 的 apduservice.xml。
当我在 Nexus4 或 Nexus 5 (4.4.4) 设备上运行我的应用程序时,一切都按预期工作(!),我从设备收到 APDU 数组并发回答案,然后继续使用专有协议。所以看来上面的配置部分设置正确。
但是,当我在 Sony Xperia Z2 (4.4.2)、Samsung Galaxy S5 (4.4.2) 或 摩托罗拉上部署我的应用程序时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 有点相关,但答案与付款有关,对我没有多大帮助。
任何想法为什么我不能在其他设备上运行它?提前致谢。
【问题讨论】:
-
“不支持选择下一个、最后一个或上一个 AID 出现”行表明阅读器端未发送您在帖子中显示的 APDU。您实际上向手机发送了什么 APDU 命令?特别是,您能否验证 P2 的低两位是否设置为 00?
-
感谢您的评论。我无法直接验证设备是否正在向所有智能手机发送相同的 APDU 命令,因为我没有得到字节数组。根据要读取的设备制造商,它应该始终发送相同的命令。有没有办法从不知道要读取的设备的 AID 的应用程序中读取 AID(或 APDU 命令)?