我有一个 ACR122U NFC 读写器连接到我的 Windows 机器,并安装了 ACR122 驱动程序。
我尝试使用javax.smartcardio
API 将 SELECT(通过 AID)ADPU 发送到我的 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
是我的 Android 设备向 NFC 阅读器提供的 UID。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 设备。
这是 Android 项目的 apduservice.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="F0010203040507" />
</aid-group>
</host-apdu-service>
此外,还有几个 ADPU 在传输时会使 NFC 阅读器有些卡住。例如,
execute(channel, new byte[] {(byte) 0xFF, 0x00, 0x00, 0x00, 0x02, (byte) 0xd4, 0x04}, card);
查询PN532芯片当前状态的伪APDU不返回任何响应。会不会是这个特定的读者有缺陷?我怎样才能检查它?
更新(基于聊天中的讨论):
使用第二个阅读器(相同型号,相同版本)进行的测试刚刚奏效。因此,可能是第一个阅读器上的一些模糊设置,或者阅读器只是出现故障。
两个阅读器具有相同的版本信息:
- ACR122U固件版本:41435231323255323135 (-> ACR122U215)
- PN532 版本:D503 32010607 9000 (-> PN532 v1.6)