Почему мое приложение HCE не попадает в мой HCEservice?
Я пытаюсь отправить девятизначный номер в NFC Reader, но, похоже, мой сервис не запускается. Любая помощь будет принята с благодарностью. Я тестирую телефон Samsung Galaxy S3, и я использую Eclipse.
Вот команда APDU, которую отправляет мой NFC Reader.
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;
Вот моя помощь.
F0010203040506
Проблема в том, что он даже не достигает моего HCEservice, поэтому мой 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 ответ
В вашем хост-apdu-сервисе вы зарегистрировались на AID
F0010203040506
Чтобы связаться с вашей службой HCE, читатель должен выполнить команду SELECT (по имени AID/DF) для этого AID. Действительная команда 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, для которого вы зарегистрированы. Вместо этого эти данные могут быть использованы для построения команды SELECT для AID 0F01020304 (это, кстати, неправильно сформированный AID).
Еще хуже, команда APDU, которую вы показываете выше
F0A40400100F01020304
не является ни командой SELECT, ни действительной командой APDU.
Для выбора приложения Andorid HCE байт CLA должен быть 0x00 (но в вашем случае это 0xF0). Поле Lc имеет размер 0x10 (16 байтов), но поле данных содержит только 5 байтов.