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

转自 http://blog.csdn.net/think_soft/article/details/8169483

本文译自:http://developer.android.com/guide/topics/connectivity/nfc/nfc.html

本文介绍在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

时间: 2024-10-23 15:28:46

Android近场通信---NFC基础(一)(转)的相关文章

Android近场通信---NFC基础(五)(转)

转自 http://blog.csdn.net/think_soft/article/details/8190463 Android应用程序记录(Android Application Record---AAR) 在Android4.0(API Level 14)中引入的Android应用程序记录(AAR),提供了较强的在扫描到NFC标签时,启动应用程序的确定性.AAR有嵌入到NDEF记录内部的应用程序的包名.你能够把一个AAR添加到你的NDEF消息的任何记录中,因为Android会针对AAR来

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

转自 http://blog.csdn.net/think_soft/article/details/8180203 过滤NFC的Intent 要在你想要处理被扫描到的NFC标签时启动你的应用程序,可以在你的应用程序的Android清单中针对一种.两种或全部三种类型的NFC的Intent来过滤.但是,通常想要在应用程序启动时控制最常用的ACTION_NDEF_DISCOVERED类型的Intent.在没有过滤ACTION_NDEF_DISCOVERED类型的Intent的应用程序,或数据负载不是

Android近场通信---NFC基础(四)(转)

转自http://blog.csdn.net/think_soft/article/details/8184539 从Intent中获取信息 如果因为NFC的Intent而启动一个Activity,那么你就能够从Intent中获取被扫描到的NFC标签的相关信息.根据被扫描到的标签,Intent对象能够以下额外的信息: 1.  EXTRA_TAG(必须的):它是一个代表了被扫描到的标签的Tag对象: 2.  EXTRA_NDEF_MESSAGES(可选):它是一个解析来自标签中的NDEF消息的数组

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

转自 http://blog.csdn.net/think_soft/article/details/8171256 应用程序如何调度NFC标签 当标签调度系统完成对NFC标签和它的标识信息封装的Intent对象的创建时,它会把该Intent对象发送给感兴趣的应用程序.如果有多个应用程序能够处理该Intent对象,就会显示Activity选择器,让用户选择Activity.标签调度系统定义了三种Intent对象,以下按照由高到低的优先级列出这三种Intent对象: 1.  ACTION_NDEF

Android中文翻译 - NFC基础

NFC 基础 本文档介绍了在Android上的基本的NFC任务.它说明了如何发送和接收的NDEF消息(NDEF messages)的形式的表单里包含的NFC数据(NFC data),并介绍Android框架里支持这些功能的API.对于更高级的主题,包括与非NDEF数据的讨论,请参阅高级NFC. 当使用NDEF 数据和Android时,有两个主要的使用场景: •从一个NFC 标签里读取NDEF 数据 •使用 Android Beam™ 快速传输Beaming NDEF messages从一台设备到

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

读写NFC标签 读写NFC标签,要涉及到从Intent对象中获取标签,并要打开与标签的通信.要读写NFC标签数据,你必须要定义自己的协议栈.但是,要记住在直接使用NFC标签工作时,你依然能够读写NDEF数据.这是你想要如何构建的事情.下例演示了如何使用MIFARE超薄标签来工作: package com.example.android.nfc; import android.nfc.Tag; import android.nfc.tech.MifareUltralight; import and

Android NFC近场通信03----读写MifareClassic卡

                                       Android NFC近场通信02----读写MifareClassic卡 一.MifareClassic卡 相关 一般来说,给予MifareClassic的射频卡,一般内存大小有3种: 1K: 16个分区(sector),每个分区4个块(block),每个块(block) 16个byte数据 2K: 32个分区,每个分区4个块(block),每个块(block) 16个byte数据 4K:64个分区,每个分区4个块(

Android NFC近场通信02----读写卡的准备工作

                    Android NFC近场通信02----读写卡的准备工作      由于公司接了一个听上去感觉比较NB的项目,给某油田做派工系统 .并由小女子负责Android客户端的开发工作~~开发时的Android设备看上去是比较高大上哈,防爆的,其实很多次同事们都想开玩笑的说试试摔地上,都防爆嘛,那肯定摔不坏的哈~~开发过程中需要用到NFC技术,所以就在网上学习并整理了一下关于Android nfc相关的知识~好了,切入主题,本文写读写卡前的准备工作: ps:这一

NFC:Arduino、Android与PhoneGap近场通信

NFC:Arduino.Android与PhoneGap近场通信(第一本全面讲解NFC应用开发的技术著作移动智能设备近距离通信编程实战入门) [美]Tom Igoe(汤姆.伊戈),Don Coleman(唐.科尔曼),Brian Jepson(布莱恩.杰普森) 著   金建刚 冯依 姚尚朗 译 ISBN 978-7-121-23997-7 2014年9月出版 定价:65.00元 244页 16开 编辑推荐 欢迎进入近场通信(NFC)的世界,这种飞速发展的新技术能通过无线信号在靠近的电子设备间进行