【问题标题】:HCE not working on other phones than Nexus 5HCE 不适用于 Nexus 5 以外的其他手机
【发布时间】: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 命令)?

标签: android nfc hce


【解决方案1】:

与此同时,我找到了问题的根源。按照 Michael Roland 的建议,我试图找出阅读器发送的 APDU 命令。我用我能拿到的所有安卓手机测试了我的应用程序,发现所有配备 NXP 制造的 NFC 控制器的手机都无法正常工作。

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

原因是恩智浦芯片发送的随机 ID 不符合我的读者所期望的标准(如 here 所述)。 应该是这样看的:

0x08, A, B, C

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

0x1, 0x2, 0x3, 0x4

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

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

【讨论】:

  • 在 Android 应用端我无能为力。解决方法是向智能手机发送 APDU 命令的设备制造商调整设备的固件以接受非标准随机 ID,例如来自上述 NXP 芯片的随机 ID。
  • 基本上,我面临着同样的问题。我的基本 PoC 在 Google Nexus 5/4 上运行良好,但无法在三星 Galaxy S4/S5 上调用 HostApduService。不幸的是,我的客户有 sumsung 设备!
【解决方案2】:

错误

E/NfcNfa(1277): UICC/ESE[0x402] is not activated

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

D/HostEmulationManager(1277): Selecting next, last or previous AID occurrence is not supported

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

因此,您需要确保阅读器端正在发送正确的命令以进行应用程序选择。

【讨论】:

  • 感谢您为我指明正确的方向,请参阅我对问题核心的回答。
【解决方案3】:

问题是由于某种原因棒棒糖在发送的 APDU 中不支持卡标识符或 CID。因此,当阅读器发送带有 CID 的下一个命令时,手机将禁用该命令并保持接收模式。因此,这需要发送没有 CID 的 APDU 命令。解决方法是联系设备制造商以支持不需要 CID 的卡,如@SOERGI 所说。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多