这篇博客是在鸿洋的微信公众号看到的感觉收益非浅。于是转存于自己博客上以后可查阅。

本文由郭朝投稿。

郭朝的博客地址:

http://blog.csdn.net/smartbetter


有几天没有更新博客了,不过本篇却准备了许久,希望能带给每一位开发者最简单高效的学习方式。废话到此为止,下面开始正文。

NFC(Near Field Communication,近场通信)是一种数据传输技术。与Wi-Fi、蓝牙、红外线等数据传输技术的一个主要差异就是有效距离一般不能超过4厘米。但是NFC传输速度要比红外快。目前NFC已经出现了一些应用,例如电子标签识别、刷手机、点对点付款、身份识别、信息记录等,本篇文章的目的是为大家揭开NFC标签的面纱。

下面我们先从NFC的工作模式开始阐述NFC,开发NFC必先了解NFC。

1

NFC的工作模式

NFC支持如下3种工作模式:读卡器模式(Reader/writer mode)、仿真卡模式(Card Emulation Mode)、点对点模式(P2P mode)。

下来分别看一下这三种模式:

(1)读卡器模式

数据在NFC芯片中,可以简单理解成“刷标签”。本质上就是通过支持NFC的手机或其它电子设备从带有NFC芯片的标签、贴纸、名片等媒介中读写信息。通常NFC标签是不需要外部供电的。当支持NFC的外设向NFC读写数据时,它会发送某种磁场,而这个磁场会自动的向NFC标签供电。

(2)仿真卡模式

数据在支持NFC的手机或其它电子设备中,可以简单理解成“刷手机”。本质上就是将支持NFC的手机或其它电子设备当成借记卡、公交卡、门禁卡等IC卡使用。基本原理是将相应IC卡中的信息凭证封装成数据包存储在支持NFC的外设中 。 
在使用时还需要一个NFC射频器(相当于刷卡器)。将手机靠近NFC射频器,手机就会接收到NFC射频器发过来的信号,在通过一系列复杂的验证后,将IC卡的相应信息传入NFC射频器,最后这些IC卡数据会传入NFC射频器连接的电脑,并进行相应的处理(如电子转帐、开门等操作)。

(3)点对点模式

该模式与蓝牙、红外差不多,用于不同NFC设备之间进行数据交换,不过这个模式已经没有有“刷”的感觉了。其有效距离一般不能超过4厘米,但传输建立速度要比红外和蓝牙技术快很多,传输速度比红外块得多,如过双方都使用Android4.2,NFC会直接利用蓝牙传输。这种技术被称为Android Beam。所以使用Android Beam传输数据的两部设备不再限于4厘米之内。 
点对点模式的典型应用是两部支持NFC的手机或平板电脑实现数据的点对点传输,例如,交换图片或同步设备联系人。因此,通过NFC,多个设备如数字相机,计算机,手机之间,都可以快速连接,并交换资料或者服务。

下面看一下NFC、蓝牙和红外之间的差异:

对比项 NFC 蓝牙 红外
网络类型 点对点 单点对多点 点对点
有效距离 <=0.1m <=10m,最新的蓝牙4.0有效距离可达100m 一般在1m以内,热技术连接,不稳定
传输速度 最大424kbps 最大24Mbps 慢速115.2kbps,快速4Mbps
建立时间 <0.1s 6s 0.5s
安全性 安全,硬件实现 安全,软件实现 不安全,使用IRFM时除外
通信模式 主动-主动/被动 主动-主动 主动-主动
成本

2

Android对NFC的支持

不同的NFC标签之间差异很大,有的只支持简单的读写操作,有时还会采用支持一次性写入的芯片,将NFC标签设计成只读的。当然,也存在一些复杂的NFC标签,例如,有一些NFC标签可以通过硬件加密的方式限制对某一区域的访问。还有一些标签自带操作环境,允许NFC设备与这些标签进行更复杂的交互。这些标签中的数据也会采用不同的格式。但Android SDK API主要支持NFC论坛标准(Forum Standard),这种标准被称为NDEF(NFC Data Exchange Format,NFC数据交换格式)。

NDEF格式其实就类似于硬盘的NTFS,下面我们看一下NDEF数据:

(1)NDEF数据的操作

Android SDK API支持如下3种NDEF数据的操作:

1)从NFC标签读取NDEF格式的数据。 
2)向NFC标签写入NDEF格式的数据。 
3)通过Android Beam技术将NDEF数据发送到另一部NFC设备。

用于描述NDEF格式数据的两个类:

1)NdefMessage:描述NDEF格式的信息,实际上我们写入NFC标签的就是NdefMessage对象。 
2)NdefRecord:描述NDEF信息的一个信息段,一个NdefMessage可能包含一个或者多个NdefRecord。

NdefMessage和NdefRecord是Android NFC技术的核心类,无论读写NDEF格式的NFC标签,还是通过Android Beam技术传递Ndef格式的数据,都需要这两个类。

(2)非NDEF数据的操作

对于某些特殊需求,可能要存任意的数据,对于这些数据,我们就需要自定义格式。这些数据格式实际上就是普通的字节流,至于字节流中的数据代表什么,就由开发人员自己定义了。

(3)编写NFC程序的基本步骤

1)设置权限,限制Android版本、安装的设备:

2)定义可接收Tag的Activity

Activity清单需要配置一下launchMode属性:

<activityandroid:name=".TagTextActivity"android:launchMode="singleTop"/>

而Activity中,我们也抽取了一个通用的BaseNfcActivity,如下(后面的Activity实现都继承于BaseNfcActivity):

注意:通常来说,所有处理NFC的Activity都要设置launchMode属性为singleTop或者singleTask,保证了无论NFC标签靠近手机多少次,Activity实例只有一个。

接下来看几个具体的NFC标签应用实例,通过情景学习快速掌握NFC技术.

3

两个NFC标签的简单实例

1.利用NFC标签让Android自动运行程序

场景是这样的:现将应用程序的包写到NFC程序上,然后我们将NFC标签靠近Android手机,手机就会自动运行包所对应的程序,这个是NFC比较基本的一个应用。下面以贴近标签自动运行Android自带的“短信”为例。

向NFC标签写入数据一般分为三步:

1)获取Tag对象

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

2)判断NFC标签的数据类型(通过Ndef.get方法)

Ndef ndef = Ndef.get(tag);

3)写入数据

ndef.writeNdefMessage(ndefMessage);

详细实现代码如下:

注意:设置 RunAppActivity 的 launchMode 属性为 singleTop。

现在看一下效果图:

将NFC标签贴近手机背面,自动写入数据,此时退出所有程序,返回桌面,然后再将NFC标签贴近手机背面,将会看到自动打开了“短信”。

下来再看一个有趣的例子:

2.利用NFC标签让Android自动打开网页

如何让NFC标签贴近手机,手机可以自动打开一个网页呢?

首先我们创建一个NdefRecord,Android已经为我们提供好了这样的方法:

//直接接受一个Uri
public NdefRecord createUri(String uriString); 
//接受一个Uri的对象
public NdefRecord createUri(Uri uri);  

实现代码对比“3.利用NFC标签让Android自动运行程序”部分只是修改了writeNFCTag方法中

NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{    NdefRecord.createApplicationRecord(mPackageName)});

NdefMessage ndefMessage = new NdefMessage(new NdefRecord[]{
NdefRecord.createUri(Uri.parse("http://www.baidu.com"))});

其余不变。

上面这个功能还是比较有用的,例如我们往某些商品上贴上NFC标签,里面写入该商品的详细介绍网页Uri,当用户贴近商品时,就会自动打开该商品的详情介绍。

这只是个开始,原文还包含了NDEF文本格式深度解析、非NDEF格式深度解析等相关内容,由于文章内容过多,可以点击左下角阅读原文继续阅读。

本篇NFC项目代码已经分享

  • Github: https://github.com/smartbetter/Android-NFC

欢迎Follow、Fork、Star

Android NFC标签 开发深度解析 触碰的艺术相关推荐

  1. android nfc标签类型,Android NFC标签 开发深度解析 触碰的艺术

    原标题:Android NFC标签 开发深度解析 触碰的艺术 本文来自于CSDN博客,作者:郭朝,已获授权,版权归原作者所有,未经作者同意,请勿转载. 欢迎同有博客好文章的作者加微信(ID:tm_fo ...

  2. Android NFC 标签读写Demo与历史漏洞概述

    文章目录 前言 NFC基础 1.1 RFID区别 1.2 工作模式 1.3 日常应用 NFC标签 2.1 标签应用 2.2 应用实践 2.3 标签预览 2.4 前台调度 NFC开发 3.1 NDEF数 ...

  3. 《Android NFC开发实战详解》——6.4节Android NFC P2P开发进阶

    本节书摘来自异步社区<Android NFC开发实战详解>一书中的第6章,第6.4节Android NFC P2P开发进阶,作者 赵波,更多章节内容可以访问云栖社区"异步社区&q ...

  4. 2008年12月13日上海USB驱动开发深度解析讲座PPT

    讲座PPT:宋宝华2008年12月13日上海USB驱动开发深度解析讲座PPT [url]http://www.linuxdriver.cn/200812/20081213172619_836.rar[ ...

  5. 限时团购,6.9折:《微信开发深度解析:公众号、小程序高效开发秘籍》推荐序

    全书由目 Senparc.Weixin SDK 作者苏震巍历时 2 年完成,涵盖了开发微信公众号及小程序需要用的的各项后端开发技能.技巧.避坑提示,以及 Senparc.Weixin SDK 微信公众 ...

  6. Android源码解析触碰机制

    分发  dispatchTouchEvent  触碰屏幕时会触发的view方法,原理需要看更深层次的源码,这里可以理解为入口 拦截  onInterceptTouchEvent 消费  onTouch ...

  7. android面试题(深度解析)

    1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的时候调用.这里是你做所有初始化设置的地方──创建视图.设置布局.绑定数据至列表等. ...

  8. Android NFC标签写入应用包名,感应到标签自动打开应用

    首先在AndroidManifest.xml文件中添加如下配置 <!-- SDK版本至少为14 --> <uses-sdk android:minSdkVersion="1 ...

  9. Android NFC标签写入网址,感应到标签访问网页

    首先在AndroidManifest.xml文件中添加如下配置 <!-- SDK版本至少为14 --> <uses-sdk android:minSdkVersion="1 ...

最新文章

  1. python pdb 基础调试
  2. HealthKit开发快速入门教程之HealthKit框架体系创建健康AppID
  3. python数字类型-Python数字类型介绍
  4. 吴恩达给 74 岁老父亲发证了!8 年完成 146 门课程!
  5. basler相机的触发线是那两脚_车牌相机是怎么和LED屏联动的?
  6. 循环增加li id_循环老化对于锂离子电池中锂和电解液分布的影响
  7. linux 清除mysql relay_MySQL 小版本升级
  8. java实现QQ空间日志列表获取
  9. iOS sign in with Apple 苹果ID登录
  10. LIO-SAM中的mapOptmization
  11. php算法----队列
  12. python import注意事项
  13. unity碰撞检测识别对象的几种方法,刚体篇
  14. vscode win10笔记本 蓝屏_联想拯救者Win10蓝屏0xc000000d的解决办法
  15. 洛谷:P1462 通往奥格瑞玛的道路
  16. Apache Kafka实战读书笔记(推荐指数:☆☆☆☆☆)
  17. solidity 循环语句
  18. OpenAI的模型下载(chatGPT模型)
  19. iOS字体不清晰问题
  20. 《0-6岁宝宝发育指导》和《怀孕妈妈每月指导》App开发案例(总则)

热门文章

  1. 如何开展ERP实施阶段的监理工作
  2. 什么是SpringCloud
  3. 华夏时报:腾讯QQ如何监视你的?
  4. Photoshop CS3:为美女刷出亮白牙齿
  5. C#实现 AES算法加密
  6. IntelliJ IDEA Spring Boot(5) 集成Hibernate
  7. 正确使用计算机进行语文教学设计,语文《小池》教学设计
  8. 论文解读HN-PPISP:一种基于MLP-Mixer的蛋白质-蛋白质相互作用位点预测混合网络
  9. sureface 屏幕残影问题官方解决方案 - 卸载显卡驱动
  10. 查询上海社保缴费情况与开社保证明流程