У меня есть устройство чтения / записи ACR122U NFC, подключенное к моей машине Windows с установленным драйвером ACR122.
Я пытаюсь использовать javax.smartcardio
API для отправки ADECT (SELECT) по AID на мое устройство Android (котороедолжен быть в режиме HCE).
Это мой код:
TerminalFactory factory = TerminalFactory.getDefault();
List<CardTerminal> terminals = factory.terminals().list();
CardTerminal terminal = terminals.get(0);
System.out.println(terminal.getName());
Card card = terminal.connect("*");
CardChannel channel = card.getBasicChannel();
execute(channel, new byte[] { (byte) 0xFF, 0x00, 0x51, (byte) 195, 0x00}, card);
execute(channel, new byte[] { (byte)0xFF, 0x00, 0x00, 0x00, 0x04,(byte)0xD4, 0x4A, 0x01, 0x00}, card); //InListPassiveTarget
execute(channel, new byte[] { (byte)0xFF, 0x00, 0x00, 0x00, 0x04,(byte)0xD4, 0x4A, 0x01, 0x00}, card); //InListPassiveTarget
execute(channel, new byte[] {0x00, (byte) 0xA4, 0x04, 0x00, 7,
(byte)0xF0, 0x01, 0x02, 0x03, 0x04, (byte) 0x05, 0x07, 0}, card); //select AID
...
public static void execute(CardChannel channel, byte[] command, Card...cards) throws CardException {
ByteBuffer r = ByteBuffer.allocate(1024);
channel.transmit(bufferFromArray(command), r);
System.out.println(convertBinToASCII(r.array(), 0, r.position()));
}
Это вывод, который я получаю:
ACS ACR122 0
3B8F8001804F0CA000000306030000000000006B
C3
D54B6300
D54B010108032004010203049000
Я думаю, 01020304
этоUID, представленный моим устройством Android для считывателя NFC.SELECT APDU не возвращает ответа, его длина составляет 0 байт.
На моем устройстве Android у меня есть эта служба:
public class MyHostApduService extends HostApduService {
@Override
public void onCreate() {
super.onCreate();
Log.e("APDU", "APDU service was created.");
}
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
Log.e("APDU", "command apdu: " + Arrays.toString(apdu));
return new byte[2];
}
@Override
public void onDeactivated(int reason) {
Log.e("APDU", "ON DEACTIVATED.");
}
}
Но processCommandAdpu
не вызывается.Просматривая журналы, я ничего не смог найти, когда якобы SELECT ADPU отправлен читателю, поэтому кажется, что ADPU даже не попадает на устройство Android.
Это файл apduservice.xml для проекта Android:
<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="F0010203040507" />
</aid-group>
</host-apdu-service>
Кроме того, есть несколько ADPU, которые при передаче вызывают застревание считывателя NFC.Например,
execute(channel, new byte[] {(byte) 0xFF, 0x00, 0x00, 0x00, 0x02, (byte) 0xd4, 0x04}, card);
, который является псевдо-APDU для запроса текущего состояния микросхемы PN532, не возвращает никакого ответа.Может ли быть так, что этот конкретный читатель имеет недостатки?Как я могу это проверить?
ОБНОВЛЕНИЕ (на основе обсуждение в чате ):
Тест со вторым читателем (та же модель, та же версия) простоработал.Так что это могут быть некоторые неясные настройки на первом считывателе или считыватель просто неисправен.
Оба считывателя имеют одинаковую информацию о версии:
- Версия прошивки ACR122U: 41435231323255323135 (->ACR122U215)
- Версия PN532: D503 32010607 9000 (-> PN532 v1.6)