原标题:Android NFC标签 开发深度解析 触碰的艺术

本文来自于CSDN博客,作者:郭朝,已获授权,版权归原作者所有,未经作者同意,请勿转载。

欢迎同有博客好文章的作者加微信(ID:tm_forever_miss)或直接邮件(mobilehub@csdn.net)投稿、约稿、给文章纠错。

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

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

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

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、蓝牙和红外之间的差异:

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属性:

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

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

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

两个NFC标签的简单实例

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

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

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

1)获取Tag对象

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

3)写入数据

详细实现代码如下:

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

现在看一下效果图:

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

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

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

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

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

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

其余不变。

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

通过上面这两个案例的学习相信很多人已经对NFC感起了兴趣,那么下来渗透式的分析一下NDEF文本格式,看看NDEF到底是个什么东西。

NDEF文本格式深度解析

获取NFC标签中的数据要通过NdefRecord.getPayload 方法完成。当然,在处理这些数据之前,最好判断一下NdefRecord对象中存储的是不是NDEF文本格式数据。

(1)判断数据是否为NDEF格式

1)TNF(类型名格式,Type Name Format)必须是NdefRecord.TNF_WELL_KNOWN。

2)可变的长度类型必须是NdefRecord.RTD_TEXT。

如果这两个标准同时满足,那么就为NDEF格式。

(2)NDEF文本格式规范

不管什么格式的数据本质上都是由一些字节组成的。对于NDEF文本格式来说,这些数据的第1个字节描述了数据的状态,然后若干个字节描述文本的语言编码,最后剩余字节表示文本数据。这些数据格式由NFC Forum的相关规范定义,可以通过 http://members.nfc-forum.org/specs/spec_dashboard下载相关的规范。

下面这两张表是规范中 3.2节 相对重要的翻译部分:

NDEF文本数据格式:

状态字节编码格式:

下面我们动手实现NFC标签中的文本数据的读写操作:

1.读NFC标签文本数据

注意:Activity清单需要配置一下launchMode属性(后面一样要注意):

2.写NFC标签文本数据

我们将手机贴近NFC标签,当写入成功会弹出“写入成功”的吐司。下面我们再验证一下是否成功写入:

我们看到,数据已经写入成功了,说明到此我们已经成功的读写NFC标签中的文本数据了。

NDEF Uri格式深度解析

与NDEF文本格式一样,存储在NFC标签中的Uri也有一定的格式,http://members.nfc-forum.org/specs/spec_dashboard

(1)Uri的格式规范要比文本格式简单一些:

(2)Uri的前缀如下(都是十六进制的一个数):

每一个协议,都是用十六进制来存储于识别码位置(占1byte)。

是不是相对简单了些,那么下来我们来解析一个Uri。

(3)预先定义已知Uri前缀

这里我们定义一个UriPrefix类,以便方便的获取Uri前缀:

然后我们来看一下清单文件中Activity的相关配置:

好了,接下来就可以进行读写NFC标签中的Uri数据了:

1.读NFC标签中的Uri数据

2.写NFC标签中的Uri数据

我们将手机贴近NFC标签,写入成功后验证一下是否成功写入:

我们看到,数据已经写入成功了,说明到此我们已经成功的读写NFC标签中的Uri数据了。

到这里,NDEF格式就大致说完了,那么接下来看一下非NDEF格式的数据。

非NDEF格式深度解析

1.MifareUltralight数据格式

将NFC标签的存储区域分为16个页,每一个页可以存储4个字节,一个可存储64个字节(512位)。页码从0开始(0至15)。前4页(0至3)存储了NFC标签相关的信息(如NFC标签的序列号、控制位等)。从第5页开始存储实际的数据(4至15页)。

使用MifareUltralight.get方法获取MifareUltralight对象,然后调用MifareUltralight.connect方法进行连接,并使用MifareUltralight.writePage方法每次写入1页(4个字节)。也可以使用MifareUltralight.readPages方法每次连续读取4页。如果读取的页的序号超过15,则从头开始读。例如,从第15页(序号为14)开始读。readPages方法会读取14、15、0、1页的数据。

2.读MifareUltralight格式数据

3.写MifareUltralight格式数据

我们将手机贴近NFC标签,写入成功后验证一下是否成功写入:

我们看到,弹出了“北京上海广州天津”,说明数据已经写入成功了,说明到此我们已经成功的读写NFC非NDEF格式的数据了。

NFC标签开发深度解析到此就结束了,喜欢“顶”一下哦。

本篇NFC项目代码已经分享到了我的Github: https://github.com/smartbetter/Android-NFC,欢迎Follow、Fork、Star

了解最新移动开发相关信息和技术,请关注 mobilehub 公众微信号(ID: mobilehub)。返回搜狐,查看更多

责任编辑:

android nfc标签类型,Android NFC标签 开发深度解析 触碰的艺术相关推荐

  1. Android NFC标签 开发深度解析 触碰的艺术

    这篇博客是在鸿洋的微信公众号看到的感觉收益非浅.于是转存于自己博客上以后可查阅. 本文由郭朝投稿. 郭朝的博客地址: http://blog.csdn.net/smartbetter 有几天没有更新博 ...

  2. Android基础新手教程——3.4 TouchListener PK OnTouchEvent + 多点触碰

    Android基础新手教程--3.4 TouchListener PK OnTouchEvent + 多点触碰 标签(空格分隔): Android基础新手教程 本节引言: 如题,本节给大家带来的是To ...

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

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

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

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

  5. float类型表示方式及范围深度解析

    float类型的值以4个字节表示,共32bit,根据IEEE754标准,float类型使用1位做符号位,8位做指数位,23位做尾数位,格式如下: 整个浮点数可表示为: ,其中s为符号位-1或1,t为尾 ...

  6. android游戏开发 深度解析利用位图绘制rpg地图

    先贴代码 着我们采用surfaceview写 package com.mz.demo;import android.content.Context; import android.graphics.B ...

  7. 【Android 】零基础到飞升 | TouchListener PK OnTouchEvent + 多点触碰

    3.4 TouchListener PK OnTouchEvent + 多点触碰 分类 Android 基础入门教程 本节引言: 如题,本节给大家带来的是TouchListener与OnTouchEv ...

  8. Android源码解析触碰机制

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

  9. android 判断fragment类型,Android 判断当前Fragment是否可见(Visible)

    判断当前Fragment是否可见 public abstract class BaseFragment extends Fragment { /** Fragment当前状态是否可见*/ protec ...

最新文章

  1. IntelliJ IDEA 修改包名
  2. module_param 用于动态开启/关闭 驱动打印信息
  3. 【Python基础知识-pycharm版】第六节-控制语句
  4. nyoj_111_分数加减法_201311281341
  5. / 卡路里_最大卡路里
  6. 上班摸鱼更方便了!国内最大短视频APP推出PC版:联想首发
  7. PHP中CURL方法curl_setopt()函数的一些参数
  8. Could not open Hibernate Session for transaction, 数据库连接超时解决方法
  9. ios- 自定义cell总结
  10. kux格式如何无损转换为MP4格式
  11. Qt基于FFmpeg解码本地视频生成RGB数据
  12. 千兆网线与千兆水晶头接法
  13. 网卡配置里NM_CONTROLLED的意思
  14. 摄像头各参数的意义_如何选择摄像头,需要考虑那些参数
  15. vue -V 执行失败 檔案名稱、目錄名稱或磁碟區標籤語法錯誤。
  16. (1) DPDK 简介
  17. 2021-10-20 推荐一个在线视频格式转换的好网站https://www.zamzar.com/,我测试过mp4转到gif
  18. 近期金三银四旺季,网上出现各种各样的面试文章跟视频,以下是我整理的一些拙见
  19. websocket + tls + cdn 断流严重问题解决方法
  20. 小猪的C语言快速入门系列(三)

热门文章

  1. 【app】1.3 传入diag命令
  2. 联想智能云:“三级火箭”战略加持下的云时代整合服务商
  3. HOUDINI 平面漩涡
  4. Web服务------LNMP架构的安装(Nginx,Mysql,PHP,Discus论坛 安装详解)
  5. JWT JWS JWE三者区别
  6. 廖雪峰python教程学习之习题解析
  7. iOS中几种数据持久化方案-转自简书
  8. SMBLoris windows拒绝服务漏洞
  9. 王家林老师人工智能AI 第26课:使用Apriori对美食店的消费者进行美食推荐 老师微信13928463918
  10. 3g手机android应用新浪微博,3.1.1 新浪微博官方Android客户端