Android近场通信---NFC基础(一)

本文介绍在Android系通过你所能执行的基本任务。它解释了如何用NDEF消息格式来发送和接收NFC数据,并且介绍了支持这些功能的Android框架API。有关更高级的话题,包括对非NDEF格式数据的讨论,情况“高级 NFC”

NDEF数据和Android一起工作的场景主要有两个:

1.  从NFC标签中读取NDEF数据;

2.  把NDEF消息从一个设备发送给另一个设备。

从NFC标签中读取NDEF数据是用标签调度系统来处理的,它会分析被发现的NFC标签,对数据进行适当的分类,并启动对该类数据感兴趣的应用程序。想要处理被扫描到NFC标签的应用程序会声明一个Intent过滤器,并请求处理数据。

Android  Beam™ 功能允许设备把一个NDEF消息推送到物理上相互监听的另一个设备上。这种交互提供了比其他无线技术(如蓝牙)更容易的发送数据的方法。因为NFC不需要手动的设备发现或配对要求。两个设备在接近到一定范围时会自动的连接。Android Beam通过一组NFC API来使用,以便应用程序能够在设备之间来传输信息。例如,通信录、浏览器以及YouTube等应用程序都使用Android Beam来跟其他设备共享通信录、网页和视频。

NFC标签调度系统

通常,除非是在设备的设置菜单中NFC被禁用,否则Android设备会在非锁屏的状态下搜索NFC。当Android设备发现NFC标签时,期望的行为是用最合适的Activity来处理该Intent,而不是询问用户使用什么应用程序。因为设备只能在很短的范围内扫描到NFC标签,强制的让用户手动的选择一个Activity,会导致设备离开NFC标签,从而中断该连接。你应该开发你自己的Activity来处理你所关心的NFC标签,从而阻止 选择器的操作。

为了帮助你达到这个目标,Android提供了特殊的标签调度系统,来分析扫描到的NFC标签,通过解析数据,在被扫描到的数据中尝试找到感兴趣的应用程序,具体做法如下:

1.  解析NFC标签并搞清楚标签中标识数据负载的MIME类型或URI;

2.  把MIME类型或URI以及数据负载封装到一个Intent中。

3.  基于Intent来启动Activity。

怎样把NFC标签映射到MIME类型和URI

开始编写NFC应用程序之前,重要的是要理解不同类型的NFC标签、标签调度系统是如何解析NFC标签的、以及在检测到NDEF消息时,标签调度系统所做的特定的工作等。NFC标签涉及到广泛的技术,并且有很多不同的方法向标签中写入数据。Android支持由NFC Forum所定义的NDEF标准。

NDEF数据被封装在一个消息(NdefMessage)中,该消息中包含了一条或多条记录(NdefRecord)。每个NDEF记录必须具有良好的你想要创建的记录类型的规范的格式。Android也支持其他的不包含NDEF数据类型的标签,你能够使用android.nfc.tech包中的类来工作。要使用其他类型标签来工作,涉及到编写自己的跟该标签通信的协议栈,因此我们建议你尽可能的使用NDEF,以便减少开发难度,并且最大化的支持Android设备。

注意:要下载完整的NDEF规范,请去“NFC论坛规范下载”网址来下载。

现在,你已经具备了一些NFC标签的背景知识,接下来要详细的介绍Android是如何处理NDEF格式的标签的。当Android设备扫描到包含NDEF格式数据的NFC标签时,它会解析该消息,并尝试搞清楚数据的MIME类型或URI标识。首先系统会读取消息(NdefMessage)中的第一条NdefRecord,来判断如何解释整个NDEF消息(一个NDEF消息能够有多条NDEF记录)。在格式良好的NDEF消息中,第一条NdefRecord包含以下字段信息:

3-bit TNF(类型名称格式)

指示如何解释可变长度类型字段,在下表1中介绍有效值。

可变长度类型

说明记录的类型,如果使用TNF_WELL_KNOWN,那么则使用这个字段来指定记录的类型定义(RTD)。在下表2中定义了有效的RTD值。

可变长度ID

唯一标识该记录。这个字段不经常使用,但是,如果需要唯一的标识一个标记,那么就可以为该字段创建一个ID。

可变长度负载

你想读/写的实际的数据负载。一个NDEF消息能够包含多个NDEF记录,因此不要以为在NDEF消息的第一条NDEF记录中包含了所有的负载。

标签调度系统使用TNF和类型字段来尝试把MIME类型或URI映射到NDEF消息中。如果成功,它会把信息跟实际的负载一起封装到ACTION_NEDF_DISCOVERED类型的Intent中。但是,会有标签调度系统不能根据第一条NDEF记录来判断数据类型的情况,这样就会有NDEF数据不能被映射到MIME类型或URI,或者是NFC标签没有包含NDEF开始数据的情况发生。在这种情况下,就会用一个标签技术信息相关的Tag对象和封装在ACTION_TECH_DISCOVERED类型Intent对象内部的负载来代替。

表1.介绍标签调度系统映射如何把TNF和类型字段映射到MIME型或URI上。同时也介绍了那种类型的TNF不能被映射到MIME类型或URI上。这种情况下,标签调度系统会退化到ACTION_TECH_DISCOVERED类型的Intent对象。

例如,如果标签调度系统遇到一个TNF_ABSOLUTE_URI类型的记录,它会把这个记录的可变长度类型字段映射到一个URI中。标签调度系统会把这个URI跟其他相关的标签的信息(如数据负载)一起封装到ACTION_NDEF_DISCOVERED的Intent对象中。在另一方面,如果遇到了TNF_UNKNOWN类型,它会创建一个封装了标签技术信息的Intent对象来代替。

表1.所支持的TNF和它们的映射

类型名称格式(TNF)

映射

TNF_ABSOLUTE_URI

基于类型字段的URI

TNF_EMPTY

退化到ACTION_TECH_DISCOVERED类型的Intent对象

TNF_EXTERNAL_TYPE

基于类型字段中URN的URI。URN是缩短的格式(<domain_name>:<service_name)被编码到NDEF类型中。Android会把这个URN映射成以下格式的URI:vnd.android.nfc://ext/<domain_name>:<service_name>。

TNF_MIME_MEDIA

基于类型字段的MIME类型

TNF_UNCHANGED

退化到ACTION_TECH_DISCOVERED类型的Intent对象

TNF_UNKNOWN

退化到ACTION_TECH_DISCOVERED类型的Intent对象

TNF_WELL_KNOWN

依赖你在类型字段中设置的记录类型定义(RTD)的MIME类型或URI,

表2.TNF_WELL_KNOWN所支持的RTD和它们的映射

记录类型定义(RTD)

映射

RTD_ALTERNATIVE_CARRIER

退化到ACTION_TECH_DISCOVERED类型的Intent对象

RTD_HANDOVER_CARRIER

退化到ACTION_TECH_DISCOVERED类型的Intent对象

RTD_HANDOVER_REQUEST

退化到ACTION_TECH_DISCOVERED类型的Intent对象

RTD_HANDOVER_SELECT

退化到ACTION_TECH_DISCOVERED类型的Intent对象

RTD_SMART_POSTER

基于负载解析的URI

RTD_TEXT

text/plain类型的MIME

RTD_URI

基于有效负载的URI

Android近场通信---NFC基础(一)相关推荐

  1. Android近场通信---NFC基础(三)

    Android近场通信---NFC基础(三) 过滤NFC的Intent 要在你想要处理被扫描到的NFC标签时启动你的应用程序,可以在你的应用程序的Android清单中针对一种.两种或全部三种类型的NF ...

  2. Android近场通信---NFC基础(一)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8169483 本文译自:http://developer.android.com/guide/t ...

  3. Android近场通信---NFC基础(二)(转)

    转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的In ...

  4. Android近场通信---高级NFC(二)

    Android近场通信---高级NFC(二) 读写NFC标签 读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信.要读写NFC标签数据,你必须要定义自己的协议栈.但是,要记住在 ...

  5. 九、Android近场通信(NFC)

    Android近场通信(NFC) 前言 项目目录 1.NFC (1)权限 (2)代码MainActivity.activity_main (3)NFC设备 2.AndroidManifest.xml ...

  6. android 近场通信,Android NFC近场通信03----读写MifareClassic卡(示例代码)

    Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16 ...

  7. WAPI产业联盟:中国两项近场通信NFC安全技术成国际标准

    日前,从WAPI产业联盟获悉,我国自主创新的近场通信(NFC)非对称实体鉴别(NEAU-A).NFC对称实体鉴别(NEAU-S)两项近场通信安全技术正式成为ISO/IEC国际标准,填补了国际上NFC身 ...

  8. Android近场通信

    一.三种近场通信技术 1.类别 (1)WIFI (2)BlueTooth (3)NFC 2.三大技术的特点 (1)WIFI ​ WiFi(Wireless Fidelity,无线保真技术)即IEEE ...

  9. DP1332E是一款SOC的近场通信NFC芯片

    DP1332E在射频端有更优秀的表现,基于NFCIP-1等通信协议,有更好的可开发性,极大地降低了开发难度. 简述下DP1332E的资料 工作模式 ●读写器模式,支持ISO/IEC14443A/MIF ...

最新文章

  1. 恢复删除的Linux文件
  2. java 资料大全-转
  3. thinkpadt450s换键盘视频_ikbc c87 入门级有线机械键盘测评
  4. 微信小程序 没有找到 node_modules 目录
  5. mysql set语句_mysql--乱码解决(6)
  6. 【数字逻辑设计】卡诺图
  7. [CMake] set_property 和 set_target_properties
  8. VMware下安装CentOS
  9. Markdown制作表格
  10. HTML+CSS静态页面`西安旅游网站设计——西安旅游(7页) 大学生旅游网页作品 出行网页设计作业模板 学生游玩网页制作源代码下载
  11. 互联网电商大数据架构图
  12. Spring Framework灰度发布
  13. Lambda表达式的一些相关知识理解
  14. Day01 每日英语
  15. 线性与非线性规划:随机方向法
  16. 优衣库46万客户信息遭泄露,这些年,你的信息还被谁泄露过?
  17. Java中map的含义
  18. 20 WebGL使用纹理贴图
  19. Atari 2600 新书:主机游戏的一次黎明冒险
  20. Matlab中创建和使用表

热门文章

  1. c# hdf5 写string_Pandas系列之入门篇——HDF5
  2. 源码分析Dubbo服务消费端启动流程
  3. mac下使用brew安装java等应用
  4. STL之stack容器
  5. thread_LockSupport
  6. C#类型的强制转换及隐式转换
  7. Hive 实战(1)--hive数据导入/导出基础
  8. 如何建立一个利于SEO的网站
  9. C#框架提供的几种数据结构对单值查找的效率比较
  10. 扩展或插件 (Extension or Plugin )