我正在尝试使用这款Host card emulation使用ACR1281U NFC标签阅读器在Android设备上进行example。
This是我想要的那种应用程序。
根据Android文档和示例,需要在Android项目中注册AID:
<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="F0010203040506"/>
<aid-filter android:name="F0394148148100"/>
</aid-group>
</host-apdu-service>
我怎么知道我需要在我的Android应用程序中注册哪个AID,以便读者可以阅读HCE Android应用程序?
这是我发布的另一个问题:No supported card terminal found ARC1281U nfc card reader
我已经提到了以下链接,但没有太多帮助:
请帮助,因为HCE上的资源非常少!
该示例在SELECT(通过AID)命令中使用AID F0010203040506
,但我的ACR128阅读器无法读取HCE设备。
private static final byte[] CLA_INS_P1_P2 = { 0x00, (byte)0xA4, 0x04, 0x00 };
private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
private byte[] createSelectAidApdu(byte[] aid) {
byte[] result = new byte[6 + aid.length];
System.arraycopy(CLA_INS_P1_P2, 0, result, 0, CLA_INS_P1_P2.length);
result[4] = (byte)aid.length;
System.arraycopy(aid, 0, result, 5, aid.length);
result[result.length - 1] = 0;
return result;
}
然后我将AID更改为F00000000A0101
(由其他一些示例应用程序使用)并在AID过滤器中使用它。更改为此AID后,ACR阅读器能够检测到HCE设备。
AID是您分配给智能卡应用程序的“名称”(在HCE的情况下:模拟卡应用程序的Android应用程序)。阅读器应用程序使用此“名称”通过SELECT(通过DF名称/ AID)APDU命令(请参阅ISO / IEC 7816-4)来寻址您的卡(HCE)应用程序。只要符合ISO / IEC 7816-4,您就可以使用任何您想要的值。
在您的具体情况下,reader example application使用AID F0010203040506
private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
因此,要与该示例互操作,您需要为AID F0010203040506
注册您的HCE服务。
通常,您首先为HCE应用定义“名称”:
<host-apdu-service ...>
<aid-group ...>
<aid-filter android:name="F0010203040506"/>
</aid-group>
</host-apdu-service>
之后,读者应用程序可以使用该名称来选择您的HCE应用程序,然后与之通信(使用Java,例如使用Java智能卡IO):
Card card = ...;
CardChannel c = card.getBasicChannel();
// SELECT by AID (F0010203040506)
ResponseAPDU resp = c.transmit(new CommandAPDU(
0x00, 0xA4, 0x04, 0x00, new byte[] { (byte)0xF0, (byte)0x01, (byte)0x02, (byte)0x03, (byte)0x04, (byte)0x05, (byte)0x06 }));
assert resp.getSW() == 0x9000;
// Send application-specific command (what such a command could look like depends on your application)
resp = c.transmit(new CommandAPDU(
0x80, 0x10, 0x00, 0x00, new byte[] { (byte)0x12, (byte)0x34 }));
这取决于您的应用场景。
有时需要通过多个“名称”(AID)来寻址应用程序。原因可能是:
智能卡应用程序标识符(AID)的规则在ISO / IEC 7816-4中定义。 AID至少有5个字节,最多可包含16个字节(有关AID大小限制,请参阅this answer)。基于前4位,AID被分成不同的组。 ISO / IEC 7816-4中定义的最相关的组是:
'A'
开头的AID:国际注册的AID'D'
开头的AID:全国注册的AID'F'
开头的AID:专有AID(无注册)对于(国际)国家注册的AID,AID分为两部分,一个5字节的强制性RID(注册的应用程序提供者标识符)和一个最多11个字节的可选PIX(专有应用程序标识符扩展)。
对于专有AID(F...
),您可以使用任意值。
F00000000A0101
工作,而F0010203040506
不起作用?我不知道,你没有提供足够的信息来诊断这一点。例如。当你试图选择F0010203040506
时adb日志中有任何消息?
无论如何,两个AID都是有效的并且应该有效。一种可能是您已经在设备上安装了另一个注册该AID的HCE应用程序。在这种情况下,两个应用程序将听取相同的名称,这是不可能的。