我正在尝试使用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读卡器
我参考了以下链接,但没有多大帮助:
请提供帮助,因为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是您分配给智能卡应用程序的“名称”(在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 真机 在大多数情况下,应用在仿真器上执行,与在真机上是没有区别的。少数的例外情况则往往是因为难以模拟,比如传感器。一般的硬件相关特性比如电话呼叫、地理定位等等,都可以由仿真器模拟。