NFC基础 您所在的位置:网站首页 申请nfc NFC基础

NFC基础

2023-09-26 07:54| 来源: 网络整理| 查看: 265

本文档描述了在Android执行的基本的NFC技术,它说明了如何发送和接收NDEF消息的形式的NFC数据,并介绍Android框架中支持这些功能的API,对于更高级的主题,包括讨论非NDEF数据相关的,参阅高级NFC文档。 当与NDEF数据和Android有关时,有两个主要的用途情况: 从一个NFC Tag读取NDEF数据通过Android Beam™, 从一个设备到另一个设备发送NDEF消息 从一个NFC Tag阅读NDEF数据是Tag发布系统处理的,分析发现NFC Tag,适当地对数据进行分类,并启动一个倾向对数据进行分类的应用程序。要进行扫描NFC Tag处理的应用程序可以声明一个Intent过滤器并且请求处理数据。 Android Beam™功能允许设备通过跟其他设备碰在一起,把NDEF消息推到另一个设备,这种互动比其它无线技术,如蓝牙发送数据,提供了一个更简单的方法,因为NFC,没有手动装置发现或要求配对。当两个设备进入范围时连接自动启动,通过一系列的NFC API,Android Beam生效,所以任何应用都可以在设备之间传输信息,例如,联系人,浏览器和YouTube应用程序使用Android Beam与其他设备分享。联系人,网页,视频。 Tag发布系统 Android的设备都通常在屏幕解锁时寻找NFC Tag,除非NFC在设备的设置菜单被禁用。当Android设备扫描到一个NFC Tag,通用的行为是自动找最合适的Activity会处理这个Tag Intent而不需要用户来选择哪个Activity来处理。因为设备扫描NFC Tags是在很短的范围和时间,如果让用户选择的话,那就有可能需要移动设备,这样将会打断这个扫描过程。你应该开发你只处理需要处理的Tags的Activity,以防止让用户选择使用哪个Activity来处理的情况。 为了帮助你实现这个目标,Android提供了一个特殊的Tag发布系统,这个系统能分析扫描NFC Tag,解析它们,并试图找出对扫描数据有兴趣的应用程序,如下: 解析NFC Tag和计算出的MIME类型或一个用于在标签上确定数据有效载荷的URI。封装的MIME类型,或者URI和有效载荷送入Intent。前两个步骤是对NFC标签如何被映射到MIME类型和URI的描述。启动Activity的Intent。这是描述了如何发布应用NFC标签。 NFC Tag如何被映射到MIME类型和URI 在你开始写你的NFC应用前,了解不同类型的NFC Tag是重要的,Tag发布系统如何解析NFC Tag,以及当Tag发布系统检测NDEF消息的特殊工作。NFC Tag来源于广泛的技术,还可以有许多不同的方式对他们写入数据。Android有NDEF标准最大的支持,该标准是由NFC论坛定义的。 NDEF数据是在消息内封装的(NdefMessage),该消息包含一个或多个记录(NdefRecord),必须根据你要创建的特殊类型的记录来规范每个NDEF记录。Android还支持其他类型的不包含NDEF数据的Tag,你可以通过使用在android.nfc.tech包里的类来对那些DNEF有效。欲了解有关这些技术的更多信息,请参阅高级NFC的话题。使其他类型的Tag有效,包括需要编写自己的协议来和那些其他类型的Tag通信,所以我们建议当可能易于开发和采用Android的设备的最大支持时使用NDEF。

注意:要下载NDEF规格齐全,去NFC论坛规范下载网站,请参阅构建常见的类型的NDEF记录,例如如何构建NDEF记录。 现在,你已经具备了一些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_NDEF_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. TNF_EXTERNAL_TYPE URI基于类型字段中的URN. URN是缩短的格式(:.)被编码到NDEF类型中Android会把这个URN映射成以下格式的 vnd.android.nfc://ext/: TNF_MIME_MEDIA 基于类型字段的MIME类型 TNF_UNCHANGED 在第一条记录中是无效的, 因此回落到 ACTION_TECH_DISCOVERED. TNF_UNKNOWN 回落到 ACTION_TECH_DISCOVERED. TNF_WELL_KNOWN 依赖你在类型字段中设置的记录类型定义(RTD)的MIME类型或URI, 欲了解有效的RTDs和它们的映射更多信息,请参考表 2

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

Record类型定义 (RTD) 映射 RTD_ALTERNATIVE_CARRIER 回落到 ACTION_TECH_DISCOVERED. RTD_HANDOVER_CARRIER 回落到 ACTION_TECH_DISCOVERED. RTD_HANDOVER_REQUEST 回落到 ACTION_TECH_DISCOVERED. RTD_HANDOVER_SELECT 回落到 ACTION_TECH_DISCOVERED. RTD_SMART_POSTER 基于负载解析的URI RTD_TEXT text/plain类型的MIME. RTD_URI 基于负载的URI 应用程序如何调度NFC Tags

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

ACTION_NDEF_DISCOVERED: 这种Intent用于启动包含NDEF负载和已知类型的标签的Activity。这是最高优先级的Intent,并且标签调度系统在任何其他Intent之前,都会尽可能的尝试使用这种类型的Intent来启动Activity。ACTION_TECH_DISCOVERED: 如果没有注册处理ACTION_NDEF_DISCOVERED类型的Intent的Activity,那么Tag调度系统会尝试使用这种类型的Intent来启动应用程序。如果被扫描到的标签包含了不能被映射到MIME类型或URI的NDEF数据,或者没有包含NDEF数据,但是是已知的标签技术,那么也会直接启动这种类型的Intent对象(而不是先启动ACTION_NDEF_DISCOVERED类型的Intent)ACTION_TAG_DISCOVERED: 如果没有处理 ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED类型Intent的Activity,就会启动这种类型的Intent。

Tag调度系统的基本工作方法如下:

用解析NFC标签时由Tag调度系统创建的Intent对象(ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED)来尝试启动Activity; 如果没有对应的处理Intent的Activity,那么就会尝试使用下一个优先级的Intent(ACTION_TECH_DISCOVERED或ACTION_TAG_DISCOVERED)来启动Activity,直到有对应的应用程序来处理这个Intent,或者是直到Tag调度系统尝试了所有可能的Intent。如果没有应用程序来处理任何类型的Intent,那么就不做任何事情。

图 1. Tag调度系统

在可能的情况下,都会使用NDEF消息和 ACTION_NDEF_DISCOVERED 类型的Intent来工作,因为它是这三种Intent中最标准的。这种Intent与其他两种Intent相比,它会允许你在更加合适的时机来启动你的应用程序,从而给用户带来更好的体验。 在 Android Manifest 中申请 NFC 访问  在访问设备的NFC硬件和正确的处理NFC的Intent之前,要在 AndroidManifest.xml 文件中进行以下声明: 在   元素中声明访问NFC硬件: 你的应用程序所支持的最小的SDK版本。API Level 9只通过ACTION_TAG_DISCOVERED来支持有限的标签调度,并且只能通过 EXTRA_NDEF_MESSAGES来访问NDEF消息。没有其他的标签属性或I/O操作可用。API Level 10中包含了广泛的读写支持,从而更好的推动了NDEF的应用前景,并且API Leve 14用Android Beam和额外的方便的创建NDEF记录的方法,向外提供了更容易的把NDEF消息推送给其他设备的方法。 使用  uses-feature 元素,在Google Play中,以便你的应用程序能够只针对有NFC硬件的设备来显示。 如果你的应用程序使用了NFC功能,但是相关的功能又不是你的应用程序的关键功能,你可以忽略 uses-feature 元素,并且要在运行时通过调用 getDefaultAdapter() 方法来检查NFC是否有效。 过滤 NFC 的 Intents

要在你想要处理被扫描到的NFC标签时启动你的应用程序,可以在你的应用程序的Android清单中针对一种、两种或全部三种类型的NFC的Intent来过滤。但是,通常想要在应用程序启动时控制最常用的ACTION_NDEF_DISCOVERED类型的Intent。在没有过滤ACTION_NDEF_DISCOVERED类型的Intent的应用程序,或数据负载不是NDEF时,才会从ACTION_NDEF_DISCOVERED类型的Intent回退到ACTION_TECH_DISCOVERED类型的Intent。通常ACTION_TAG_DISCOVERED是最一般化的过滤分类。很多应用程序都会在过滤ACTION_TAG_DISCOVERED之前,过滤ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED,这样就会降低你的应用程序被启动的可能性。ACTION_TAG_DISCOVERED只是在没有应用程序处理ACTION_NDEF_DISCOVERED或ACTION_TECH_DISCOVERED类型的Intent的情况下,才使用的最后手段。

因为NFC标签的多样性,并且很多时候不在你的控制之下,因此在必要的时候你要回退到其他两种类型的Intent。在你能够控制标签的类型和写入的数据时,我们建议你使用NDEF格式。下文将介绍如何过滤每种类型的Intent对象。 ACTION_NDEF_DISCOVERED 要过滤 ACTION_NDEF_DISCOVERED 类型的Intent,就要在清单中跟你想要过滤的数据一起来声明该类型的Intent过滤器。以下是过滤 text/plain 类型的MIME的 ACTION_NDEF_DISCOVERED 类型过滤器的声明: 以下示例使用 http://developer.android.com/index.html 格式的URI来过滤: ACTION_TECH_DISCOVERED 如果你的Activity 要过滤 ACTION_TECH_DISCOVERED   类型的Intent,你必须创建一个XML资源文件,该文件在 tech-list 集合中指定你的Activity所支持的技术。如果 tech-list 集合是标签所支持的技术的一个子集,那么你的Activity被认为是匹配的。通过调用 getTechList() 方法来获得标签所支持的技术集合。

举例来说,如果被扫描到的Tag支持 MifareClassic, NdefFormatable, 和 NfcA, 你的 tech-list设置 为了匹配你的activity,你必须列举出这些技术(并没有其他的)的三个,两个,或者一个.

下面的例子定义了所有的技术. 你可以删除你不需要的. 保存这个文件 (你可以用你想要的任何名字命名它)到 /res/xml 文件夹.

android.nfc.tech.IsoDep android.nfc.tech.NfcA android.nfc.tech.NfcB android.nfc.tech.NfcF android.nfc.tech.NfcV android.nfc.tech.Ndef android.nfc.tech.NdefFormatable android.nfc.tech.MifareClassic android.nfc.tech.MifareUltralight

你也能够指定多个tech-list集合,每个tech-list集合被认为是独立的,并且如果任何一个tech-list集合是由getTechList()返回的技术的子集,那么你的Activity就被认为是匹配的。下列示例能够跟支持NfcA和Ndef技术NFC标签或者跟支持NfcB和Ndef技术的标签相匹配:

android.nfc.tech.NfcA android.nfc.tech.Ndef android.nfc.tech.NfcB android.nfc.tech.Ndef

在你的 AndroidManifest.xml 文件中, 像下面的例子一样 ,在  元素中,在你指定的  元素中创建资源文件 :

... ...

欲了解有关 tag 技术和 ACTION_TECH_DISCOVERED intent更详细的信息, 请参阅在高级NFC文档中的 Working with Supported Tag Technologies.

ACTION_TAG_DISCOVERED

为了过滤出 ACTION_TAG_DISCOVERED, 用如下的 intent filter:

从 intents 获取信息

如果由于 NFC intent 导致一个activity被启动, 你可以从intent 获取关于扫描到的NFC Tag的信息. Intents包含如下附加的信息,它依赖于被扫描到的Tag:

EXTRA_TAG (必须的): 一个 Tag 对象,表示被扫描到的tag.EXTRA_NDEF_MESSAGES (可选的): 一个从tag解析到的NDEF信息数组. 这个付托在intents上.{@link android.nfc.NfcAdapter#EXTRA_ID (可选的): Tag的low-level ID.

要获取这些附加信息,就要确保你的Activity是被扫描到的NFC的Intent对象启动的,然后才能获得Intent之外的附加信息。下例检查ACTION_NDEF_DISCOVERED类型的Intent,并从Intent对象的附加信息中获取NDEF消息。

public void onResume() { super.onResume(); ... if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMsgs != null) { msgs = new NdefMessage[rawMsgs.length]; for (int i = 0; i byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII")); Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16"); byte[] textBytes = payload.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有