目录

  • 一、NFC简介
    • 1.NFC概览
    • 2.NFC工作模式
    • 3.NFC通信模式
  • 二、NFC标签调度系统
    • 1. NFC Tag(标签类型)
    • 2 NDEF协议(重点)
    • 3. TNF数据类型
  • 三、NDEF文本数据规范下的处理
  • 四、小结

一、NFC简介

1.NFC概览

NFC,全称是Near Field Communication,中为近场通信,也叫做近距离无线通信技术。该技术最早由Philips和Sony两家公司于2002年末联合推出。2004年,Nokia、Philips、Sony等公司还共同组建了一个名为NFC Forum的非盈利性组织来推广和发展NFC技术。NFC Forum的职责和Wi-Fi Alliance类似,它制定NFC相关的技术标准,同时还通过NFC认证测试来保证各厂家的NFC产品符合NFC规范。

  • NFC与蓝牙、红外通信的区别

2.NFC工作模式

  • 主动模式

NFC设备要向另一台设备发送数据时,发起设备和目标设备都需要产生射频场,以便进行通信。

发起设备指最先发起沟通的一方(自带供电),目标设备则为回应一方。

主动模式下,NFC发起设备通过“发送前侦听” 协议来发起半双工发送连接,防止冲突。

  • 被动模式

启动NFC通信的设备(NFC发起设备,主设备),在整个通信过程中提供RF场,目标设备不必产生RF场。

NFC发起设备负责选择传输速度,然后将数据发送到目标设备。目标设备使用负载调制(load modulation)技术,以相同的速度将数据传回发起设备。

移动设备通过采用被动模式进行通信,大幅降低功耗,并延长电池寿命。

3.NFC通信模式

支持 NFC 的 Android 设备同时支持以下三种主要通信模式:

  • 读取器/写入器模式:支持 NFC 设备读取和/或写入被动 NFC 标签和贴纸。

  • 点对点模式:支持 NFC 设备与其他 NFC 对等设备交换数据;Android Beam 使用的就是此操作模式。

  • 卡模拟模式:支持 NFC 设备本身充当 NFC 卡。可以通过外部 NFC 读取器,访问模拟 NFC 卡。

二、NFC标签调度系统

在设置中打开NFC功能后,Android 设备通常会在屏幕解锁后查找 NFC 标签,在 Android 设备发现 NFC 标签后,期望的行为就是让最合适的 Activity 来处理该 Intent。但是怎么才能根据NFC标签的负载类型去自动找到最适合处理它的Activity,而不是弹窗询问用户该用哪个应用处理这个NFC标签呢?Android 提供了一个特殊的标签调度系统,用于分析扫描到的 NFC 标签、解析它们并尝试找到对扫描到的数据感兴趣的应用。这个标签调度系统通过以下操作来实现这些目的:

  1. 解析 NFC 标签并确定 MIME 类型(文本/图片/音乐)或 URI(后者用于标识标签中的数据负载)。
  2. 将 MIME 类型或 URI 与负载一起封装到 Intent 中。
  3. 根据 Intent 启动 Activity。

首先需要理解一下,整个NFC系统的大致架构,这个架构的理解对初学者来说非常重要:

从下到上分别是RF Layer ISO(底层协议层)、Mode Switch层、NFC Protocol层、Application(应用层)。

从左到右则是点对点模式、读写模式、卡模拟模式的相关协议内容,重点就是中间的读写模式,可以看到标签的类型Tag Type有4种,数据格式有两种:NDEF格式和RTD格式。

首先从底层的NFC协议标准来说,常见的有那么几种协议:

  • ISO 14443(A/B)
  • NFCIP-1
  • MIFARE
  • Felica

至于这些协议标准的具体区别可以在NFC Forum上进行查阅,每一种协议的具体适用场景有所区别。

1. NFC Tag(标签类型)

这里主要介绍NFC Forum定义的4种标签类型:

这些Tag Type在传输频率和速率等参数上有所区别,具体参考NFC Forum的文档。实际更关注到底是哪种类型的Tag Type。

2 NDEF协议(重点)

NDEF:NFC Data Exchange Format(NFC数据交换格式)是NFC Forum定义的一种在NFC设备之间交换数据的协议标准。NDEF具有以下特点:

  • NFC消息封装格式
  • 二进制的形式
  • 由一系列的Record组成。

NDEF Message和NDEF Record

根据NFC Forum的定义,R/W模式下,NFC设备之间每一次交互的数据都会封装在一个NDEF Message中,而一个NDEF Message可以包含多个NFC Record,真正的数据则封装在NFC Record中。(就类似于数据包,在两个设备之间传送)。Android 还支持其他类型的不包含 NDEF 数据的标签,可以使用 android.nfc.tech 软件包中的类处理这些标签。但是我们这里需要的还是NDEF协议下的文本数据。

NDEF的数据结构
NDEF的数据格式非常重要,本质上就和电子设计中某个寄存器的不同位控制不同的功能类似,NFC Record分为NFC Record Header(头部信息)和Payload(数据载荷)两大部分。NDEF协议的结构大致的示意图如下:

为了更精确的了解每一位对应的控制与选择功能,还需要对NDEF数据格式的Record这个消息进行更细致的分析。这里可以去参考一下NDEF数据交换格式的数据手册,这个数据手册是可以百度或者通过其他博客的资源进行下载的。这个是开发NFC一定需要了解的数据协议规范。
某个下载资源链接:
https://download.csdn.net/download/eagle_on_the_peak/9231919?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162303596716780264065080%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162303596716780264065080&biz_id=1&utm_medium=distribute.pc_search_result.none-task-download-2allfirst_rank_v2~rank_v29-2-9231919.first_rank_v2_pc_rank_v29&utm_term=NDEF%E4%BA%A4%E6%8D%A2%E6%89%8B%E5%86%8C&spm=1018.2226.3001.4187

NDEF的数据格式
在了解了NDEF的数据结构后,需要对每个Record内部详细的位控制功能有所了解,这里还是需要多看NDEF数据交换规范的那个官方数据手册或者其他资料来仔细了解每一位对应的功能选择,才能完成数据由高级语言到机器语言的转换模式设置。
这是官方给出的一个NDEF Record数据里的结构:

一个NDEF Record结构里存在了这么一些字节,这些字节以堆栈的形式存储,从上到下对每一字节里的每一位对应的功能模式做一些了解:

- 第一个字节是对整个NDEF Record数据格式做一些约定:

TNF=1:Type类型是NFC RTD类型。
IL=1:说明没有ID Length和ID域这两个字节。
SR=1:说明这是短记录。
CF=0:说明该记录未被切块。
ME=1:说明这是末记录。
MB=1:说明这是首记录。
如果ME和MB同时=1,那说明这个NDEF Message有且只有一个Record。

剩下的几个字节表示的功能模式大致如下:

  • Type Length字节说明Record Header中Type字段的长度。
  • Payload Length 3~Payload Length 0这4个字节共同指明Payload字段的长度。(如果SR标志被设置,则Record Header仅包含一个Payload length字段。)
  • ID Length字节说明ID字节的长度。如果IL标志未设置,则ID Length和ID字节都不存在。
  • Type字节表明Payload的类型,NFC Forum定义了诸如URI、MIME等类型的Type,其目的是方便不同的应用来处理不同Type的数据,例如URI类型的数据就交给浏览器来处理。
  • ID字节需要配合URI类型的Payload一起使用,它使得一个NFC Record能通过ID来指向另外一个NFC Record。

3. TNF数据类型

TNF用于描述一个NFC Record中数据(Payload)的类型,为了方便应用程序能正确解析NFC Record中的数据,NFC Forum规定了一些常用的数据类型,如下表所示。

这里只介绍我们需要用的最常见的NFC Forum Well-Known Type。其余的Type类型的资料参见:https://blog.csdn.net/top5419/article/details/89365484

NFC Forum Well-Known Type:由NFC Forum定义的一些较为常用的数据类型,包括URI、TEXT等,其格式遵循NFC Forum RTD(Record Type Definition)规范。
RTD规范就是NFC Forum自己定义的一些常用数据类型,目前常用类型如下:

  • URI Record Type:用于存储URI数据,对应Type字段取值为"U"。
  • Text Record Type:用于存储文本数据,对应Type字段取值为"T"。
  • Signature Record Type:用于存储数字签名数据,对应Type字段取值为"Sig"。
  • Smart Poster RecordType:智能海报,用于存储与该海报相关的一些资讯信息,如图片、相关介绍等,对应Type字段取值为"Sp" 。
  • Generic Control Record Type:用于传递控制信息,对应Type字段取值为"Gc" 。
  • External Type:为第三方组织定义的类型,目前NFC Forum没有定义相关的数据 类型。

每一个的数据类型又有更加细致的划分,这个在实际开发过程中需要用到哪种类型就可以自己去查询数据手册里相关的格式规范。

三、NDEF文本数据规范下的处理

在熟悉了基本的NDEF Record协议规范后,就是来了解数据由机器语言转化为文本的流程了,这里最好去看一下相关的操作实例,这个实例非常有价值,看完后会对整个流程有更深入的了解。
https://blog.csdn.net/m0_37905055/article/details/108727633?spm=1001.2014.3001.5506

逐步分析一下数据解析的流程步骤。

  1. 首先我们是通过手机的NFC功能获取到一个NFC Tag。然后对这个Tag的数据类型进行判断,因为我们这边要使用的NDEF协议的数据,所以就默认这个Tag里的数据是NDEF规范的。那此时它就是一个NDEF Message。
  2. 这个NDEF Message本质上是一串Hex字符串。然后我们判断这个NDEF Message里到底有几个NDEF Record,这是通过上述的结构中的位判断来确认的。
  3. 然后我们判断Type字节里存放的字母判断出这一串数据是什么类型的,是文本还是图片还是网址之类的数据。这里我们使用的最简单的文本数据。那Type字节就是“T”。
  4. 通过Payload Length的字节来判断Payload的数据长度。因为一段Hex字符串中真正的数据是放在Payload字段中的,所以要通过数据长度进行定位,明白到底第几个数据开始才是真正的Payload字段。、
  5. 确认好哪些Hex字符串是真正的Payload字段中的数据,就完成到了最重要的一步,然后就是通过解码协议进行解码了。最后通过UTF-8规范把字符串转化为中文。

四、小结

到此,NFC开发的理论篇就结束了,整个过程对于初学者来说还是比较繁杂的,最好是多通过看官方的开发者指南,和NFC官网的数据手册来对一些细节部分有更加深入细致的了解。最重要的就是确定标签类型和数据类型,然后提取到Payload字段里的数据,需要自己在实际操作的过程中进行实践。

Android开发系列——实战篇14:NFC开发(理论篇)相关推荐

  1. Android蓝牙开发系列文章-玩转BLE开发(一)

    我们在<Android蓝牙开发系列文章-策划篇>中计划讲解一下蓝牙BLE,现在开始第一篇:Android蓝牙开发系列文章-玩转BLE开发(一).计划要写的BLE文章至少分四篇,其他三篇分别 ...

  2. 手撸Spring系列8:Spring AOP(理论篇)

    说在前头: 笔者本人为大三在读学生,书写文章的目的是为了对自己掌握的知识和技术进行一定的记录,同时乐于与大家一起分享,因本人资历尚浅,发布的文章难免存在一些错漏之处,还请阅读此文章的大牛们见谅与斧正. ...

  3. Android开发系列——实战篇5:自适应屏幕尺寸(超详细教程)

    在实战篇4中构建了界面之后,在模拟器中完好的布局,在实际下载到手机上的时候,却出现了布局不协调的问题. 在模拟器Nexus6上的布局界面: 在真机HUWEI P10 Plus上的布局界面: 在真机HU ...

  4. Android开发系列——实战篇11:多线程与异步机制

    本文介绍安卓的多线程与异步任务处理的机制 目录 一.多线程 1.主线程与子线程 2.Handler用法详解 使用Handler发送post请求 使用Handler处理Message消息 一.多线程 1 ...

  5. Android针对IC卡读写的NFC开发

    菜鸟进场,方圆十里,寸草不生 这两天研究了NFC功能,网上查了很多的资料,不过感觉别人讲的都大同小异,但都缺了那么一点点火候,因为第一次接触有些概念是不清楚的,所以代码看上去很吃力,这个博客呢就是想整 ...

  6. Android 13 还没来 14 的开发代号就已泄露——Upside Down Cake “翻转蛋糕”

    近日,Android 开发者在谷歌 Android 开源项目中发现了关于 Android 14 的内部开发代号 -- Upside Down Cake"翻转蛋糕". 一直以来,谷歌 ...

  7. android爬虫应用实战讲解 视频播放应用开发

    前言 为什么要写这个应用?因为博主爱看动漫,但是有些动漫需要VIP,而且有些动漫在我用的那几个视频网站里甚至都搜不到资源,相信爱看动漫的铁汁应该也遇到过这个问题.于是我就想着自己写一个动漫应用,这样就 ...

  8. Hyperledger Fabric 1.0 实战开发系列 第三课 chaincode开发

    chaincode是由go语言写的,实现了定义的接口.其他语言例如JAVA也是支持的.通过application体积的transaction,chaincode可以初始化并管理Ledger状态. 一个 ...

  9. 手把手玩转win8开发系列课程(14)

    这节的议程就是--添加appbar appbar是出现在哪儿了,出现在屏幕的底部.他能使用户能用手势或者使用鼠标操作程序.metro UI 重点是在主要的控件使用许多控件,使其用户使用win8电脑更加 ...

  10. 安卓开发系列(一)安卓开发环境的搭建

    ​从今天开始,开始整理学习安卓的过程.我们使用的开发环境是android studio(当前很多学校教android 还是使用eclipse导入adt插件的方式,使用eclipse可以直接从java直 ...

最新文章

  1. 打造一个宇宙 星系模拟产生对宇宙进化惊人见解
  2. JVM 配置常用参数
  3. ORACLE TEXT DATASTORE PREFERENCE(一)
  4. 基于netty的微服务架构
  5. [转]浅析Tomcat、JBOSS、WebSphere、WebLogic、Apache
  6. k2677场效应管参数引脚_共射极放大电路,场效应管放大电路,运算放大电路
  7. 微软Team Foundation Service 的Scrum模板中的Feature和Backlog Items 的区别【转载】
  8. lede 自定义linux,OpenWrt 和 LEDE 宣布正式合并
  9. 笔记:Hadoop权威指南 第1章 初识Hadoop
  10. canvas保存为data:image扩展功能的实现
  11. docker rabbitmq_RabbitMQ的介绍及使用进阶(Docker+.Net Core)
  12. P2657 [SCOI2009]windy数
  13. 【报告分享】2021新茶饮研究报告.pdf(附下载链接)
  14. 网页交互式MATLAB入门教程
  15. 《大数据之路:阿里巴巴大数据实践》-第1章 总述
  16. 个人免签支付Java版 雨荷云码支付码支付易支付个人/企业支付宝微信二维码收款app监控
  17. 根据工资计算税费html,税后工资计算器2018 个人所得税excel计算公式
  18. C语言/C++基础之奔跑的小人
  19. html5 导航栏置顶,html5导航栏横向
  20. 二维数组与字符数组——英文字母、数字字符及其他字符的个数

热门文章

  1. 如何通过Azure Service Management REST API管理Azure服务
  2. WordPress安装插件提示输入FTP账户信息
  3. Dapper学习 - Dapper.Rainbow(三) - Read
  4. ajax实例详解(2)
  5. 预处理命令(宏定义,条件编译,头文件)
  6. 提交spark任务命令
  7. java reflector_Java DefaultReflectorFactory类代码示例
  8. 向量的点积与叉乘的几何解释
  9. Qt 统计文件夹的文件总大小
  10. 用系统自带的SSH实现两台linux密钥认证访问