NFC是一种近距离无线通讯技术
p13.56MHz频率运行于20厘米距离内。其传输速度有106 Kbit/秒、212 Kbit/秒或者424 Kbit/秒三种。目前近场通信已通过成为ISO/IEC IS 18092国际标准、ECMA-340标准与ETSI TS 102 190标准。NFC采用主动和被动两种通信模式。
p手机NFC支持三种工作模式:读/写标签模式,点到点模式,模拟卡片模式。
Android平台提供了两个android.nfc 和android.nfc.tech包,里面有API来实现NFC标签的操作。
其中android.nfc包的主要有4个类:
nNfcManager类:可以用来管理Android设备中指出的所有NFC Adapter,但由于大部分Android设备只支持一个NFC Adapter,可以直接使用getDefaultAapater方法来获取系统支持的Adapter。
nNfcAdapter类:本设备的NFC adapter,可以定义Intent来请求将系统检测到tags的提醒发送到你的Activity,并提供方法去注册前台tag提醒发布和前台NDEF推送。
nNdefMessage类:NDEF是NFC论坛定义的数据结构,用来有效的存数据到标签中,如文本,URL,和其他MIME类型。一个NdefMessage扮演一个容器,这个容器存哪些发送和读到的数据。一个NdefMessage对象包含0或多个NdefRecord,每个NDEF record有一个类型,比如文本,URL,智慧型海报/广告,或其他MIME数据。在NDEFMessage里的第一个NfcRecord的类型用来发送tag到一个android设备上的activity。
nTag类:标示一个被动的NFC目标,比如tag,card,钥匙挂扣,甚至是一个电话模拟的的NFC卡。可提供对标签的各种操作方法。
android.nfc.tech包含那些对tag查询属性和进行I/O操作的类。这些类分别标示一个tag支持的不同的NFC技术标准。
pTagTechnology: 这个接口是下面所有tag technology类必须实现的。
pNfcA: 支持ISO 14443-3A 标准的属性和I/O操作。
pNfcB:NFC-B (ISO 14443-3B)的属性和I/O操作。
pNfcF:NFC-F (JIS 6319-4)的属性和I/O操作。
pNfcV: NFC-V (ISO 15693)的属性和I/O操作。
pIsoDep:ISO-DEP (ISO 14443-4)的属性和I/O操作。
pNdef:对支持NDEF格式的标签进行读写操作。
pNdefFormatable: 对那些可以被格式化成NDEF格式的tag提供一个格式化的操作。
pMifareClassic: 如果android设备支持MIFARE,提供对MIFARE Classic目标的属性和I/O操作。
pMifareUltralight: 如果android设备支持MIFARE,提供对MIFARE Ultralight目标的属性和I/O操作
。
NFC编程基本步骤:
<uses-permission android:name="android.permission.NFC" />
限制Android版本
<uses-sdkandroid:minSdkVersion="14"/>
限制安装的设备
<uses-feature android:name="android.hardware.nfc" android:required="true" />
定义可接收Tag的Activity
处理业务逻辑
Intent对象中的消息:
pEXTRA_TAG(必须的):它是一个代表了被扫描到的标签的Tag对象;可通过getParcelableExtra(NfcAdapter.EXTRA_TAG)获得标签对象。
pEXTRA_NDEF_MESSAGES(可选):它是一个解析来自标签中的NDEF消息的数组。这个附加信息是强制在Intent对象上的;可通过 getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)获得NDEF消息。
pEXTRA_ID(可选):标签的低级ID。
NFC的三重过滤机制
在一个NFC设备读取NFC标签或另一个NFC设备中的数据之前会在0.1秒之内建立NFC连接,然后数据会自动从被读取一端流向读取数据的一端(NFC设备一般需要触摸一下屏幕才开始传输)。数据接收端会根据具体的数据格式和标签类型调用相应的Activity(这种行为也称为Tag Dispatch)。这些Activity都需要定义Intent Filter。这些Intent Filter中就会指定不同的过滤机制,分为3个级别。因此,也称为NFC的三重过滤机制。
TECH_DISCOVERED:当ACTION_NDEF_DISCOVERED指定的过滤机制无法匹配Tag时,就会使用这种过滤机制进行匹配。这种过滤机制并不是通过Tag中的数据格式进行匹配的,而是根据Tag支持的数据存储格式进行匹配。因此这种过滤机制的范围更广。
TAG_DISCOVERED:前面两种过滤机制都失败后,系统就会利用这种过滤机制来处理。这种过滤机制用来处理未识别的Tag
Android系统会依次匹配NDEF_DISCOVERED、TECH_DISCOVERED和TAG_DISCOVERED。如果通过三重过滤机制仍然无法匹配Tag,则什么都不做。
检测到标签后在Activity中的处理流程
1. 在onCreate()中获取NfcAdapter对象;
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
2.在onNewIntent()中获取Tag对象或者NdefMessage信息;
获取Tag对象:
Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);
获取NdefMessage信息:
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)
3.也可以通过Tag创建Ndef对象等,以实现标签的属性和I/O操作。
Ndef ndef = Ndef.get(tag);
NDEF格式标签的读取流程
1. 在onCreate()中获取NfcAdapter对象;
2.在onNewIntent()中判断是否为NDEF格式标签(ACTION_NDEF_DISCOVERED),
若是则获取NdefMessage信息;(需要强制转换成NdefMessage对象)
Parcelable[] rawMsgs = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)
3.对NdefMessage对象进行解析,获取相关的文本信息或Uri等。
NDEF格式标签的写入流程
1. 在onCreate()中获取NfcAdapter对象;
2.在onNewIntent()中获取Tag对象;
Tag tag = intent.getParcelableExra(NfcAdapter.EXTRA_TAG);
3.通过Tag创建Ndef对象;
Ndef ndef = Ndef.get(tag);
4.将文本等数据封装成NdefMessage;
5.判断是否为NDEF格式标签,
若是NDEF格式:
(1)允许进行标签操作:ndef.connect();
(2) 调用ndef.writeNdefMessage(NdefMessage)方法写入。
若非NDEF格式:
(1)获得可以格式化和向标签写入数据的NdefFormatable对象;
NdefFromatable format = NdefFromatable.get();
(2)允许进行标签操作:format.connect();
(2) 调用format.format(NdefMessage)方法写入。