我正在尝试做 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/
我刚刚为fedora安装了emacs。我想用emacs编写ruby。为ruby提供代码提示、代码完成类型功能所需的工具、扩展是什么? 最佳答案 ruby-mode已经包含在Emacs23之后的版本中。不过,它也可以通过ELPA获得。您可能感兴趣的其他一些事情是集成RVM、feature-mode(Cucumber)、rspec-mode、ruby-electric、inf-ruby、rinari(用于Rails)等。这是我当前用于Ruby开发的Emacs配置:https://github.com/citizen428/emacs
我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
我使用rails3.1+rspec和factorygirl。我对必填字段(validates_presence_of)的验证工作正常。我如何让测试将该事实用作“成功”而不是“失败”规范是:describe"Addanindustrywithnoname"docontext"Unabletocreatearecordwhenthenameisblank"dosubjectdoind=Factory.create(:industry_name_blank)endit{shouldbe_invalid}endend但是我失败了:Failures:1)Addanindustrywithnona
我正在使用DMOZ的listofurltopics,其中包含一些具有包含下划线的主机名的url。例如:608609TheOuterHeaven610InformationandimagegalleryofMcFarlane'sactionfiguresforTrigun,Akira,TenchiMuyoandotherJapaneseSci-Fianimations.611Top/Arts/Animation/Anime/Collectibles/Models_and_Figures/Action_Figures612虽然此url可以在网络浏览器中使用(或者至少在我的浏览器中可以使用:
我一直在玩一个脚本,它在Chrome中获取选定的文本并在Google中查找它,提供四个最佳选择,然后粘贴相关链接。它以不同的格式粘贴,具体取决于当前在Chrome中打开的页面-DokuWiki打开的DokuWiki格式,普通网站的HTML,我想要我的WordPress所见即所得编辑器的富文本。我尝试使用pbpaste-Preferrtf来查看没有其他样式的富文本链接在粘贴板上的样子,但它仍然输出纯文本。在文本编辑中保存文件并进行试验后,我想出了以下内容text=%q|{\rtf1{\field{\*\fldinst{HYPERLINK"URL"}}{\fldrsltTEXT}}}|te