NFC(Near Field Communication,近场通信)相关

时间:2024-03-30 13:56:19

摘自《深入理解Android:WiFi模块 NFC和GPS卷 - 邓凡平》

以前的读书笔记贴一下,Android 版本演进,源码相关的一些内容可能有很大变化。
 

NFC(Near Field Communication,近场通信)相关

  • NFC Forum
    • 制定NFC相关的技术标准
    • NFC认证测试
  • NFC基础知识
    • NFC是从多种不同技术基础上综合发展而来

      NFC(Near Field Communication,近场通信)相关

      • RFID技术路线,即无线射频识别技术(图左边)
        (Barcodes=>RFID=>NFC Tag(标签)和NFC Reader)
      • 磁条卡(Magnetic Strip Cards)技术路线(图右边)
        Proximity Coupling Smart Card技术(有效距离为10cm,对应的规范为ISO/IEC 14443
      • 移动终端线路,演化了携带NFC功能的终端设备(图中间)
        NFC Connection Handover技术,它描述了两台智能终端如何通过NFC相关协议来选择合适的数据传输方式​Wi-Fi Simple Configuration时(6.1节)曾介绍过一个例子,即智能手机可通过NFC来和AP交换安全配置信息
    • 物理特性
      • 工作频率为13.56MHz
      • 有效距离为4cm
      • 数据传输速率有106kbps、212kbps和424kbps三种
    • NFC技术框架

      NFC(Near Field Communication,近场通信)相关

      • Reader/Write模式:简称R/W,和NFC Tag/NFC Reader相关。
      • Peer-to-Peer模式:简称P2P,它支持两个NFC设备交互。
      • NFC Card Emulation模式:简称CE,它能把携带NFC功能的设备模拟成Smart Card,这样就能实现诸如手机支付、门禁卡之类的功能。
      • 与NFC技术框架相对应的NFC Forum所定义的规范框架

        NFC(Near Field Communication,近场通信)相关

        • NFC Forum定义了三个主要规范
          • Analog Specifications:该规范描述了NFC设备RF层的电气特性
          • Digital Protocal Specification:该规范在ISO 18092、ISO 14443及JIS X6319-4之上定义了NFC设备之间的数字通信协议,它使得基于不同底层协议例如Type A或Type F的NFC设备之间或者NFC设备与其他使用ISO 18092等规范的设备之间能够交互
          • NFC Activities Specification:该规范为各运行模式对应的协议栈提供支持,例如P2P模式下两个NFC设备如何建立链接,R/W模式下NFC Device如何操作NFC Tag。
        • Reference Applications表示NFC Forum在应用层面所定义的一些规范。目前有两个规范
          • Connection Handover:两个NFC设备通过它来协商用蓝牙或Wi-Fi来开展后续的数据传输工作。
          • Personal Health Device Communication:该规范定义了如何利用NFC技术在个人健康设备之间交换数据信息。
          • NFC还制定了一个NCI(NFC Controller Interface)规范,该规范制定了一套交互接口,使得主机设备(Device Host,以手机为例,NFC芯片被集成到某个手机中,那么手机就是Device Host)能够使用这套接口来和NFC芯片交互。
      •  
    • NFC三种运行模式
      • NFC R/W运行模式

        NFC(Near Field Communication,近场通信)相关

        • 1.NDEF和NFC Record
          • (1) NDEF和NFC Record[8][9]之间的关系, R/W模式下,NFC设备之间每一次交互的数据都会封装在一个NDEF Message中,而一个NDEF Message可以包含多个NFC Record,真正的数据则封装在NFC Record中

            NFC(Near Field Communication,近场通信)相关


            由图可知,一个NDEF Message可包含一个或多个NFC Record。在一个NDEF Message中,第一个NFC Record需设置其MB位(Message Begin)为1,表示它是该消息中第一个NFC Record,最后一个NFC Record需设置ME位(Message End)位为1,表示它是此消息中最后一个NFC Record。
            • NFC Record组织结构,NFC Record分为NFC Record Header(头部信息)和Payload(数据载荷)两大部分

              NFC(Near Field Communication,近场通信)相关


              Record Header中最重要的是其第一字节。该字节有6个标志信息,分别如下。·MB(Message Begin标志)·ME(Message End标志)·CF(Chunk Flag标志,表示该Record是否为分片Record)·SR(Short Record标志。如果该标志被设置,则图中的4个Payload Length字段仅需一个,这表明Payload数据长度将限制在255字节以内)·IL(ID_LENGTH标志,它用于指明Header中是否包含ID Length和ID这两个字段)·TNF(Type Name Format标志,用于指明Payload的类型,NFC Forum定义了一些常用的Payload类型,详情见下文分析)​
        • 2.NFC Record实例
          • (1)URI Record Type实例

            NFC(Near Field Communication,近场通信)相关


            由于该NDEF消息只包含一个NFC Record,所以这个唯一的NFC Record将设置MB和ME标志位为1。另外,由于数据量小于255字节,所以SR标志位为1。最后,该Record携带的数据属于URI类型,它为Well-Known Type的一种,所以TNF取值为0x01。Type Length字段取值为0x01,对应的Type字段取值为"U",代表URI Record Type。根据本节对URI Record的介绍,这种类型Record的Payload包含ID Code和data两个部分。ID Code取值为0x01占据1字节(代表"http://www"),而data为"nfc.com"占据7字节,所以整个Payload长度为8字节,故Payload length字段取值为0x08。当应用程序获取Payload信息后,将根据ID Code和Data的取值最终计算出对应的URI为"http://www.nfc.com"。
          • (2)Text Record Type实例

            NFC(Near Field Communication,近场通信)相关


            携带"Hello World"字符串信息的NDEF消息各字段的取值情况。
    • NFC P2P运行模式
      • 梗概
        • LLC层及以下部分

          NFC(Near Field Communication,近场通信)相关

        • NFC P2P协议栈的全貌

          NFC(Near Field Communication,近场通信)相关

          • SNEP(Simple NDEF Exchange Protocol)紧接LLC层。该协议使得两个NFC Device之间能直接交换NDEF消息
          • 通过Protocol Bindings,NFC可支持其他高层次并且用途更加广泛的协议。根据参考资料[3]所示的内容,NFC可支持IP和OBEX(Object Exchange,对象交换)协议,但经过调查发现NFC Forum官网目前只有LLCP-OBEX-Binding协议的草案,而LLCP和IP协议如何绑定还在研究当中。
          • Other Protocols中目前比较常用的是CHP(Connection Handover Protocol)。
      • 1.LLCP介绍
        • (1)LLCP数据包格式

          NFC(Near Field Communication,近场通信)相关


          LLCP数据包前3字节为LLCP Header。LLCP Header之后就是Payload,其长度由PTYPE来决定。​
          • DSAP和SSAP分别代表Destination和Source Service Access Point(目标和源服务接入点)。DSAP和SSAP的作用类似于TCP/UDP中的端口号。决定了收发模块到底是谁。

            NFC(Near Field Communication,近场通信)相关


            以SNEP的使用为例:·位于NFC Device A的服务端模块在SSAP为0x04的端口上进行监听。·位于NFC Device B的客户端模块选择一个合适的SSAP,设置DSAP为0x04。然后该客户端模块发送数据包,LLC负责将数据包打包传递给NFC Device B(假设这两个设备都在彼此的有效距离内)。·NFC Device A的LLC层接收到数据包后发现DSAP为0x04,而其上刚好有一个服务模块工作在0x04端口,故LLC层将把数据包传递给这个在0x04端口上监听的服务模块。
          • PTYPE字段指明LLCP包的类型。NFC LLCP定义了多种不同类型的包,下文将结合面向链接的数据传输服务来学习相关的LLCP包。
          • Sequence字段指明LLCP包的序号,它可分为Send端和Receiver端。由于有一些类型的LLCP包无需Sequence字段,所以Sequence字段长度有可能为0。
        • (2)面向链接数据传输服务

          NFC(Near Field Communication,近场通信)相关


          ·进入Link Activation时,Device A和Device B将分别扮演Initiator和Target角色,参考资料[13]可用于确定谁来扮演Initiator或Target。·Initiator发送PAX数据包给Target。PAX全称为Parameter Exchange,它用于在两个设备间交换彼此的LLC层配置信息(如协议版本等,详情见下文)。·Target收到Initiator的PAX包后需要相应处理,例如判断协议版本是否匹配等。Target处理完后,它需要发送自己的LLC层配置信息给Initiator。·Initiator检查Target的LLC层配置参数,如果一切正常,双方Logical Link成功建立,随后可进入正常工作阶段。
          • PAX属于LLCP数据包的一种,其格式如图

            NFC(Near Field Communication,近场通信)相关

            NFC(Near Field Communication,近场通信)相关

          • Link被**后,Device A和Device B将先建立面向链接的关系,然后再开展数据交互,这一流程如图

            NFC(Near Field Communication,近场通信)相关

      • 2.SNEP介绍
        SNEP(Simple NDEF Exchange Protocol)支持在两个NFC Device之间交换NDEF消息。SNEP是一种基于面向链接的数据传输协议,作为Well-Known Service的一种,其服务端口号为0x04,服务名为"urn:nfc:sn:snep"。
        • SNEP属于Request/Response方式,其工作过程如图

          NFC(Near Field Communication,近场通信)相关


          SNEP的工作流程非常简单,主要包括两个步骤。1)SNEP客户端发送SENP Request消息给服务端进行处理。2)SNEP服务端回复SNEP Response消息给客户端以告知处理结果。
        • SNEP Request/Response消息格式

          NFC(Near Field Communication,近场通信)相关

          • SNEP当前支持的Request类型

            NFC(Near Field Communication,近场通信)相关

            • SNEP Put消息格式

              NFC(Near Field Communication,近场通信)相关

    • NFC CE运行模式

      NFC(Near Field Communication,近场通信)相关


      NFC CE运行模式使得携带NFC芯片的设备能充当智能卡(例如信用卡)使用。该运行模式所支持的应用场景极具吸引力,例如用支持该功能的Android智能手机来完成购票、支付,甚至充当门禁卡,汽车钥匙、公交卡等。SE和NFC芯片(主要是指NFC Controller,简称NFCC)通过SWP(Single Wire Protocol)或者S2C(SignalIn/SignalOut Connection Interface,也叫NFC Wired Interface,简称NFC-WI)来交互。一般来说,SE上面运行了一些特殊的应用程序,NFC负责将数据通过SWP或S2C传递给SE中的应用来处理。​
      • SE在CE模式中扮演了非常重要的角色,目前SE和NFC的组合有三种方式

        NFC(Near Field Communication,近场通信)相关

        • ·SE为一个嵌入式安全芯片,该芯片在手机出厂前就已经安装在其内部,而且无法被替换。
        • ·SE为一个支付型SD卡,这种卡实际上是在SD卡上嵌入了安全模块,相关应用可在这种卡上运行。
        • ·SE为UICC,也就是常说的手机SIM卡,这种组合方式对应的方案也称为NFC-SIM方案,目前由运营商主推。
        • NXP公司pn65 NFC芯片

          NFC(Near Field Communication,近场通信)相关


          包含一个Secure Element,即图中的SmartMX模块,该模块中运行着一个名为Java Card OS的操作系统。在Java Card OS上,用户可以安装和运行一些应用程序(称为Applets)。除了SmartMX内置的SE外,pn65也支持使用外部的SE,即图中的UICC。
        • CLF-UICC连线

          NFC(Near Field Communication,近场通信)相关


          CLF(NFC Contactless Front-End缩写)和UICC通过三条线相连。Gnd接地,Vcc提供电源。SWIO为CLF和UICC的数据连接线,数据传输率在212kbps~1.6Mbps之间,每次传输的数据包小于30字节。
    • NCI原理
      NCI(NFC Controller Interface)是NFC Forum于2012年制定的一个规范,其主要关注点为DH(Device Host,主机设备)如何控制并与NFCC(NFC Controller)交互
      • NFCC、NCI和DH三者之间的关系

        NFC(Near Field Communication,近场通信)相关


        NFCC和DH通过物理连线相连,物理连线对应为Transport Layer(传输层),NFCC和DH在传输层这一块支持SPI、I2C、UART和USB等
        • NCI模块结构

          NFC(Near Field Communication,近场通信)相关

          • ·NCI Core模块负责DH和NFCC之间交互的基本功能,包括控制消息(Control Message)和数据消息(Data Message)的传递、DH初始化、重置和配置NFCC等。
          • ·Transport Mapping用于在NFC Core和传输层之间转换数据格式,例如将NCI Core使用的控制消息和数据消息转换成对应传输层使用的数据格式。
          • ·NCI Module包含多个功能模块,例如RF Discovery模块用于搜索周围的其他NFC Device、RF Interface用于和对端的NFC Device交互。
          • 使用NCI的NFC Device中,DH和NCI的工作原理如图

            NFC(Near Field Communication,近场通信)相关


            NCI的一个很重要的作用就是统一Android中NFC HAL层的实现,即通过一套标准的方法来实现对NFCC的控制以及数据交互。不过,由于NCI规范推出的时间比较晚(该协议最终版的时间为2012年11月6日),所以占据最大市场份额的NXP公司在其Android平台的NFC HAL层中还没有使用NCI。
            • ·DH通过NCI规范定义的Control Message来控制NFCC。目前规范定义的Control Message包括Commands(请求命令,包括初始化NFCC、重置NFCC、设置NFCC配置参数等)、Responses(回复)和Notifications(通知)。这些Message都封装在NCI Control Packages中。其中,Commands只能由DH发送给NFCC。
            • ·DH通过RF Interface和对端NFC设备(图中的Remote NFC Endpoint)交互,也可通过NFCEE Interface和本设备的NFCEE交互。交互数据包括Control Message和Data Message。
    • NFC相关规范

      NFC(Near Field Communication,近场通信)相关

      • NFC的三种运行模式以及相关的数据类型定义、协议栈和工作方式
  • Android平台中NFC实现
    • Android平台中Nfc模块结构

      NFC(Near Field Communication,近场通信)相关


      如果使用NXP公司pn系列的NFC芯片,则Nfc模块结构如左图所示,即最终的APK文件名为Nfc.apk,它通过packages/apps/Nfc/nxp目录下dhimpl模块与libnfc_jni以及libnfc这两个动态库交互。libnfc的代码位于external/libnfc-nxp目录下,由NXP公司提供以用于操作NXP公司的NFC芯片。如果使用博通公司2079x系列的NFC芯片,则Nfc模块结构如右图所示,即最终的APK文件名为NfcNci.apk,它通过packages/apps/Nfc/nci目录下的dhimpl模块与libnfc_nci_jni以及libnfc_nci这两个动态库交互。libnfc_nci的代码位于external/libnfc-nci目录下,由博通公司提供以用于操作博通公司的NFC芯片。​
    • NFC客户端示例
      • 1.NFC R/W模式示例
        • (1)NFC Tag分发系统

          NFC(Near Field Communication,近场通信)相关

          • Tag分发系统看起来很复杂,实际上其核心内容可概况成三个步骤。
          • 步骤1 如果目标NFC Tag包含了系统支持的NDEF消息,则NFC系统模块将直接把这个NDEF消息分发给感兴趣的Activity。如果有目标Activity,则直接分发给它,否则转步骤2。分支转换的判断标准是NFC Tag是否包含了系统支持的NDEF消息以及同时是否有目标Activity注册了ACTION_NDEF_DISCOVERED通知。
            • 1)ACTION_NDEF_DISCOVERED:由上文可知,NFC系统模块首先尝试将NFC Tag中的数据映射成系统直接支持的数据格式。表8-11列举了Android系统直接支持的NFC Forum数据格式。

              NFC(Near Field Communication,近场通信)相关

          • 步骤2 如果目标NFC Tag包含了系统不支持的NDEF消息或者步骤1中没有目标Activity,则NFC系统模块将尝试分发一个ACTION_TECH_DISCOVERED通知。NFC系统模块在分发此通知时,将首先分析目标NFC Tag所支持的Tag Technology(它代表目标NFC Tag所使用的技术,详情见下文分析),然后寻找注册了支持这些Tag Technology的目标Activity并将Intent分发给它。如果没有合适的目标Activity,则转入步骤3。
            • 2)ACTION_TECH_DISCOVERED:如果系统不能映射NFC Tag中的数据,我们该如何处理呢?答案是:应用程序自己去读取并解析Tag中的数据

              NFC(Near Field Communication,近场通信)相关

            • Android提供了一个名为"android.nfc.tech"的Java包来帮助应用程序操作对应的NFC Tag

              NFC(Near Field Communication,近场通信)相关

              • 注意,一个Tag可能同时支持表8-12中多种Technology。例如下图所示为笔者测试北京市公交卡时所得到的Tag Technology信息。

                NFC(Near Field Communication,近场通信)相关

          • 步骤3 NFC系统模块将分发ACTION_TAG_DISCOVERED通知给注册了对该通知感兴趣的目标Activity。
            • 3)ACTION_TAG_DISCOVERED:如果目标NFC Tag不属于表8-12中的一种,则NFC系统模块将发送ACTION_TAG_DISCOVERED Intent并携带一个Tag对象传递给感兴趣的Activity。Activity将根据Tag的ID(调用Tag的getId函数)或该Tag使用的技术(调用Tag的getTechList)来创建合适的处理对象。
      • 2.NFC P2P模式示例
        Android平台中的NFC P2P模式使用了前文介绍的SNEP协议。在SNEP协议基础上,Android设计了"Android Beam"技术架构,该架构使得NFC客户端程序能非常容易得在两个NFC设备间传递NDEF消息。
      • 3.NFC CE模式示例

        NFC(Near Field Communication,近场通信)相关


        使用NFC CE的应用必须通过<uses-permission>标签申明"android.permission.NFC"权限。同时还需通过<uses-library>申明使用动态库"com.android.nfc_extras"。这样,当应用程序运行时,系统会为它加载com.android.nfc_extras.jar包。该包对应的文件位于/system/framework目录下
    • NFC系统模块
      Android平台中,NFC系统模块运行在com.android.nfc进程中,该进程对应的应用程序文件名为Nfc.apk·NFC系统模块的核心NfcService和一些重要成员的作用及之间的关系。·R/W模式下NFC Tag的处理。·Android Beam的实现。·CE模式相关的处理。​
      • 1.NfcService介绍

        NFC(Near Field Communication,近场通信)相关

        NFC(Near Field Communication,近场通信)相关


        Nfc.apk源码中包含一个NfcApplication类。当该应用启动时,NfcApplication的onCreate函数将被调用。正是在这个onCreate函数中,NFC系统模块的核心成员NfcService得以创建
        • NFC系统模块核心成员
          • (1)NfcService核心成员

            NFC(Near Field Communication,近场通信)相关

          • NativeNfcManager和NfcService类家族

            NFC(Near Field Communication,近场通信)相关


            Android NFC系统模块通过接口类DeviceHost和其内部的接口类LlcpServerSocket、DeviceHostListener、LlcpSocket、LlcpConnectionlessSocket、NfcDepEndpoint、TagEndpoint将NFC系统模块中和NFC芯片无关的处理逻辑,以及和芯片相关的处理逻辑进行了有效解耦。图8-36中以"Native"开头的类均定义在packages/app/Nfc/nxp目录下,所以它们和NXP公司的NFC芯片相关。DeviceHost接口中,DeviceHost类用于和底层NFC芯片交互,TagEndpoint用于和NFC Tag交互,NfcDepEndpoint用于和P2P对端设备交互,LlcpSocket和LlcpServerSocket分别用于LLCP中有链接数据传输服务的客户端和服务器端,LlcpConnectionlessSocket用于LLCP中无连接数据传输服务。另外,DeviceHostListener也非常重要,它用于NativeNfcManager往NfcService传递NFC相关的通知事件。例如其中的onRemoteEndpointDiscovered代表搜索到一个NFC Tag、onLlcpActivited代表本机和对端NFC设备进入Link Activation(链路**)阶段。NativeNfcManager实现了DeviceHost接口,以NXP公司的NativeNfcManager为例,它将通过libnfc_jni及libnfc和NXP公司的NFC芯片交互。NativeNfcSecureElement用来和Secure Element交互。
          • P2pLinkManager家族关系

            NFC(Near Field Communication,近场通信)相关


            P2pLinkManager家族关系非常复杂,图中的各成员说明如下。·P2pLinkManager包含三个和传输相关的Server,分别是SnepServer、NdefPushServer以及HandoverServer。每一个Server都定义了相关的回调接口类(如SnepServer.callback),这些回调接口类的实现均由P2pLinkManager的内部类来实现。·HandoverServer负责处理NFC Connection Handover协议,而具体的数据传输则由HandoverManager来实现。由图中HandoverMangar的mBluetoothAdapter可知,Android默认使用蓝牙来传输数据(提示:这部分内容请读者学完本章后自行研究)。·P2pEventManager用于处理NFC P2P中和用户交互相关的逻辑。例如当搜索到一个P2P设备时,手机将会震动并发出提示音。SendUi实现了类似图8-29左图的界面及用户触摸事件处理。在Android平台中,当两个设备LLCP链路被**时,SendUi将显示出来。其界面组成部分包括两个部分,一个是SendUi界面显示之前手机的截屏图像,另外一个是“触摸即可发送”的文本提示信息。当用户触摸SendUi界面时,数据将被发送出去。
      • 2.NFC Tag处理流程分析
        • (1)notifyNdefMessageListeners流程
          当NFC设备检测到一个NFC Tag时,NativeNfcManager的notifyNdefMessageListeners函数将被调用(由libnfc_jni在JNI层调用)
        • (2)dispatchTagEndpoint流程
        • (3)NFC Tag处理流程总结

          NFC(Near Field Communication,近场通信)相关

      • 3.Android Beam工作流程分析
        • (1)notifyLlcpLinkActivation流程

          NFC(Near Field Communication,近场通信)相关

        • (2)Beam数据发送流程

          NFC(Near Field Communication,近场通信)相关

        • (3)Beam数据接收流程

          NFC(Near Field Communication,近场通信)相关

        • 4.CE模式
          ·通过NfcAdapterExtras为CE模式的客户端提供INfcAdapterExtras功能实现·当NFC设备进入CE模式后,和它交互的另一端是诸如NFC Reader这样的设备。此时对端发起一些操作,而NativeNfcManagement的一些回调函数将被触发。​
        • 5.Android中的NFC总结
  • NFC HAL层讨论
    Android在Hardward目录下为NFC定义了一个nfc.h头文件用于支持NFC HAL操作,但读者如果看过libnfc或libnfc-nci代码会发现,libnfc和libnfc-nci没有太多使用nfc.h定义的接口,而是大量引用各自公司定义的一套API。这种做法无可厚非,但它使得其他更上层的模块很难做到与底层平台或硬件解耦合。相信图8-26已经让读者直观感受到到这种做法恶果了
    • 当前知名的几个NFC HAL层实现

      NFC(Near Field Communication,近场通信)相关

    • 未来Linux系统中,NFC整个软件架构将变成如图

      NFC(Near Field Communication,近场通信)相关


      用户空间运行一个名为neard的NFC Daemon进程,它通过AF_NFC socket以及Generic Netlink机制和内核空间的NFC子系统通信。neard通过不同的插件来支持NFC的协议,例如Handover、NPP、SNEP等。内核空间中,NFC子系统包括Control Command Handler、LLCP Handler、Raw Data Handler以及Core等核心模块。