Android NFC 技术解析,附 Demo 源码

近期由于项目需求,对 Android NFC 技术进行了一定的了解和深入,整合了一些网络、书籍资料,此文章仅作为自己的学习笔记。

NFC 是 Near Field Communication 缩写,即近距离无线通讯技术。可以在移动设备、消费类电子产品、PC 和智能控件工具间进行近距离无线通信。简单一点说,nfc 功能是什么?nfc 功能有什么用?其实** NFC** 提供了一种简单、触控式的解决方案,可以让消费者简单直观地交换信息、访问内容与服务。NFC 技术允许电子设备之间进行非接触式点对点数据传输,在十厘米 (3.9 英吋) 内,交换数据,其传输速度有 106Kbit / 秒、212Kbit / 秒或者 424Kbit / 秒三种。接下来我们更加详细的来了解一下 nfc 的应用。

一、NFC 是什么,它的工作模式?

NFC 工作模式主要有三种工作模式,分别是卡模式 (Card emulation)、点对点模式 (P2P mode) 和读卡器模式 (Reader/writer 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 会直接利用蓝牙传输。这种技术被称为 AndroidBeam。所以使用 androidBeam 传输数据的两部设备不再限于 4 厘米之内。

二、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,配置一下 launchMode 属性:

三、实战使用 NFC 标签

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

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

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

1)获取 Tag 对象

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

3)写入数据

实际运行效果如下:

操作步骤:

点击自动打开短信界面或百度页面,进入对应 Activity,将 NFC 标签贴近手机背面,提示写入成功。返回主界面,再将 NFC 标签贴近手机背面,便能看到自动打开短信或者打开百度页面。

四、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 节 相对重要的翻译部分:

实现 NFC 标签中的文本数据的读写操作:

点击写 NFC 标签中的文本数据,跳转到对应的 Activity,将 NFC 标签卡贴近手机,写入成功后会提示,再退回主页面,选择读文本数据,便可读取。

五、NDEF Uri 格式存储(操作步骤如上图,具体实现可查阅项目代码)

六、非 NDEF 格式(操作步骤如上图,具体实现查阅项目代码)

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 页的数据。

项目源码地址:https://github.com/RickyYu/Nfc-Android

原文发布于微信公众号 - 非著名程序员(non-famous-coder)

原文发表时间:2017-09-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Linux 容器 vs 虚拟机 —— 谁更胜一筹

自从Linux上的容器变得流行以来,了解Linux容器和虚拟机之间的区别变得更加棘手。本文将向您提供详细信息,以了解Linux容器和虚拟机之间的差异。 Linu...

2984
来自专栏Debian社区

Linux 容器 vs 虚拟机 — 谁更胜一筹

自从 Linux 上的 容器 变得流行以来,了解 Linux 容器和虚拟机 之间的区别变得更加棘手。本文将向您提供详细信息,以了解 Linux 容器和虚拟机之间...

1472
来自专栏BestSDK

Kubernetes发布1.10版本:开发者可自己定义API

Container存储介面(Container Storage Interface,CSI)能让使用者像安装Pod一样,轻松安装Volume插件,而这使得第三方...

42511
来自专栏SDNLAB

新型云基础设施项目Airship 介绍

AT&T正在与SK电信(SKT),Intel和OpenStack基金会合作推出一个名为Airship的新型云开放基础设施项目。Airship的宣传语是“声明式地...

1932
来自专栏北京马哥教育

高中生也能读懂的Docker入门教程

Docker 是 Golang 编写的, 自 2013 年推出以来,受到越来越多的开发者的关注。如果你关注最新的技术发展,那么你一定听说过 Docker。不管...

3907
来自专栏大魏分享(微信公众号:david-share)

原生KVM虚拟化方案"管理平台"配置步骤(RHV-M Appliance)

浅谈2016年的虚拟化市场 本文正式开始之前,先阐述一个观点,即RHV/RHEV是基于KVM原生的虚拟化解决方案, 为什么这么说呢? 首先,KVM严格意义上讲不...

4234
来自专栏IT技术精选文摘

通过案例来学习TCP的MSS、MTU

问题的描述 最近要通过Docker的方式把产品部署到客户机房, 过程中需要部署一个hbase集群,hbase总是部署失败(在我们自己的环境没有问题) 发现hba...

2787
来自专栏Python中文社区

基于docker+gunicorn部署sanic项目

最近云服务提供商在打价格战,我在某云上花了很少的钱租了一个月的云服务器: 公网ip是: 116.85.42.182, 以下我以116.85.42.182这个ip...

1322
来自专栏FreeBuf

如何打造一款可靠的WAF(Web应用防火墙)

之前写了一篇《WAF防御能力评测及工具》,是站在安全运维人员选型WAF产品的角度来考虑的(优先从测试角度考虑是前职业病,毕竟当过3年游戏测试?!)。本篇文章从W...

3605
来自专栏云计算爱好者

简单介绍Docker的架构特性与局限

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是...

2616

扫码关注云+社区

领取腾讯云代金券