NFC的读写实现--高上
Posted tarena_3G
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFC的读写实现--高上相关的知识,希望对你有一定的参考价值。
NFC简介:
Near Field Communication 近场通信,是一种数据传输技术。
与wifi、蓝牙、红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4cm。
NFC支持3种工作模式:
1.读卡器模式;
2.仿真卡模式;
3.点对点模式;
1.读卡器模式:
通过NFC设备(支持NFC的Android手机)从带有NFC芯片的标签、贴纸、报纸、明信片等媒介读取信息,或将数据写到这些媒介中。
2.仿真卡模式:
是将支持NFC的手机或其他电子设备当成借记卡、信用卡、公交卡、门禁卡等IC卡使用;基本原理是将相应的IC卡中的信息(支付凭证)封装成数据包存储在支持NFC的手机中,在使用时还需要一个NFC射频器(相当于刷传统IC卡时使用的刷卡器),将手机靠近NFC射频器,手机就会收到NFC射频器发过来的信号,在通过一系列复杂的验证后,将IC卡的相应信息传入NFC射频器,最后这些IC卡数据会传入NFC射频器连接的计算机,并进行相应的处理(如电子转账、开门等操作)。
3.点对点模式:
与蓝牙、红外差不多,可以用于不同的NFC设备之间进行数据交换,只是NFC的点对点模式有效距离更短,不能超过4cm;但是如果两个设备使用的都是android4.2及以上版本,NFC会直接利用蓝牙传输,这种技术被称为Android Beam,所以Android Beam传输数据的两部设备不局限于4cm之内。
基础知识:
1.Android SDK API主要支持NFC论坛标准(Forum Standard),这种标准被称为NDEF(NFC Data Exchange Format,NFC数据交换格式);
2.Android SDK API支持如下三种NDEF数据的操作:
a.从NFC标签读取NDEF格式的数据;
b.向NFC标签写入NDEF格式的数据;
c.通过Android Beam技术将NDEF数据发送到另一部NFC设备;
3.在一个NFC设备读取NFC标签或另一个NFC设备中的数据之前会在0.1秒的时间之内建立NFC连接,然后数据会自动从被读取一端流向读取数据的一端;数据接收端会根据具体的数据格式和标签类型调用相应的Activity(这种行为也称为Tag Dispatch),这些Activity都需要定义Intent Filter,这些Intent Filter中就会指定不同的过滤机制,分为三个级别,也称为NFC的三重过滤机制。
4.NDEF_DISCOVERED:
只过滤固定格式的NDEF数据。例如:纯文本、指定协议(http、ftp、smb等)的URI等;
TECH_DISCOVERED:
当ACTION_NDEF_DISCOVERED指定的过滤机制无法匹配Tag时,就会使用这种过滤机制进行匹配,这种过滤机制并不是通过Tag中的数据格式进行匹配的,而是根据Tag支持的数据存储格式进行匹配,因此这种过滤机制的范围更广;
TAG_DISCOVERED:
如果将NFC过滤机制看成if...else if...else语句的话,那么这种过滤机制就相当于else部分,当前面两种过滤机制都匹配失败后,系统就会利用这种过滤机制来处理,这种过滤机制用来处理未识别的Tag(数据格式不对,而且Tag支持的格式也不匹配)。
5.Android系统会依次匹配NDEF_DISCOVERED、TECH_DISCOVERED和TAG_DISCOVERED;如果通过三重过滤机制仍然无法匹配Tag,则什么都不做;通常在成功匹配Tag后,Android设备会发出比较清脆的声音,而未成功匹配Tag,就会发出比较沉闷的声音。
此过程的处理流程如下图所示:
6.在manifest文件中需要设置的部分有:
设置权限:
<uses-permission android:name="android.permission.NFC" />
限制Android版本:
android:minSdkVersion="14"
限制安装的设备:
<uses-feature android:name="android.hardware.nfc" android:required="true" />
设置Activity的Intent Filter,比如设置为三种过滤机制的一种:
<intent-filter>
<action android:name="android.nfc.action.TECH_DISCOVERED" />
</intent-filter>
接下来,我们来第一个例子,这个例子是属于读卡器模式,从NFC芯片中读取和写入数据。
它的manifest文件内容如下:
[html] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.r8c.nfc_demo"
- android:versionCode="110"
- android:versionName="1.1.0" >
- <uses-sdk
- android:minSdkVersion="15"
- android:targetSdkVersion="17" />
- <!-- NFC权限声明 -->
- <uses-permission android:name="android.permission.NFC" />
- <uses-feature
- android:name="android.hardware.nfc"
- android:required="true" />
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.r8c.nfc_demo.NfcDemoActivity"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:label="@string/app_name"
- android:launchMode="singleTask">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- <!-- TECH_DISCOVERED类型的nfc -->
- <intent-filter>
- <action android:name="android.nfc.action.TECH_DISCOVERED" />
- </intent-filter>
- <!-- 后设资源 调用自己建立的文件夹xml中的文件 -->
- <meta-data
- android:name="android.nfc.action.TECH_DISCOVERED"
- android:resource="@xml/nfc_tech_filter" />
- </activity>
- </application>
- </manifest>
[java] view plain copy
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.nio.charset.Charset;
- import android.media.AudioManager;
- import android.media.MediaPlayer;
- import android.media.RingtoneManager;
- import android.net.Uri;
- import android.nfc.FormatException;
- NFC读写器的简介