【问题标题】:Host-based Card Emulation, any guidance please?基于主机的卡仿真,请指导?
【发布时间】:2026-01-20 13:50:01
【问题描述】:

我是这个领域的新手,我有一个 Nexus S (CyanogenMod11 = Android Kitkat 4.4.2) 而且我需要使用 HCE(基于主机的卡模拟)模式来模拟非接触式卡。

对于完成此操作我需要遵循的步骤和提示有什么指导吗? ( - 我需要对模拟的安全元件进行编程吗?把它放在云端吗?)

P.S:我还必须使用新的阅读器模式,因为我的应用将被另一部支持 Android NFC 的手机而不是 NFC 阅读器读取。

谢谢。

【问题讨论】:

    标签: android nfc cyanogenmod hce contactless-smartcard


    【解决方案1】:

    在 CyanogenMod 11 之前,CyanogenMod 支持自己的基于主机的卡模拟功能。您可以为android.nfc.tech.IsoPcdA 技术注册foreground dispatch,然后可以使用IsoPcdA.transceive() 方法模拟智能卡。有关如何使用此 API,请参阅 Nikolay Elenkov 的 blog post

    但是,浏览 CyanogenMod 11 source (specifically tht of the NFC service) 时,似乎在版本 11 中已删除此功能,转而支持 Android 4.4 的官方 HCE API。

    官方的 Android 4.4 HCE API 允许应用在 Android 服务中模拟非接触式智能卡(ISO 14443-4 + ISO 7816-4 APDU)。该服务将处理应用程序的所有传入命令 APDU 并生成正确的响应 APDU。有关如何注册此类 HCE 服务的详细信息,请参阅official API user guide,有关如何在 HCE 服务中处理传入命令 APDU 的信息,请参阅this answer

    不幸的是,此 API 在使用 libnfc-nxp 作为低级 NFC 堆栈的设备上也不可用(请参阅 CyanogenMod 11 源代码中 routeAid()enableRoutingToHost() 的空实现)。

    总而言之,似乎目前不可能在带有 CM 11 的 Nexus S 上进行基于主机的卡模拟

    【讨论】:

    • 非常感谢您的详细回复。因此,基于 Nikolay Elenkov 博客中的 cmets,他的方法在 Nexus S 上具有 CM9/CM10 的功能。而且,显然,这是我唯一的解决方案?请问另一个问题,使用 Nikolay Elenkov 的方法,是否可以使用另一个支持 Android NFC 的设备而不是 NFC 阅读器(如在新阅读器模式中)?再次感谢,如果您能尽快回复我,我将不胜感激,这真的很紧急;)^_^和
    • @rick_mo 正确,如果您在 Nexus S 上使用 CM9(我认为实际上是 CM9.1)或 CM10,则可以使用那些 CyanogenMod HCE 扩展。关于从其他 Android NFC 设备进行访问,适用与官方 Android HCE 相同的限制(即您需要通过使用 reader-mode API 禁用点对点通信)。
    • 对不起,如果我不太明白,你的意思是“从另一个CM9.1/CM10 NFC设备读取”是不可能的?
    • 不,不是这样的设备会尝试使用点对点模式连接而不是使用读/写模式。
    • 有没有教程可以详细告诉我如何做到这一点?谢谢你:D