Rac*_*nda 8 android rfid apdu nfc hce
我正在尝试使用ACR1281U NFC标签阅读器使用此示例在Android设备上进行主机卡仿真.
这是我想要的那种应用程序.
根据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>
Run Code Online (Sandbox Code Playgroud)
我怎么知道我需要在我的Android应用程序中注册哪个AID,以便读者可以阅读HCE Android应用程序?
这是我发布的另一个相同的问题:没有支持的卡终端找到ARC1281U nfc读卡器
我已经提到了以下链接,但没有太多帮助:
请帮助,因为HCE上的资源非常少!
该示例使用F0010203040506SELECT(通过AID)命令中的AID,但我的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;
}
Run Code Online (Sandbox Code Playgroud)
然后我将AID更改为F00000000A0101(其他一些示例应用程序使用)并在AID过滤器中使用它.更改为此AID后,ACR阅读器能够检测到HCE设备.
Mic*_*and 19
AID是您分配给智能卡应用程序的"名称"(在HCE的情况下:模拟卡应用程序的Android应用程序).阅读器应用程序使用此"名称"通过SELECT(通过DF名称/ AID)APDU命令(请参阅ISO/IEC 7816-4)来寻址您的卡(HCE)应用程序.只要符合ISO/IEC 7816-4,您就可以使用任何您想要的值.
在您的特定情况下,阅读器示例应用程序使用AIDF0010203040506
private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
Run Code Online (Sandbox Code Playgroud)
因此,要与该示例互操作,您需要为AID注册HCE服务F0010203040506.
通常,您首先为HCE应用定义"名称":
<host-apdu-service ...>
<aid-group ...>
<aid-filter android:name="F0010203040506"/>
</aid-group>
</host-apdu-service>
Run Code Online (Sandbox Code Playgroud)
之后,读者应用程序可以使用该名称来选择您的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 }));
Run Code Online (Sandbox Code Playgroud)
这取决于您的应用场景.
在您完全控制HCE侧和阅读器侧的闭环场景中,您可以选择任意(注意AID 有一些规则)AID并将其分配给您的HCE应用程序.您可以稍后在阅读器应用程序中使用该AID来处理HCE应用程序.
在实际的HCE场景中,您经常将HCE应用程序设计为与现有的阅读器基础架构进行交互.因此,您的HCE应用程序将实现一些给定的规范.在这种情况下,此类规范将规定您的HCE应用程序需要使用的AID(或AID),以便现有的读取器基础结构可以发现.这种规范的一个例子是非接触式支付系统的EMV规范.
有时需要通过多个"名称"(AID)来寻址应用程序.原因可能是:
智能卡应用程序标识符(AID)的规则在ISO/IEC 7816-4中定义.AID至少有5个字节,最多可包含16个字节(有关AID大小限制,请参阅此答案).基于前4位,AID被分成不同的组.ISO/IEC 7816-4中定义的最相关的组是:
'A':国际注册的AID'D':国家注册的AID'F':专有AID(无注册)对于(国际)国家注册的AID,AID分为两部分,一个5字节的强制性RID(注册的应用程序提供者标识符)和一个最多11个字节的可选PIX(专有应用程序标识符扩展).
对于专有AID(F...),您可以使用任意值.
F00000000A0101工作F0010203040506不起作用?我不知道,你没有提供足够的信息来诊断这一点.例如,当您尝试选择adb日志中的任何消息时F0010203040506?
无论如何,两个AID都是有效的并且应该有效.一种可能是您已经在设备上安装了另一个注册该AID的HCE应用程序.在这种情况下,两个应用程序将听取相同的名称,这是不可能的.