使用HCE模拟公交卡

时间:2018-01-27 16:12:33

标签: android nfc apdu contactless-smartcard hce

我想向用户显示公交卡的ID(IsoDep,NfcB),以及我使用以下guide成功完成的操作。

现在,我尝试使用以下guide模拟主机卡模拟卡。

我使用以下代码创建了一个名为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>

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

1 个答案:

答案 0 :(得分:0)

您在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

您可能还想阅读