糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > Android-NFC模块学习(1)

Android-NFC模块学习(1)

时间:2018-10-07 22:18:59

相关推荐

Android-NFC模块学习(1)

想要学习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:

<intent-filter><action android:name="android.nfc.action.TAG_DISCOVERED"/><category android:name="android.intent.category.DEFAULT"/>

<data android:mimeType="text/plain" />

</intent-filter>

这个最简单,也是最后一个被尝试接受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.

mPendingIntent = PendingIntent.getActivity(this, 0,new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);// 做一个IntentFilter过滤你想要的action 这里过滤的是ndefIntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);

//如果你对action的定义有更高的要求,比如data的要求,你可以使用如下的代码来定义intentFilter//try {//ndef.addDataType("*/*");//} catch (MalformedMimeTypeException e) {//// TODO Auto-generated catch block//e.printStackTrace();//}//生成intentFiltermFilters = new IntentFilter[] {ndef,};// 做一个tech-list。可以看到是二维数据,每一个一维数组之间的关系是或,但是一个一维数组之内的各个项就是与的关系了mTechLists = new String[][] {new String[] { NfcF.class.getName()},new String[]{NfcA.class.getName()},new String[]{NfcB.class.getName()},new String[]{NfcV.class.getName()}};

在onPause和 onResume中需要加入相应的代码。

public void onPause() {

super.onPause();

//反注册 mAdapter.disableForegroundDispatch(this);

}

public void onResume() {

super.onResume();

//设定intentfilter和tech-list。如果两个都为null就代表优先接收任何形式的TAG action。也就是说系统会主动发TAG intent。

mAdapter.enableForegroundDispatch(this, mPendingIntent, mFilters, mTechLists);

}

如果觉得《Android-NFC模块学习(1)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。