【问题标题】:Emulating a public transit card with HCE使用 HCE 模拟公共交通卡
【发布时间】:2018-01-27 16:12:32
【问题描述】:

我想向用户显示公共交通卡的ID(IsoDep,NfcB),我用下面的guide成功地做到了。

现在我正在尝试使用以下guide 使用 Host Card Emulation 来模拟卡。

我使用以下代码创建了一个名为 MyHosApduService.java 的新类:

public class MyHostApduService extends HostApduService {
    @Override
    public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
       ...
    }
    @Override
    public void onDeactivated(int reason) {
       ...
    }
}   

使用以下代码在AndroidManifest.xml 声明服务:

<service android:name=".MyHostApduService" android:exported="true"
            android:permission="android.permission.BIND_NFC_SERVICE">
            <intent-filter>
                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
            </intent-filter>
            <meta-data android:name="android.nfc.cardemulation.host_apdu_service"
                android:resource="@xml/apduservice"/>
        </service>

还有apduservice.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/servicedesc"
    android:requireDeviceUnlock="false">
    <aid-group android:description="@string/aiddescription"
        android:category="other">
        <aid-filter android:name="0x00DDA611"/>
    </aid-group>
</host-apdu-service>

从这里,如何将正确的数据发送到服务并正确触发服务?

【问题讨论】:

    标签: android nfc apdu contactless-smartcard hce


    【解决方案1】:

    您在 AID 过滤器中选择和注册的 AID 无效。 AID 值必须由不带“0x”前缀的十六进制数字组成。此外,它必须由至少 5 个字节和最多 16 个字节组成。 AID 的有效格式在 ISO/IEC 7816-4 中定义。详情请见this answer

    注意你通过的ID(防碰撞标识符/标签标识符/UID/等)

    byte[] id = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
    

    byte[] id = tag.getId();
    

    不是智能卡应用程序标识符 (AID)。 Android HCE 不允许您选择该 ID。相反,您只能模拟由 AID 标识的智能卡应用程序。这意味着智能卡读卡器将通过发出与您的应用程序名称(即 AID)匹配的 SELECT 命令来搜索您手机上的特定 HCE 应用程序。

    因此,您首先需要为您的应用程序选择一个有效的 AID,例如F0112233445566。在阅读器方面,您可以发送一个 SELECT APDU 来寻址您的应用程序

    00 A4 04 00 07 F0112233445566 00

    您可能还想阅读

    【讨论】:

    • 感谢您的快速响应!从one of the answers you have attached 我发现了以下内容:在现实世界的 HCE 场景中(我的例子),您经常设计您的 HCE 应用程序以与现有的阅读器基础设施进行交互。 .....在这种情况下,这样的规范将规定您的 HCE 应用程序需要使用的 AID(或多个 AID)才能被现有的阅读器基础设施发现。 ....据我了解,我可以使用我要模拟的卡的 AID 吗?如果是这样,它与Application Data一样吗?
    • 不,AID 与应用程序数据(或屏幕截图中显示的任何其他字段)不同。屏幕截图似乎没有显示任何有用的信息,可以提供有关实际应用程序规范的任何线索。另请注意,您通常需要比 AID 更多的东西来模拟智能卡应用程序(例如有关应用程序协议和密钥的知识)。
    • 那么您能简要解释一下我必须做什么才能让我的应用正常运行吗?
    • 除了您在上面提供的信息之外,还需要更多信息来估计让您的应用“工作”所需的信息。
    • 请问有什么计划帮助的详细解释?
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 2022-10-13
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多