&引用;选择AID";在Android HCE中,命令并不总是路由到HostApduService 问题陈述

&引用;选择AID";在Android HCE中,命令并不总是路由到HostApduService 问题陈述,android,nfc,hce,Android,Nfc,Hce,我试图理解为什么“Select AID”命令并不总是成功地路由到启用HCE的应用程序的HostApduService 有时,“选择辅助”被正确路由到HostApduService,从以下logcat输出可以看出: 07-11 20:11:36.386: D/NxpNfcJni(1486): RoutingManager::stackCallback: event=0x18 07-11 20:11:36.396: D/HostEmulationManager(1486): notifyHostEm

我试图理解为什么“Select AID”命令并不总是成功地路由到启用HCE的应用程序的HostApduService

有时,“选择辅助”被正确路由到HostApduService,从以下logcat输出可以看出:

07-11 20:11:36.386: D/NxpNfcJni(1486): RoutingManager::stackCallback: event=0x18
07-11 20:11:36.396: D/HostEmulationManager(1486): notifyHostEmulationActivated
07-11 20:11:36.396: D/NxpNfcJni(1486): RoutingManager::stackCallback: event=0x17
07-11 20:11:36.396: D/NxpNfcJni(1486): RoutingManager::stackCallback: NFA_CE_DATA_EVT; stat=0x0; h=0x301; data len=18
07-11 20:11:36.396: D/HostEmulationManager(1486): notifyHostEmulationData
07-11 20:11:36.396: D/HostEmulationManager(1486): Binding to service ComponentInfo{email.HCE/email.HCE.MyHCEService}
07-11 20:11:36.416: D/HostEmulationManager(1486): Waiting for new service.
07-11 20:11:36.466: D/MYHCESERVICE(25504): APDU RECEIVED
07-11 20:11:36.466: D/HostEmulationManager(1486): Sending data
07-11 20:11:37.276: E/SMD(284): DCD ON
07-11 20:11:37.436: D/NxpNfcJni(1486): RoutingManager::stackCallback: event=0x19
07-11 20:11:37.436: D/NxpNfcJni(1486): RoutingManager::stackCallback: NFA_DEACTIVATED_EVT, NFA_CE_DEACTIVATED_EVT
07-11 20:11:37.446: D/HostEmulationManager(1486): notifyHostEmulationDeactivated
07-11 20:11:37.446: D/MYHCESERVICE(25504): DISCONNECT
07-11 20:11:37.446: D/HostEmulationManager(1486): Unbinding from service ComponentInfo{email.HCE/email.HCE.MyHCEService}
07-11 20:11:37.446: D/MYHCESERVICE(25504): Disconnect by DEACTIVATION_LINK_LOSS
07-11 20:11:37.466: E/NfcNfa(1486): UICC/ESE[0x402] is not activated
但是,更常见的情况是,“Select AID”命令似乎没有到达hostapdus服务。更糟糕的是,在LogCat输出中似乎根本没有来自NxpNfcJni的活动。考虑到成功尝试的LogCAT输出,我认为NXPNFCJNI是切入点。 必须指出的是,成功的频率比失败的频率低得多

测试设置 以下是HCE设备和相应相关代码的说明,随后是控制读卡器的应用程序的说明

1。HCE设备

  • 硬件:三星Galaxy S5
  • 操作系统:安卓5.0
  • HostApduService的代码:
  • Android清单:
  • 用于连接读卡器并传输select应用程序命令的伪代码:
问题:
有人知道为什么“Select AID”命令并不总是成功吗?或者有人能给出一些指示来调试这个吗?

我强烈建议使用这个开源项目,它允许你在另一部Android手机上运行这个应用来测试AID选择。过去它对我很有帮助。应用程序中有用于支付应用程序的预编程辅助工具,但您也可以手动输入自定义辅助工具。在我看来,这比使用USB读卡器更容易测试


通过“ASK RDR 417(PC/SC)属性”(见下图),通过为ASK RDR 417仅选择1种轮询卡,HostAPDU服务的响应正确且符合预期

我很想知道为什么,乍一看,这似乎限制了读者的能力


如果选择失败,您在读卡器端会收到什么错误(或状态字)?从WinSCard.dll Transmit()函数返回的错误代码是1112d或0x0458。但是,这不是典型的WinSCard错误代码,因此当查看Windows错误时,这意味着:驱动器中的错误\u无\u媒体,\u,来源:
public class MyHCEService extends HostApduService {
    @Override
    public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
        Log.d("MYHCESERVICE", "APDU RECEIVED");
        return new byte[]{(byte)0x6F,(byte)0x25}; //returned byte array reduced for this example
    }

    @Override
    public void onDeactivated(int reason) {
        Log.d("MYHCESERVICE", "DISCONNECT");
        switch(reason) {
        case MyHCEService.DEACTIVATION_DESELECTED:
            Log.d("MYHCESERVICE", "Disconnect by DEACTIVATION_DESELECTED");
        case MyHCEService.DEACTIVATION_LINK_LOSS:
            Log.d("MYHCESERVICE", "Disconnect by DEACTIVATION_LINK_LOSS");
        }
    }    
}
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="email.HCE"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="19"
        android:targetSdkVersion="22" />

    <uses-permission android:name="android.permission.NFC" />

    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    <uses-feature android:name="android.hardware.nfc.hce" android:required="true" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <service android:name=".MyHCEService" 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>

        <activity
            android:name=".ListBluetoothDevicesActivity"
            android:label="@string/app_name" 
            android:screenOrientation="portrait"
            android:configChanges="screenSize|orientation|keyboardHidden" >
        </activity>

    </application>

</manifest>
<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="11223344556677889900112233"/>
    </aid-group>
</host-apdu-service>
byte[] CMD_SelectApp = { 
    0x00, //CLA 
    0xA4, //INS
    0x04, //P1
    0x00, //P2
    0x0D, //LC
    0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x00, 0x11, 0x22, 0x33 //AID
};
SCardContext _Context = new SCardContext();
_Context.Establish(SCardScope.System);
SCardReader _Reader = new SCardReader(_Context);
_Reader.Connect(SelectedReader, SCardShareMode.Direct, SCardProtocol.Any);
_Reader.Transmit(CMD_SelectApp, CMD_SelectApp.Length, RecvBuffer, ref ReceiveBufferLength);