我们来详细说明一下关于不同模式下的AID响应问题(前提:一个手机,手机上有A、B两个HCE APP,通过读卡器向手机发送APDU选择指令)

1、A和B的应用AID设置的都是payment模式,

只有手机当前选定的默认支付APP会响应,另外一个APP的AID选择指令是不会响应的。

2、A和B的应用AID设置的都是other模式,

当A和B的AID是相同的时候系统会弹出对话框,列出A和B,让用户选择。

如果A和B的AID不同,那么两个APP之间没有相互影响。

3、A和B的应用AID设置的分别是payment(A)和other(B)模式,

如果A和B的AID相同,那么只有A会响应选择指令。

如果A和B的AID不同,那么两者之间不会相互影响

Android 卡模拟(Host-based Card Emulation)。HCE的特点是模拟智能IC卡(ISO 7816-4),可用于金融和行业应用,相应地,CardReader例子中使用IsoDep。

智能IC卡本身是一个微型计算机,常见为Java Card平台,特别是多功能集于一身的卡(如联名卡),Java Card比J2ME更加硬件受限。Java Card可以运行一到多个Java Applet,这些Applet也就是卡应用,例如一张能刷公交的银行卡可能就包含了2个Applet。每个Applet都有一个AID,受理终端(刷卡设备)通过AID来找到对应的卡应用(受理终端向卡发送SELECT命令),受理终端找到对应的卡应用后就可以进行数据交互,交互的数据一般是密文,不联机解密的话,用对称算法,联机解密的话,用非对称和对称算法都行。

HCE是软件模拟的智能IC卡,所以也会有AID。本文CardEmulation只注册一个AID

路由规则

参考文档:NFC 路由表讲解和路由规则梳理.docx

在Android中,nfc数据的处理可能有三种方式:eSE,UICC,HCE。一条nfc数据路由到那种处理方式,是由nfc的路由表来决定的,我们可以通过dumpsys nfc命令查看路由表,如下为mate10的路由表信息(略有删减)

$adb shell dumpsys nfcmState=off
mIsZeroClickRequested=false
mScreenState=ON_UNLOCKED
mNfcPollingEnabled=false
mNfceeRouteEnabled=false
mOpenEe=null
mLockscreenPollMask=0
mTechMask: 0
mEnableLPD: true
mEnableReader: false
mEnableHostRouting: false
mEnableP2p: falsemEnable2ndLevelMenu: false
mIsSendEnabled=false
mIsReceiveEnabled=false
mLinkState=LINK_STATE_DOWN
mSendState=SEND_STATE_NOTHING_TO_SEND
mCallbackNdef=android.nfc.IAppCallback$Stub$Proxy@4d6bfbd
mMessageToSend=null
Registered HCE services for current user: ComponentInfo{com.huawei.wallet/com.huawei.nfc.carrera.lifecycle.swipeservice.NFCOffHostApduService} (Description: 华为钱包)Static AID groups:Category: paymentAID: 325041592E5359532E4444463031AID: A0000003330101020063020000000301Dynamic AID groups:Settings Activity: nullRouting Destination: secure element
Registered HCE-F services for current user:
Preferred services (in order of importance): *** Current preferred foreground service: null*** Current preferred payment service: ComponentInfo{com.huawei.wallet/com.huawei.nfc.carrera.lifecycle.swipeservice.NFCOffHostApduService}Next tap default: nullDefault for foreground app (UID: 0): nullDefault in payment settings: ComponentInfo{com.huawei.wallet/com.huawei.nfc.carrera.lifecycle.swipeservice.NFCOffHostApduService}Payment settings allows override: trueAID cache entries: "325041592E5359532E4444463031" (category: payment)*DEFAULT* ComponentInfo{com.huawei.wallet/com.huawei.nfc.carrera.lifecycle.swipeservice.NFCOffHostApduService} (Description: 华为钱包)"A0000003330101020063020000000301" (category: payment)*DEFAULT* ComponentInfo{com.huawei.wallet/com.huawei.nfc.carrera.lifecycle.swipeservice.NFCOffHostApduService} (Description: 华为钱包)Service preferred by foreground app: nullPreferred payment service: ComponentInfo{com.huawei.wallet/com.huawei.nfc.carrera.lifecycle.swipeservice.NFCOffHostApduService}
Routing table:Default route: secure element
T3T Identifier cache entries:
HCE-F routing table:
Bound HCE-A/HCE-B services:
Bound HCE-F services:
mOverrideIntent=null
mOverrideFilters=null
mOverrideTechLists=null
libnfc llc error_count=0

使用安全元件进行卡模拟

不涉及安全元件的 NFC 卡模拟

                                                       Android 的 HCE 协议栈

具体而言,Android 4.4 支持基于 NFC-Forum ISO-DEP 规范(基于 ISO/IEC 14443-4)的模拟卡,并处理应用协议数据单元 (APDU)(如 ISO/IEC 7816-4 规范中所定义)。Android 要求仅使用 Nfc-A (ISO/IEC 14443-3 Type A) 技术模拟 ISO-DEP。也可以支持 Nfc-B (ISO/IEC 14443-4 Type B) 技术。图  显示了所有这些规范的分层。

HCE 服务

Android 中的 HCE 架构基于 Android Service 组件(称为“HCE 服务”)。服务的一项关键优势是可以在后台运行,而不显示任何界面。这非常适合很多 HCE 应用(例如会员卡或公交卡),用户不需要启动应用即可使用。设备触碰到 NFC 读取器时,系统会启动正确的服务(如果服务尚未运行),并在后台执行交易。当然,如果合适,您也尽可从自己的服务启动额外的界面(例如用户通知)

服务选择

当用户手拿设备触碰 NFC 读取器时,Android 系统需要知道 NFC 读取器实际想与哪项 HCE 服务通信。这时 ISO/IEC 7816-4 规范就派上用场了:它定义了一种以应用 ID (AID) 为核心的应用选择方式。一个 AID 最多可包含 16 个字节。如果您要模拟适用于现有 NFC 读取器基础设施的卡,这些读取器使用的 AID 通常为人熟知且已公开注册(例如,支付网络 Visa 和 MasterCard 等的 AID)。

如果您想为自己的应用部署新的读取器基础设施,则需要注册自己的 AID。AID 的注册流程在 ISO/IEC 7816-5 规范中得到了定义。如果您要部署 Android 版 HCE 应用,Google 建议您根据 7816-5 规范注册一个 AID,以避免与其他应用发生冲突。

同时运行安全元件和主机卡模拟的 Android 设备

Android HCE开发相关推荐

  1. android NFC 开发学习笔记(1)

    由于工作需求,最近在研究android nfc开发,借鉴了很对大神的文章在此记录自己的学习过程: 大家学习android开发建议首选android开发文档,该文档在你下载的sdk中,路径:/sdk/d ...

  2. Android WiFi开发教程(三)——WiFi热点数据传输

    在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)--WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...

  3. android ble 设备扫描程序,Android应用开发Android 7.0 BLE scan 问题:程序无错但扫描不到BLE设备...

    本文将带你了解Android应用开发Android 7.0  BLE scan 问题:程序无错但扫描不到BLE设备,希望本文对大家学Android有所帮助. < 最近在做毕设,需要几周内从头学起 ...

  4. Android Studio开发环境及第一个项目

    1. 在你的电脑上搭建Android平台开发环境. 2. 新建项目,实现以下基本内容: (1) 修改默认的APP的名称和图标(任意的,非默认的). (2) 显示个人信息,包括:照片.专业.姓名.学号等 ...

  5. Android UI开发第二十五篇——分享一篇自定义的 Action Bar

    Action Bar是android3.0以后才引入的,主要是替代3.0以前的menu和tittle bar.在3.0之前是不能使用Action Bar功能的.这里引入了自定义的Action Bar, ...

  6. [转]Android敏捷开发指南

    原文地址:http://www.apkbus.com/android-72730-1-1.html 本文紧密结合移动开发方法与技术,围绕Android平台的开发探讨提供更高质量移动产品的解决方案.作者 ...

  7. 《Android传感器开发与智能设备案例实战》——导读

    本节书摘来自异步社区<Android传感器开发与智能设备案例实战>一书中的目录,作者 朱元波,更多章节内容可以访问云栖社区"异步社区"公众号查看 目 录 前 言 第1章 ...

  8. IntelliJ IDEA 12详细开发教程(四) 搭建Android应用开发环境与Android项目创建

    今天我要给大家讲的是使用Intellij Idea开发Android应用开发.自我感觉使用Idea来进行Android开发要比在Eclipse下开发简单很多. (一)打开网站:http://devel ...

  9. 从Android界面开发谈起(转)

    原文地址:http://blog.csdn.net/nieweilin/article/details/5967815 这篇文章没有打算有一个很好的逻辑去介绍android的某个方面,全盘大致上就是我 ...

最新文章

  1. 计算机公开课课前互动小游戏,公开课前课堂小游戏
  2. 图像处理——Edge Boxes边缘检测
  3. php xml expat,PHP 使用 XML Expat 解释xml文件
  4. Tyvj 1921 Freda的烦恼
  5. 机器学习Tensorflow基础知识、张量与变量
  6. 一个服务器端和多个客户端消息互发_python:OSError: [WinError 10022] 提供了一个无效的参数...
  7. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
  8. iZotope系列音频软件如何卸载
  9. 如何突破网盘限速?获取下载链接的三种方法
  10. 无法回避的现实问题:“亲对象”也要明算账?
  11. 基于深度学习的绘画风格迁移
  12. v-for和v-show一起使用
  13. Windows 10 下安装gcc
  14. pc端汽车obd软件下载?_人人美剧,不可多得的PC端观影软件
  15. Entity Structure Within and Throughout: Modeling Mention Dependencies forDocument-Level RE笔记
  16. Android开发者选项 介绍
  17. VK2C21C SOP20是低功耗抗干扰LCD液晶显示驱动芯片/段式LCD液晶驱动IC,完全兼容替代16C21,适用多种电气类LCD驱动面板
  18. dp主机_DP接口和HDMI接口分别怎么用?哪个更好?两者的区别?
  19. 【网络】远程连接交换机
  20. 用threejs创建流动的水管

热门文章

  1. 使用Vue开发的优点
  2. “拼多多优惠券”测试的套路,今天让你秒懂
  3. 漫威官方账号被黑,钢铁侠、美队、绿巨人无一幸免
  4. CAD入门 调整虚线比例
  5. java中字符串不等于_java中字符串不等于怎么判断
  6. 使用Navicat工具创建MySQL数据库连接
  7. Flink教程(13)- Flink高级API(状态管理)
  8. Oracle EBS:PO入库(收货)价格不随Blanket更改
  9. 微信小程序组件的传参
  10. Java动态编程技术