首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HCE不在Nexus 5以外的其他手机上工作

HCE不在Nexus 5以外的其他手机上工作
EN

Stack Overflow用户
提问于 2014-09-25 09:28:56
回答 3查看 2.5K关注 0票数 2

我目前正在尝试与一个在android上使用HCE的设备进行通信。我已经创建了自己的NFC服务,它扩展了HostApduService类,在AndroidManifest.xml中声明了NFC部分,并创建了指定艾滋病的apduservice.xml

当我在Nexus4或Nexus 5 (4.4.4)设备上运行我的应用程序时,所有的工作原理都与预期的(!)一样,我从设备接收APDU数组并发送回一个答案,然后继续使用固有协议。因此,上述配置部分的设置似乎是正确的。

然而,当我在索尼Xperia Z2 (4.4.2)、三星Galaxy S5 (4.4.2)或摩托罗拉Moto (4.4.3)上部署我的应用程序时,我的processCommandApdu()代码甚至都没有被调用。该方法的第一行包含一个日志输出,我完全看不到。

根据已编译的这里列表,我的设备应该支持HCE。

当我点击设备前面的(不工作的)手机时,我得到了以下日志输出,但我似乎找不到错误代码的确切含义:

代码语言:javascript
复制
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

代码语言:javascript
复制
<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规范来选择应用程序:

代码语言:javascript
复制
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源代码中设置断点,例如在HostApduService.java中?我可以打开文件并查看代码,但是设置断点不会产生任何效果,至少在视觉上没有显示,在调试模式下运行时,也不会在那个位置中断。

我猜想,当android应该选择与指定的AID相对应的应用程序时,会发生一些事情。我的问题有点与这一个有关,但答案与付款有关,但对我没有多大帮助。

知道为什么我不能在其他设备上运行吗?提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2014-10-03 13:43:48

与此同时,我找出了问题的根源。按照Michael的建议,我试图找出读者发送的APDU命令。我用我所有的android手机测试了我的应用程序,发现所有有NFC控制器的手机都是NXP不工作的。

  • 工作: Nexus 4,5,7 G2,10 (Broadcom芯片)
  • 不工作: Nexus S,Nexus 7 G1,三星Galaxy S5,索尼Xperia Z2,摩托罗拉Moto X (NXP芯片)

原因是NXP芯片发送的随机ID不符合我的读者所期望的标准(如这里所描述的)。它应该根据这一点来看:

代码语言:javascript
复制
0x08, A, B, C

其中A,B和C是随机的。但是NXP芯片发送的ID中的任何一个常量

代码语言:javascript
复制
0x1, 0x2, 0x3, 0x4

或者,在第一个0x08之后有7个字节是随机的,而不是只有3个字节。

这使得阅读器发送了一个APDU,它没有使Android触发器调用我的processCommandApdu()方法。

票数 4
EN

Stack Overflow用户

发布于 2014-09-30 06:56:54

误差

代码语言:javascript
复制
E/NfcNfa(1277): UICC/ESE[0x402] is not activated

在您的情况下并不是真正的相关错误。重要的信息是

代码语言:javascript
复制
D/HostEmulationManager(1277): Selecting next, last or previous AID occurrence is not supported

这清楚地表明SELECT (按DF /AID)命令的P2字节不等于0x00。当前的Android实现要求应用程序选择命令的P2等于0x00 (指示选择所选AID/DF名称的“第一次或唯一发生”)。见HostEmulationManager.java:437

因此,您需要确保读取器端为应用程序选择发送了适当的命令。

票数 1
EN

Stack Overflow用户

发布于 2015-09-24 23:04:08

造成此问题的原因是,由于某种原因,棒棒糖在发送的APDU中不支持卡标识符或CID。因此,当读取器用CID发送下一个命令时,电话将禁用该命令并保持接收模式。因此,这需要发送APDU命令而不需要CID。工作是联系设备制造商,支持不需要CID的卡,如@SOERGI所说。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26035044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档