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卡还包括其它工作频段的电子卡/标签,如915MHz2.4GHz等频段。 

 

3.RFID卡和NFC卡的区别

  NFC是在RFID的基础上发展而来,NFC从本质上与RFID没有太大区别,都是基于地理位置相近的两个物体之间的信号传输。

  NFCRFID还是有区别的,NFC技术增加了点对点通信功能,可以快速建立蓝牙设备之间的P2P(点对点)无线通信,NFC设备彼此寻找对方并建立通信连接。P2P通信的双方设备是对等的,而RFID通信的双方设备是主从关系。 

其余还有一些技术细节方面:

  NFC相较于RFID技术,具有距离近、带宽高、能耗低等一些特点。详细内容: 

1.NFC只是限于13.56MHz的频段!而RFID的频段有低频(125KHz135KHz),高频(13.56MHz)和超高频(860MHz960MHz之间。 

2.工作有效距离:NFC(小于10cm,所以具有很高的安全性),RFID距离从几米到几十米都有! 

3.因为同样工作于13.56MHzNFC与现有非接触智能卡技术兼容,所以很多的厂商和相关团体都支持NFC,而

RFID标准较多,统一较为复杂(估计是没可能统一的了),只能在特殊行业有特殊需求下,采用相应的技术标准! 

4.应用:RFID更多的被应用在生产、物流、跟踪、资产管理上,而NFC则在门禁、公交、手机支付等领域内发挥着巨大的作用。

 

  4.Mifare系列卡区别

Mifare系列卡pain根据卡内使用芯片不同分为

Miare UltraLight 又称为MF0

Mifare S50S70,又称为MF1

Mifare Pro 又称为MF2

Mifare DesFire 又称为MF3

 

Mifare 1 有密码 Mifare UltraLight没有密码

M1/ML/UltraLight/Mifare Pro 都遵守14443A协议,AT88RF020遵守14443B

Mifare S50S70的区别:

   一是读写器对卡片发出请求命令,二者应答返回的卡类型(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,而不是让别的声明了intent
 filter的activity来干扰,甚至连自己声明在androidManifest中的intent 
filter都不会来干扰。也就是说foreground Dispatch的优先级大于intent filter。
第一种情况:当你的activity没有启动的时候,去扫描tag,那么系统中所有的intent filter都将一起参与过滤。
第二种情况:当你的actiity启动了,去扫描tag时,那么将直接使用你在foreground dispatch中代码写入的过滤标准。如果这个标准没有命中任何intent,那么系统将使用所有activity声明的intent filter xml来过滤。
在OnCreate中你可以添加如下代码         
// Create a
 generic 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 这里过滤的是ndef

        IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
//如果你对action的定义有更高的要求,比如data的要求,你可以使用如下的代码来定义intentFilter

//        try {

//            ndef.addDataType("*/*");

//        } catch (MalformedMimeTypeException e) {

//            // TODO Auto-generated catch block

//            e.printStackTrace();

//        }

     //生成intentFilter   

        mFilters = 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); 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值