- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试做 Host card emulation在 Android 设备上使用此 example使用 ACR1281U NFC 标签阅读器。
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 命令寻址您的卡 (HCE) 应用程序(参见 ISO/IEC 7816-4)。您可以使用任何您想要的值,只要它符合 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 }));
这取决于你的应用场景。
在您的闭环场景中,您可以完全控制 HCE 端和读取器端,您可以选择一个任意的(请注意这里有 are some rules for AIDs )AID 并将其分配给您的 HCE 应用程序.您稍后可以在阅读器应用程序中使用该 AID 来处理 HCE 应用程序。
在现实世界的 HCE 场景中,您通常会设计 HCE 应用程序以与现有的阅读器基础架构进行交互。因此,您的 HCE 应用程序将实现一些给定的规范。在这种情况下,这样的规范将规定您的 HCE 应用程序需要使用的 AID(或多个 AID)才能被现有的阅读器基础设施发现。此类规范的一个示例是非接触式支付系统的 EMV 规范。
有时需要通过多个“名称”(AID) 对应用程序进行寻址。原因可能是:
智能卡应用程序标识符 (AID) 的规则在 ISO/IEC 7816-4 中定义。一个 AID 至少有 5 个字节,最多可以包含 16 个字节(参见 this answer 关于 AID 大小限制)。根据前 4 位,AID 被分为不同的组。 ISO/IEC 7816-4 中定义的最相关组是:
'A'
开头的AID:国际注册的AID'D'
开头的AIDs:国家注册的AIDs'F'
开头的 AID:专有 AID(无需注册)对于(国际)国家注册的 AID,AID 分为两部分,一个 5 字节的强制性 RID(注册应用程序提供商标识符)和一个可选的最多 11 个字节的 PIX(专有应用程序标识符扩展)。
对于专有 AID (F...
),您可以使用任意值。
F00000000A0101
有效而 F0010203040506
无效?我不知道,而且您没有提供足够的信息来对此进行诊断。例如。当您尝试选择 F0010203040506
时,adb 日志中哪里有任何消息?
无论如何,这两个 AID 都是有效的并且应该有效。一种可能是您的设备上已经安装了另一个 HCE 应用程序并注册了该 AID。在那种情况下,两个应用程序会监听同一个名称,这是不可能的。
关于android - 如何为基于读卡器主机的卡仿真获取 AID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877373/
我正在使用 Jackson 2.9.2 和 Retrofit 2.1.0 使用 JSONArray 进行一些 POST 操作> 作为 HTML-Header 参数。 API 定义了一个值为 aId 的
我在 中有以下 javascript 函数切换 的可见性 function toggleAndChange(aID,divID) { $(divID).toggle(); if
我想选择父级第一个隐藏元素,其 id 值包含“AID”。我怎么做 ? 到目前为止我的代码: function appendControl(e) { var AnsID = $("input
我正在手机上开发 Android 应用程序,在应用程序 AIDE 上.它是一个非常有用的工具。但是当 AIDE 说没有错误并且我安装并运行我的应用程序时,我收到提示:“不幸的是,(此处的应用程序名称)
我现在正在使用助手,因为我的 PC 目前已经不在了。 我正在尝试导入 SlidingMenu ( Link ) 库,但 AIDE 似乎不支持以文件(项目)的形式。 我所看到的所有导入库都是 .jar
在我的 aide 配置文件中,我收到一个“选择性正则表达式错误”错误,其中包含一个宏 @@define BDIRS {ABC,ABD} 用法如下 /backup/@@{BDIRS}$ ... /bac
我正在尝试做 Host card emulation在 Android 设备上使用此 example使用 ACR1281U NFC 标签阅读器。 This是我想做的那种应用。 根据Android文档和
AIDE在基础代码pad 4.2.2创建空白项目时,AIDE发现错误: This method must return the value of type" QuickFix 还建议通过在倒数第二个括
我有一张城市交通卡。我需要知道卡的援助(应用程序标识符)号码是多少。根据 EMV Book 1,我必须使用 List of AIDs 方法(第 141 页)。但是如何呢? 我还有一个 ACR122U
我目前正在编写一个程序,它将充当其他应用程序的服务器。该程序将接受一个请求,然后转到数据库并执行调用应用程序请求的所有功能,并将控制权返回给调用应用程序。万一出了问题,我想强制程序转储以放弃援助(以备
我喜欢使用 AIDE 开发环境(最近支持 Java 7)在 Android 平板电脑上编写应用程序。 现在可以使用 Java 8 lambda 表达式吗?...即使以某种方式伪造? (我问这个问题是因
我遇到了 Jade-agent 问题,无法继续进行签名练习。 问题如下: 我有两个基本代理:卖家和买家。每一种可能都有不止一个。它们使用 JADE 协议(protocol)进行通信。卖家说出产品的价格
我只想将我的应用程序链接到 Firebase,是否可以通过 IDE(集成开发环境)android 应用程序。 IDE 是否支持 Firebase 电话身份验证? 最佳答案 借助 Android Stu
如果我想让我的 android 手机模拟物理卡到以下读卡器: http://www.hidglobal.com/products/readers/iclass/rw100 我必须使用哪种 AID? 我
我有一个 Android 应用程序,其中一个服务注册到 Android beam,一个服务注册到主机卡模拟。我想决定何时在代码中启用/禁用 HCE 服务。 list 中的 HCE 服务如下所示 -
我是 Android 编程的新手,我想编写和编译基于 opencv 库的应用程序,我想在我的平板电脑上使用 AIDE 执行此操作,但我不知道如何在 AIDE 中设置 opencv 库。谁能帮帮我? 最
我正在尝试使用 ACR122 NFC 阅读器来选择在一个使用 Android 主机卡仿真的 Nexus 5。但是,小型 AID 不是认可。 我的目标是使用三字节长的 AID,就像我在 DESfire
在Android开发应用程序AIDE中,如何查看编译警告信息?以前的版本显示一条黄色的波浪形下划线,您可以点击它,然后会弹出一条 toast 消息。但是,这种情况不会再发生。 对于错误,有一个错误列表
我不是很熟悉 Gradle,但据我了解,您应该能够直接从 Internet 中提取库?我已按照项目的说明进行操作,但得到了一个 error AIDE不支持远程maven repos吗?我确认有问题的库
“AIDE”是一款适用于 Android 的 IDE。它处理 Java、 native 开发、HTML 开发等。 更具体地说,我试图了解如何导入在 AIDE 中启动的模板 LibGDX 项目,并打开该
我是一名优秀的程序员,十分优秀!