Android MIFARE NFCA源码解析
TagTechnology定义了所有标签的共有接口类
BasicTagTechnology 实现了TagTechnology的一些接口
再有具体的标签协议继承BasicTagTechnology
NFC-A 遵循ISO 14443-3A协议。
关键字
ATQA Answer To Request acc. to ISO/IEC 14443-4
ATS Answer To Select acc. to ISO/IEC 14443-4
DIF Dual Interface (cards)
COS Card Operating System
CL Cascade Level acc. to ISO/IEC 14443-3
CT Cascade Tag, Type A
n.a. not applicable
NFC Near Field Communication
PCD Proximity Coupling Device (“Contactless Reader”)
PICC Proximity Integrated Circuit (“Contactless Card”)
PKE Public Key Encryption (like RSA or ECC)
REQA Request Command, Type A
SAK Select Acknowledge, Type A
Select Select Command, Type A
RID Random ID, typically dynamically generated at Power-on Reset
RFU Reserved for future use
UID Unique Identifier, Type A
NUID Non-Unique Identifier
当读卡器检测到了卡片就会发送REQA请求命令,在感应区内的卡片接收到REQA,将会反馈ATQA消息。
SAK的第六位表明PICC卡是否符合ISO/IEC14443-4 标准。
The bit numbering in the ISO/IEC 14443 starts with LSBit = bit 1, but not LSBit =bit 0. So one byte counts bit 1...8 instead of bit 0...7.
The ISO/IEC 14443 transfers LSByte first. So e.g. 0x 00 44 (ATQA of the MFUL) is often received as 0x 44 00.
ATQA ISO/IEC 14443-3 协议标准
ATQA Coding of NXP Contactless Card ICs
SAK coding of NXP Contactless Card ICs
如下图可以根据ATQA,SAK,ATS判断厂家和产品的类型
举例
<string name="tag_000409">MIFARE Mini, NXP</string>
<string name="tag_000408">MIFARE Classic 1k, NXP</string>
<string name="tag_000218">MIFARE Classic 4k, NXP</string>
<string name="tag_004218">MIFARE Classic 4k, NXP</string>
<string name="tag_004400">MIFARE Ultralight, NXP</string>
<string name="tag_000488">MIFARE Classic 1K, Infineon</string>
getResources().getIdentifier(prefix + atqa + sak + ats, "string", getPackageName())
NfcA get(Tag tag)
获取NFCA一个实例,首先判断
tag.hasTech(TagTechnology.NFC_A)
这个TAG是否是NFC_A TAG。
然后才生成NFC A TAG实例
getAtqa()
读写器呼叫磁场内的卡片,卡片对呼叫做出应答。收到卡呼叫命令后,卡片将对命令做出应答(Answer To Request,ATQA),
告诉读写器自己是否遵守面向比特的防冲突机制,
ATQA/SENS_RES
这里获取卡片应答的消息。
举例:用来判断是否是Mifare Classic tag
NfcA nfca = NfcA.get(tag);
byte[] atqa = nfca.getAtqa();
if (atqa[1] == 0 &&(atqa[0] == 4 || atqa[0] == (byte)0x44 ||atqa[0] == 2 || atqa[0] == (byte)0x42))
getSak()
SAK/SEL_RES
返回选择命令的信息
举例:
byte sak = (byte)nfca.getSak();
if (sak == 8 || sak == 9 || sak == (byte)0x18 ||sak == (byte)0x88)
Transceive()
Send raw NFC-A commands to the tag and receive the response.
发送命令到TAG,并接收返回值。
注意:
1:发送命令时不用增加CRC,因为系统会自动加。
2:发送命令是完整的字节。SENS_REQ3:因为是I/O操作,会发生阻塞,不用在主线程调用这个函数。
getMaxTransceiveLength()
获取最大的发送字节长度
参考文档
NfcA.java
http://www.nxp.com/documents/application_note/AN10833.pdf
http://nfc-tools.org/index.php?title=ISO14443A
时间
起草与2015-10-15
Android MIFARE NFCA源码解析的更多相关文章
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- 【Android】EventBus 源码解析
EventBus 源码解析 本文为 Android 开源项目实现原理解析 中 EventBus 部分项目地址:EventBus,分析的版本:ccc2771,Demo 地址:EventBus Demo分 ...
- [原创]android开源项目源码解析(一)----CircleImageView的源码解析
CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...
- Android 数据库 ObjectBox 源码解析
一.ObjectBox 是什么? greenrobot 团队(现有 EventBus.greenDAO 等开源产品)推出的又一数据库开源产品,主打移动设备.支持跨平台,最大的优点是速度快.操作简洁,目 ...
- 史上最详细的Android消息机制源码解析
本人只是Android菜鸡一个,写技术文章只是为了总结自己最近学习到的知识,从来不敢为人师,如果里面有不正确的地方请大家尽情指出,谢谢! 606页Android最新面试题含答案,有兴趣可以点击获取. ...
- Android LayoutInflater&LayoutInflaterCompat源码解析
本文分析版本: Android API 23,v4基于 23.2.1 1 简介 实例化布局的XML文件成相应的View对象.它不能被直接使用,应该使用getLayoutInflater()或getSy ...
- Android短彩信源码解析-短信发送流程(二)
转载请注明出处:http://blog.csdn.net/droyon/article/details/11699935 2,短彩信发送framework逻辑 短信在SmsSingleRecipien ...
- Android 属性动画 源码解析 深入了解其内部实现
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42056859,本文出自:[张鸿洋的博客] 我参加了博客之星评选,如果你喜欢我的博 ...
- Android常用库源码解析
图片加载框架比较 共同优点 都对多级缓存.线程池.缓存算法做了处理 自适应程度高,根据系统性能初始化缓存配置.系统信息变更后动态调整策略.比如根据 CPU 核数确定最大并发数,根据可用内存确定内存缓存 ...
随机推荐
- mongo数据库基本操作--python篇
连接数据库 MongoClient VS Connection class MongoClient(pymongo.common.BaseObject) | Connection to MongoDB ...
- sharding-jdbc 实现分表
Sharding-JDBC 简介 Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本: 可适用于任何基于Java的ORM框架,如:JPA.HIberna ...
- AC日记——[USACO10MAR]仓配置Barn Allocation 洛谷 P1937
[USACO10MAR]仓配置Barn Allocation 思路: 贪心+线段树维护: 代码: #include <bits/stdc++.h> using namespace std; ...
- bzoj1597 斜率优化dp
思路:先把没有用的土地去掉,然后按照x轴排序,容易得到dp转移方程 dp[ i ] = min{ dp[ j ] + b[ j + 1 ] * a[ i ] } 0 <= j < i ...
- Centos7 Elasticsearch部署
(1)ELKStack简介 1.elk介绍 ELK Stack包含:ElasticSearch.Logstash.Kibana ElasticSearch是一个搜索引擎,用来搜索.分析.存储日志.它是 ...
- Java实现POI读取Excel文件,兼容后缀名xls和xlsx
1.引入所需的jar包: maven管理项目的话直接添加以下坐标即可: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -- ...
- ZOJ 3495 Lego Bricks
计算几何,暴力. 题目中有一句话:$The$ $mass$ $of$ $each$ $brick$ $is$ $equally$ $distributed$ $and$ $it$ $will$ $be ...
- CRT【p3868】[TJOI2009]猜数字
Description 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n ...
- Flask实战第41天:发送短信验证码
本项目使用的短信运营商是阿里云.使用淘宝账号登录阿里云控制台.在“产品与服务”中搜索“短信”进入短信服务 获取AccessKey 输入子账户用户名 权限选择管理短信服务 签名管理:申请签名 模板管理: ...
- VB查询数据库之结账——机房收费系统总结(五)
对于机房收费的结账,我感觉是所有窗体中,最难的一个.这个窗体我真的做了好多天.它的难度系数我感觉是最高的. 首先,你要理清上机时间和收费标准的关系,在预备时间中,是不收费的. 其次,在超过预备时间,一 ...