当前位置: 首页 > 知识库问答 >
问题:

如何为基于主机的读卡器仿真获得AID

张玺
2023-03-14

我正在尝试使用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>

我如何知道我需要在我的Android应用程序中注册哪些AID,以便读者可以阅读HCE Android应用程序?

这里是我发布的另一个关于同样问题的问题:没有找到支持的卡终端ARC1281U nfc读卡器

我参考了以下链接,但没有多大帮助:

  • 设置主机卡仿真
  • 获取基于NFC的识别系统的应用程序ID
  • 基于主机的卡仿真如何处理AID(应用程序ID)
  • AndroidHCE:援助有规则吗

请提供帮助,因为HCE上的可用资源非常少!

该示例在SELECT(by AID)命令中使用AIDF0010203040506,但我的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(一个用在不起作用的例子中,另一个用在起作用的应用程序中)都符合规范,如何知道使用哪个AID?
  • 该示例在AID过滤器中添加了多个AID,但在SELECT(by AID)APDU中只发送其中一个。我还应该在AID过滤器中添加多个AID吗?它有什么用?

共有1个答案

殷烨
2023-03-14

AID是您分配给智能卡应用程序的“名称”(在HCE的情况下:模拟智能卡应用程序的Android应用程序)。读卡器应用程序使用此“名称”通过SELECT(按DF名称/AID)APDU命令(参见ISO/IEC 7816-4)为您的卡(HCE)应用程序寻址。只要符合ISO/IEC 7816-4,就可以使用任何想要的值。

在您的特定情况下,reader示例应用程序使用AIDF0010203040506

private static final byte[] AID_ANDROID = { (byte)0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };

因此,为了与该示例互操作,您需要注册AID的HCE服务F0010203040506

通常,您首先为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 }));

这取决于你的应用场景。

>

在实际HCE方案中,通常设计HCE应用以与现有阅读器架构体系进行交互。因此,您的HCE应用程序将实现某些给定的规范。在这种情况下,这样的规范将规定HCE应用需要使用的AID(或多个AID),以便现有阅读器架构体系能够发现这些AID。这种规范的一个例子是用于非接触式支付系统的EMV规范。

有时需要通过多个“名称”(AIDs)对应用程序进行寻址。原因可能是:

  • 一个应用程序提供多个不同的接口(即具有不同的命令集或提供不同的数据
  • 现有的阅读器(出于某种原因)使用不同的辅助工具来处理同一个应用程序

ISO/IEC 7816-4中定义了智能卡应用标识符(AIDs)的规则。一个AID至少有5个字节,最多可以由16个字节组成(请参阅关于AID大小限制的回答)。根据前4位,艾滋病被分为不同的组。ISO/IEC 7816-4中定义的最相关组包括:

  • 'A'开头的AID:国际注册的AID
  • 'D'开头的AID:全国注册的AID
  • 'F'开头的AID:专有AID(没有注册)

对于(国际)国家注册的AIDs,AID分为两部分,一部分是5字节的强制RID(注册应用程序提供商标识符),另一部分是最多11字节的可选PIX(专有应用程序标识符扩展)。

对于专有AID(F...),可以使用任意值。

我不知道,你也没有提供足够的信息来诊断。例如,当您尝试选择F0010203040506时,adb日志中有哪些消息?

不管怎样,两个AID都是有效的,应该可以工作。一种可能是您的设备上已经安装了注册该AID的另一个HCE应用程序。在这种情况下,两个应用程序将监听相同的名称,这是不可能的。

 类似资料:
  • HCE是在Android 4.4中实现的,但是关于如何在模拟卡中写入的信息很少。 我有心肺复苏40.30阅读器 这个读者带来了一些样本NFC卡。我使用NFC读卡应用程序读取这些卡。 与CPR 40.30兼容的NFC卡详细信息 IC制造商:恩智浦半导体 我想写HCE代码,希望我的Android手机像一张卡片一样,可以被CPR 40.30阅读器读取。我假设HCE代码应该模拟具有上述规格的卡,因为读卡器

  • 通过阅读《HCE开发者指南》,这里的《HCE开发者指南》似乎可以将android手机用作阅读器。我把卡片信息放在NFC标签上,然后用手机读。我想让手机充当阅读器。你知道这是否可行吗?我创建了一个示例项目,其中包含以下代码行: 我不知道下一步该去哪里。

  • 我一直在查看全球平台规范,了解如何为我的应用程序定义APDU,该应用程序将使用主机卡模拟(HCE)。我的应用程序应该有一部手机通过HCE像NFC标签一样工作,另一部手机充当NFC阅读器。我试图在手机之间传输的任意数据只是一个包含ID号的简单字符串,但我不确定如何在代码中应用它。我已经了解了不同字节命令的含义,但我真的不知道如何应用它。 我想我需要使用STORE DATA命令,但我不知道如何直观地执

  • 我开发了一个系统,可以使用带有PN532芯片的阅读器读取NFC标签。它工作正常。我可以阅读米费尔经典和米费尔超轻标签。 现在我想使用带有Android 4.4.2的Nexus平板电脑来模拟标签。我没有Android开发经验,但我认为这是可能的。 我已经在Nexus平板电脑中设置了NFC通信,但我想我必须下载或编写一些应用程序来模拟Tag和NDEF通信。 最简单的方法是什么?

  • translated_page: https://github.com/PX4/Devguide/blob/master/en/simulation/sitl.md translated_sha: 95b39d747851dd01c1fe5d36b24e59ec865e323e 软件在环仿真 (SITL) 软件在环仿真是在主机上运行一个完整的系统并模拟自驾仪。它通过本地网络连接到仿真器。 设置成如

  • 3.3.1.仿真器 vs 真机 在大多数情况下,应用在仿真器上执行,与在真机上是没有区别的。少数的例外情况则往往是因为难以模拟,比如传感器。一般的硬件相关特性比如电话呼叫、地理定位等等,都可以由仿真器模拟。