想要学习Android的NFC模块,首先要了解,什么是NFC,NFC是怎么来的
首先我们先了解ID IC RFID NFC Mifare卡各种概念的关系
1. IC和ID卡的区别:
ID卡仅仅记录卡号,卡内的卡号读取无任何权限,易于仿制.ID卡不可写入数据,其记录内容(卡号)只可由芯片生产厂一次性写入,开发商可读出卡号加以利用,无法根据系统的实际需要制订新的号码管理制度. IC卡内所记录数据的读取,写入均需相应的密码认证,甚至卡片内每个区均有不同的密码保护,全面保护数据安全,IC卡写数据的密码与读出数据密码可设为不同,提供了良好分级管理方式,确保系统安全.IC卡不仅可由授权用户读出大量数据,而且亦可由授权用户写入大量数据(如新的卡号,用户的权限,用户资料等),IC卡所记录内容可反复擦写.IC卡的安全性远大于ID卡.
2.IC卡和RFID
卡的区别IC卡分为接触式和非接触式IC卡,都属于RFID范畴,接触式IC卡其芯片直接封装在卡基表面,而非接触式IC卡是由芯片和线圈组成,可分为
COB绕铜线、蚀刻天线、印刷天线等等,两者的应用区别在于:前者在使用过程中需要插入读卡器使用,例如银行卡,后者仅需要靠近读卡器感应天线就能被读取,例如交通卡、门禁卡。
RFID卡是指非接触式类电子卡片/标签,包括有ID卡、IC卡和NFC卡以及其它等电子卡/标签。他们主要的区别在于工作频段。
ID卡是早期的非接触式电子标签,工作频段在125kHz只有一个ID号,不可以存储任何数据,故叫ID卡。
IC卡如从字义上面理解,是包括了除ID卡外的其它RFID电子标签和接触式的芯片卡,不过一般说IC卡主要是指工作于13.56MHz频段的非接触式智能卡和接触式智能卡,而非接触式智能卡也就包括了NFC卡片或标签(NFC论坛规定有四种卡片类型属于NFC卡片),接触式智能卡也就是带个裸露芯片的智能卡。
RFID卡还包括其它工作频段的电子卡/标签,如915MHz,2.4GHz等频段。
3.RFID卡和NFC卡的区别
NFC是在RFID的基础上发展而来,NFC从本质上与RFID没有太大区别,都是基于地理位置相近的两个物体之间的信号传输。
但NFC与RFID还是有区别的,NFC技术增加了点对点通信功能,可以快速建立蓝牙设备之间的P2P(点对点)无线通信,NFC设备彼此寻找对方并建立通信连接。P2P通信的双方设备是对等的,而RFID通信的双方设备是主从关系。
其余还有一些技术细节方面:
NFC相较于RFID技术,具有距离近、带宽高、能耗低等一些特点。详细内容:
1.NFC只是限于13.56MHz的频段!而RFID的频段有低频(125KHz到135KHz),高频(13.56MHz)和超高频(860MHz到960MHz之间。
2.工作有效距离:NFC(小于10cm,所以具有很高的安全性),RFID距离从几米到几十米都有!
3.因为同样工作于13.56MHz,NFC与现有非接触智能卡技术兼容,所以很多的厂商和相关团体都支持NFC,而
RFID标准较多,统一较为复杂(估计是没可能统一的了),只能在特殊行业有特殊需求下,采用相应的技术标准!
4.应用:RFID更多的被应用在生产、物流、跟踪、资产管理上,而NFC则在门禁、公交、手机支付等领域内发挥着巨大的作用。
4.Mifare系列卡区别
Mifare系列卡pain根据卡内使用芯片不同分为
Miare UltraLight 又称为MF0
MifareS50和S70,又称为MF1
Mifare Pro 又称为MF2
Mifare DesFire 又称为MF3
Mifare 1 有密码 Mifare UltraLight没有密码
M1/ML/UltraLight/Mifare Pro 都遵守14443A协议,AT88RF020遵守14443B
MifareS50和S70的区别:
一是读写器对卡片发出请求命令,二者应答返回的卡类型(ATQA)字节不同, S50的卡类型是0004H,S70的卡类型是0002H,另一个区别就是二者容量和内存结构不同,S50容量是1K字节,S70容量是4K字节
不知道看到这里,还有没有看下去的勇气,以上的内容也是我从网上找的,感觉说的还是比较详细的,最起码这些卡的分类和区别能让我有一个基本的认识,下面就说说Android系统的NFC模块
首先你得有一个有NFC模块的手机或者平板,华为、小米、三星等
NFC的TAG分发:
打开NFC功能,保持屏幕点亮并且要解锁屏幕
当系统检测到一个NFC标签的时候,他会自动去寻找最合适的activity去处理这个intent.
他所发出的这个Intent将会有三种action:
ACTION_NDEF_DISCOVERED:当系统检测到tag中含有NDEF格式的数据时,且系统中有activity声明可以接受包含NDEF数据的Intent的时候,系统会优先发出这个action的intent。
ACTION_TECH_DISCOVERED:当没有任何一个activity声明自己可以响应ACTION_NDEF_DISCOVERED时,系统会尝试发出TECH的intent.即便你的tag中所包含的数据是NDEF的,但是如果这个数据的MIMEtype或URI不能和任何一个activity所声明的想吻合,系统也一样会尝试发出tech格式的intent,而不是NDEF.
ACTION_TAG_DISCOVERED:当系统发现前两个intent在系统中无人会接受的时候,就只好发这个默认的TAG类型的
Android的androidManifest文件配置权限
<uses-permissionandroid:name="android.permission.NFC"/>
然后是sdk级别限制:<uses-sdkandroid:minSdkVersion="10"/> 10以上
接着是特殊功能限制<uses-featureandroid:name="android.hardware.nfc"android:required="true"/>这个可以让你的应用在googleplay上被声明使用者必须拥有nfc功能
NFC标签过滤
在activity的intent过滤xml声明中,你可以同时声明过滤这三种action.但是由之前所说,你应该知道系统在发送intent的时候是有优先级的,所以你最好清楚自己最想处理哪个。
1:过滤ACTION_TAG_DISCOVERED:
<data android:mimeType="text/plain" />
这个最简单,也是最后一个被尝试接受intent的选项
data的mimeType类型了,这个定义的越准确,intent指向你这个activity的成功率就越高,否则系统可能不会发出你想要的NDEF intent了
过滤ACTION_TECH_DISCOVERED:
你首先需要在你的<project-path>/res/xml下面创建一个过滤规则文件。名字任取,比如可以叫做nfc_tech_filter.xml。这个里面定义的是nfc实现的各种标准,每一个nfc卡都会符合多个不同的标准,个人理解为这些标准有些相互之间也是兼容的。你可以在检测到nfc标签后使用getTechList()方法来查看你所检测的tag到底支持哪些nfc标准。
一个nfc_tech_filter.xml中可以定义多个<tech-list>结构组。每一组代表我声明我只接受同时满足这些标准的nfc标签。比如A组表示,只有同时满足IsoDep,NfcA,NfcB,NfcF这四个标准的nfc标签的intent才能进入。A与B组之间的关系就是只要满足其中一个就可以了。换句话说,你的nfc标签技术,满足A的声明也可以,满足B的声明也可以。
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<tech-list> --------------------------------A组
<tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech>
</tech-list>
<tech-list>-----------------------------------------B组
<tech>android.nfc.tech.NfcV</tech> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech>
</tech-list>
</resources>
在androidManifest文件中声明xml过滤的举例如下
<activity>
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>
<meta-data android:name="android.nfc.action.TECH_DISCOVERED"android:resource="@xml/nfc_tech_filter" />-------------这个就是你的资源文件名
</activity>
nfc标签前台分发系统
之所以把他也归类在nfc的过滤里面,主要是因为他跟解析nfc标签到不是那么的紧密,他解决的是接受哪些nfc标准的标签问题。所以更接近nfc的过滤。
什么叫nfc的前台发布系统?就是说当我们已经打开我们的应用的时候,那么通过这个前台发布系统的设置,我们可以让我们已经启动的activity拥有更高的优先级来依据我们在代码中定义的标准来过滤和处理intent,而不是让别的声明了intentfilter的activity来干扰,甚至连自己声明在androidManifest中的intent filter都不会来干扰。也就是说foreground Dispatch的优先级大于intent filter。
第一种情况:当你的activity没有启动的时候,去扫描tag,那么系统中所有的intent filter都将一起参与过滤。
第二种情况:当你的actiity启动了,去扫描tag时,那么将直接使用你在foreground dispatch中代码写入的过滤标准。如果这个标准没有命中任何intent,那么系统将使用所有activity声明的intent filter xml来过滤。
在OnCreate中你可以添加如下代码
// Create ageneric PendingIntent that will be deliver to this activity. The NFC stack will fill in the intent with the details of the discovered tag before delivering to this activity.
//如果你对action的定义有更高的要求,比如data的要求,你可以使用如下的代码来定义intentFilter//
在onPause和 onResume中需要加入相应的代码。
public void onPause() {
super.onPause();
//反注册 mAdapter.disableForegroundDispatc
}
public void onResume() {
super.onResume();
//设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的TAG action。也就是说系统会主动发TAG intent。
mAdapter.enableForegroundDispatch
}
如果觉得《Android-NFC模块学习(1)》对你有帮助,请点赞、收藏,并留下你的观点哦!