为什么我的HCE应用程序没有进入我的HCE服务?

时间:2014-11-13 01:51:20

标签: android nfc apdu smartcard-reader hce

我正在尝试将一个九位数字发送到NFC阅读器,但我的服务似乎没有启动。任何帮助将不胜感激。我正在测试的手机是三星Galaxy S3,而我正在使用Eclipse。

这是我的NFC阅读器发送的APDU命令。

F0A40400100F01020304

这是我得到的回复,这意味着(我认为)找不到文件。

6A 82

以下是如何构建APDU命令。

private byte CLS = (byte)0x00;
private byte SELECT_INS = (byte)0xA4;
private byte P1 = (byte)0x04;
private byte P2 = (byte)0x00;
private byte[] aid = {0x0F, 0x01, 0x02, 0x03, 0x04};
private Long TIMEOUT = 1000L;
private byte OK = (byte)0x90;

这是我的AID。

F0010203040506

问题是它甚至没有到达我的HCE服务,因此我的processCommandApdu永远不会被调用。我的日志猫显示了这一点。

11-12 15:56:50.175: D/NativeNfcManager(1064): doReceiveData. reutrn..
11-12 15:56:50.175: D/HostEmulationManager(1064): notifyHostEmulationData
11-12 15:56:50.175: D/HostEmulationManager(1064): call findSelectAid - 1
11-12 15:56:50.175: D/NativeNfcManager(1064): mAppletSelectStatus=3
11-12 15:56:50.185: D/NativeNfcManager(1064): Waiting for an APDU...
11-12 15:56:50.195: D/NativeNfcManager(1064): doReceiveData. reutrn..
11-12 15:56:50.195: D/HostEmulationManager(1064): notifyHostEmulationData
11-12 15:56:50.195: D/HostEmulationManager(1064): call findSelectAid - 1
11-12 15:56:50.195: D/HostEmulationManager(1064): Dropping non-select APDU in          STATE_W4_SELECT
11-12 15:56:50.195: D/NativeNfcManager(1064): mAppletSelectStatus=3
11-12 15:56:50.205: D/NativeNfcManager(1064): Waiting for an APDU...
11-12 15:56:50.205: D/dalvikvm(10513): GC_CONCURRENT freed 994K, 53% free 8422K/17772K, paused 2ms+6ms, total 48ms
11-12 15:56:50.205: D/dalvikvm(10513): WAIT_FOR_CONCURRENT_GC blocked 39ms
11-12 15:56:50.215: W/SAMMLibraryCore(10513): Not AMS File(Invalid AMS End Marker)
11-12 15:56:50.215: W/SAMMLibrary(10513): Error on load SAMM File Info
11-12 15:56:50.225: D/NativeNfcManager(1064): doReceiveData. reutrn..
11-12 15:56:50.225: D/HostEmulationManager(1064): notifyHostEmulationData
11-12 15:56:50.225: D/HostEmulationManager(1064): call findSelectAid - 1
11-12 15:56:50.225: D/NativeNfcManager(1064): mAppletSelectStatus=3
11-12 15:56:50.225: W/SAMMLibraryCore(10513): Not AMS File(Invalid AMS End Marker)
11-12 15:56:50.225: W/SAMMLibrary(10513): Error on load SAMM File Info
11-12 15:56:50.225: D/NativeNfcManager(1064): Waiting for an APDU...

这是我在AndroidManifest中声明的服务。

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

最后,我的服务是res / xml(我创建的文件夹)。

<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/servicedesc"
android:requireDeviceUnlock="false" >

<aid-group
    android:category="other"
    android:description="@string/aiddescription" >
    <aid-filter android:name="F0010203040506" />       
</aid-group>

</host-apdu-service>

1 个答案:

答案 0 :(得分:2)

在您的host-apdu服务中,您注册了AID

F0010203040506

为了与您的HCE服务进行通信,读者必须为该AID发出SELECT(通过AID / DF名称)命令。有效的SELECT命令可能如下所示:

00 A4 0400 07 F0010203040506

您(可能?)使用代码构建的命令

private byte CLS = (byte)0x00;
private byte SELECT_INS = (byte)0xA4;
private byte P1 = (byte)0x04;
private byte P2 = (byte)0x00;
private byte[] aid = {0x0F, 0x01, 0x02, 0x03, 0x04};

与您注册的AID不匹配。相反,这是数据可用于为AID 0F01020304构建一个SELECT命令(这不是一个正确形成的AID顺便说一句。)

更糟糕的是,您在上面显示的APDU命令

F0A40400100F01020304

既不是SELECT命令也不是有效的APDU命令。

对于选择Andorid HCE应用程序,CLA字节必须为0x00(但在您的情况下为0xF0)。 Lc字段为0x10(16字节),但数据字段仅包含5个字节。