很多同学在学习NFC协议的时候,觉得NFC的规范从底层到上层的应有尽有,有点无处下手的感觉。这里就和大家分享下我曾经学习NFC规范的经验。如果有不对的地方,也请各位同学批评指正。NFC Forum中有一个所有规范的列表,可以看到目前绝大部分的规范都已经正式发布了,当然了虽然是正式发布了,但是NFC FORUM还在不停的bug fix。表里面并没有列出NFC FORUM的一些新项目,如NCI NG和Wireless charging等。

  在对NFC的某一个规范进行学习之前,首先要对NFC规范的整体架构有一个大致的了解,这样的话,才能从整体上进行把握。这里引用了NFC FORUM中一个公开文档中的三个架构图。NFC有三种工作模式,读卡器(R/W),卡模拟(CE)和点对点(P2P),那么这三种模式也对应着不同的协议架构,这个其实与蓝牙中的profile很类似,即针对不同的应用,有不同的协议组合。

读卡器模式或读写模式

  Analogue,也就是NFC物理层的协议,主要定义了NFC设备的射频特性,如射频场的波形、强度等。

  Digital Protocol数字协议。实际上这里就可以把它理解成NFC的MAC层协议,它定义了三种NFC技术,NFC-A/B/F,分别对应着ISO14443 TYPEA、TYPEB以及Felica的规范,其中包括了初始化、冲突检测等。同时它也定义了传输协议,如NFC-DEP,ISO-DEP等。这个数字协议实际上就是ISO/IEC14443, ISO18092的一个合体(ISO-DEP基于ISO 14443, NFC-DEP基于18092)。

  这里要说明一下,在这个架构图中其实还有一个Activity的规范,它可以说是Digital的一个补充。Digital中定义了帧格式,编码等通信的功能,但是如何使用Digital中的定义的帧来完成通信,则是在Activity规范中定义的。Activity中定义了一大堆的流程图及状态转移图,用来描述Digital规范中的内容是如何工作的,这样看来其实Acitivity规范也应该就是Digital中的一部分。

  以上这三个协议是NFC通信的基础,在NFC的三种模式下,都要使用这三个底层的协议。可以说这三个协议是整个NFC通信的基础,掌握了这三个协议可以说对于NFC的理解就成了一半。当然这也是NFC中阅读起来最难的三个协议,当然了如果你对ISO14443/18092有了解的话,理解起来就比价轻松了,毕竟这些底层协议与非接触卡规范是一脉相承的。

  TYPE1-4 TAG OPERATION: 定义了如何从TYPE1/2/3/4中读写NDEF消息。这里TYPE1/2对应着ISO14443TYPEA,而TYPE3对应着SONY的Felica,TYPE4是一个开放的TAG标准,即ISO14443 TYPEA TYPEB和ISO 7816-4;

  NDEF REFERENCE APPLICATION:是NFC Forum的RAF工作组定义的一些应用规范,这些应用规范并不是强制性的,主要是提供一些参考,但实际上很多厂家都会使用RAF提供的参考规范来开发应用,比如说连接切换(Connection handover)用于NFC为蓝牙或WIFI进行连接的建立。 
  Third Party NDEF Application:是由第三方开发的基于NDEF消息的应用。
  NON-NDEF Application:如果不是基于NDEF的应用,实际上就是直接调用Digital协议进行应用数据的封装,即将应用数据直接映射到Digital中定义的帧格式中。
对点模式

  Analogue/Digital/Activity上面已经介绍过了。

  LLCP:既然是P2P连接,那么必然就牵涉到逻辑链路的管理,所以需要一个LLCP,用于链路的创建、拆除、维护等功能,同时还提供面向连接和无连接的服务等。 
  Simple NDEF Exchange protocol(SNEP:在P2P模式下定义了如何进行NDEF消息的交互。SNEP的通信模式就是请求/响应模式,及initator向Target发送SNEP request,Target向Initiator回应SNEP Response消息。SNEP的请求和响应消息中包含了NDEF格式的数据。这里对NDEF做一个简单的说明,其实NDEF应该是做上层应用的开发人员直接面对的,如在ANDROID中,基于Framework中的NFC API很多都是与NDEF格式相关的。NDEF其实就是NFC Forum中定义的一种标准的消息格式,不仅用在了P2P中,也用在了读卡器模式中。NDEF是由RECORD(RTD, 记录)组成的,真正的用户数据就是存放在RTD中的。NFC FORUM定义了不同的RTD规范,如TEXT, URI,Signature等等。注意一点,在这P2P的图和R/W的图中,并没有显示的描述NDEF规范。 
  Protocol Bindings,这里NFC FORUM提了两个规范一个是OBEX的映射,另一个是IP协议的映射,是将这些协议能够映射到LLCP协商中。但是在NFC FORUM中,最终取消这两个协议,是因为这两个协议并没有起到任何作用。这些都会在以后给大家介绍。
卡模拟模式: 
  从协议架构上来说,这个架构确实是这样的,貌似是比较简单的,但是个人感觉卡模拟模式还是蛮复杂的,因为随着SE(安全单元,之前也称为NFCEE)及NCI规范的引入,不仅SE可以模拟成卡、DH(主机)和NFCC(NFC控制器)也都可以模拟成卡。这在以后的介绍中也也会向大家说明。
 
  介绍完基本的NFC协议框架后,这里简单的提一下NCI规范,全称NFC Controller interface,主要的作用是将DH(Device host,主机,在手机中可以看做是手机的AP)和NFCC(可以看做手机中的NFC芯片,如PN544等)之间的消息标准化,让我们的手机CPU不用对每一个厂家的NFC芯片都做适配,只要CPU和NFC芯片都遵守NCI规范就可以了,当然了NFC芯片的驱动还是要适配的,呵呵。了解蓝牙的同学应该很容易理解,这就是蓝牙规范中的HCI接口,它们的设计理念是一致的。据说,Google正在为Android开发NCI。
 
 
 
 
 

1.1   操作模型

  最重要的NFC与操作模型相关的标准是NFCIP-1和NFCIP-2

  NFCIP-1整合了两个RFID通讯协议:MIFARE和FeliCa,扩充了新的通讯可能性和新的传输协议。NFCIP-2整合了NFC中RFID读取者的功能。这是NFC与大多数RFID设备相兼容的方式。

RFID有严格的一个或多个被动组件(tags)和一个主动组件(reader),NFC打破这种观点。对于NFC设备而言,它可以与其它每一个组件通讯,包括标签和读者/写者。为了保证这种方式,NFC论坛定义了如下几种操作模型:点对点模型(Peer to Peer Mode),读者/写者模型(Reader/Writer Mode)和卡模拟模型(Card Emulation Mode)。系统综述在图1中给出,根据算法决定使用哪种模式,获取其它在NFCIP-2中定义范围内的NFC设备的信息。

  鉴于大多数RFID读者被设计成只有主动设备的范围内,对于NFC设备,假设这个是不可取的,因此要用到碰撞避免(collision avoidance)。作为适当的可用性,设备识别的速度保持在200ms以上。很多NFC设备是移动的拥有有限的电量,高速的识别跟耗能。这将一直有一个折衷在快速识别和能量消耗之间。

1.1.1 点对点模式

  点对点模式能够在两台NFC设备之间通讯。开始通讯的设备称作发起者(Initiator),另外一个称作目标(Target)。

  点对点模式的协议栈与OSI Reference Model很相似,但是点对点模式只有4层:物理层(Physical),媒体接入控制层(Media Access Control),逻辑链路控制层(Logical Link Control)和应用层(Application)。物理层和应用层与OSI Reference Model一样。MAC和LLC组成数据链路层,如图-2所示。物理层和MAC层在NFCIP-1中定义,LLC层是NFC论坛定义的技术规范。

主动通讯模式和被动通讯模式在NFCIP-1中是有差别的:

  “在主动通讯模式中,发起者和目标共享他们自己的RF域来实现通讯,发起者开始NFCIP-1通讯,目标在主动通讯模式中使用自生RF域中的调制来响应一个发起者的命令。”

  “在被动通讯模式中,发起者产生RF域并开始通讯,目标在被动通讯模式使用负荷调制方案来响应发起者命令。”

  这两种模式的主要区别是发起者和目标的能量消耗。在主动通信模式中产生RF域的能量是有发起者和目标共同承担的,而在被动的沟通模式中发起者必须供应产生域所需要的能量。

  为了保证完整的通讯,NFCIP-1定义了如下协议流:在默认情况下,所有的设备应该保存在目标模式,不产生RF域。只有在响应应用和应用定义使用主动或被动通讯模式时设备才切换为发起者模式。发起者在产生RF域之前必须检查是否有其它活跃发送者保证没有其它通讯被干扰。如果没有其它RF域被检查到,发起者就开始通讯并通知目标使用主动或被动通讯模式和传输速度。在通讯结束,两个设备都要切回到目标模式并且停用他们的RF域。

  在MAC层,只有发起者能开始数据传输,LLCP保证异步平衡模式(ABM)。此外目标能够启动一个数据发送和错误恢复。LLCP能够管理多个应用在同一时刻多点接入的多路技术。它提供了一个用最少的协议开销的连接传输协议,高层协议使用的流量控制机制。也提供面向连接的传输协议,它保证数据单元的逐一传送。LLCP不提供安全的数据传输模式。

1.1.2       读者/写者模式

  读者/写者模型允许NFC设备与NFC论坛标签通讯。这些标签是典型的被动组件。因此,这种模式也被称为被动模式。这些标签出现在海报或其它地方,它们通过被NFC设备扫描将所存储的设备传送给NFC设备。他们能包含单一信息(例如网络地址)或者在设备上执行活动(例如连接无线网络)。这种模式完全兼容ISO/IEC 14443和FeliCa技术,正因为这样,所以NFC设备能够当作读者/写者在存在RFID基础设施。NFC论坛不包含附近系统(Vicinity systems)到读者/写者模式,但是NFCIP-2包含。

1.1.3       卡模拟模式

  可选的卡模拟设备允许NFC设备与已知的RFID读者通讯。这些设备可以模拟一个或多个RFID智能卡。这种模式是有可能的使用现有的非接触式的基础设施,例如:支付或接入控制。智能卡的模拟可以用于应用或在称作安全元件(Secure Element)。安全元件像真实智能卡的设备,只是作为NFC设备传输数据的接口。

  与读者/写者模式结合,有可能实现与点对点模式相似的模式,但是这样更简单,因为不需要在点对点模式中的协议栈。与正确的硬件实现就可能使用这种模式即使NFC设备切断或者缺少能量

 
 
 
 
 
 
 

NFC协议学习分享的更多相关文章

  1. python 学习分享-paramiko模块

    paramiko模块学习分享 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Solaris, BS ...

  2. Flink 从0到1学习—— 分享四本 Flink 国外的书和二十多篇 Paper 论文

    前言 之前也分享了不少自己的文章,但是对于 Flink 来说,还是有不少新入门的朋友,这里给大家分享点 Flink 相关的资料(国外数据 pdf 和流处理相关的 Paper),期望可以帮你更好的理解 ...

  3. python paramiko模块学习分享

    python paramiko模块学习分享 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Sola ...

  4. ElasticSearch 5学习(7)——分布式集群学习分享2

    前面主要学习了ElasticSearch分布式集群的存储过程中集群.节点和分片的知识(ElasticSearch 5学习(6)--分布式集群学习分享1),下面主要分享应对故障的一些实践. 应对故障 前 ...

  5. ElasticSearch 5学习(6)——分布式集群学习分享1

    在使用中我们把文档存入ElasticSearch,但是如果能够了解ElasticSearch内部是如何存储的,将会对我们学习ElasticSearch有很清晰的认识.本文中的所使用的ElasticSe ...

  6. TCP/IP协议学习(五) 基于C# Socket的C/S模型

    TCP/IP协议作为现代网络通讯的基石,内容包罗万象,直接去理解理论是比较困难的:然而通过实践先理解网络通讯的理解,在反过来理解学习TCP/IP协议栈就相对简单很多.C#通过提供的Socket API ...

  7. http协议学习系列

    深入理解HTTP协议(转)  http://www.blogjava.net/zjusuyong/articles/304788.html http协议学习系列   1. 基础概念篇 1.1 介绍 H ...

  8. BGP协议学习总结

    BGP学习总结 BGP是目前使用的唯一的自治系统间的路由协议,它是一种矢量路由协议,基于TCP的179号端口,它采用单播增量更新的方式更新路由,与其他的路由协议不同的是,BGP只要TCP可达,就可以建 ...

  9. TCP/IP协议学习之实例ping命令学习笔记

    TCP/IP协议学习之实例ping命令学习笔记(一) 一. 目的为了让网络协议学习更有效果,在真实网络上进行ping命令前相关知识的学习,暂时不管DNS,在内网中,进行2台主机间的ping命令的整个详 ...

随机推荐

  1. Primo Ramdisk配置教程

    首先感谢xiaohu在太平洋电脑网上发表的“将内存当硬盘用!Primo Ramdisk图文教程”,本文主要是将其图文整理了一下,以方便以后使用. 原文地址:http://fashion.pconlin ...

  2. Keil C51汉字显示的bug问题(0xFD问题)

    一.缘起 这两天改进MCU的液晶显示方法,采用“即编即显”的思路,编写了一个可以直接显示字符串的程序.如程序调用disstr("我是你老爸");液晶屏上就会显示“我是你老爸”. 二 ...

  3. Qt学习(四)—实例涂鸦画板mspaint

    一.Qt图形绘制 自己在Qt开源社区在自学yafeilinux前辈的<Qt快速入门系列教程>中的图形篇,结合所学的知识,可以做一个涂鸦板实例 二.实现涂鸦板 1.新建工程mspaint, ...

  4. C# Process类_进程管理器Demo

    Process用于管理计算机的进程,下面给出一个C#进程管理器的DEMO. namespace ProcessManager { public partial class Form1 : Form { ...

  5. Fatal error: Allowed memory size of 8388608 bytes exhausted

    这两天安装bugfree,更换了一个数据量较大的库,结果打开bug详情页要么是空白页,要么就报如题的错误,错误信息还包括C:\wamp\www\bugfree\Include\Class\ADOLit ...

  6. devStack

    1,devstack shell 脚本开源官网 http://devstack.org/ 脚本功能快速搭建 OpenStack 的运行和开发环境 [Note tips by Ruiy devstack ...

  7. PHP Database ODBC 之 ODBC

    ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数据库). 创建 ODBC ...

  8. php 中利用json_encode和json_decode传递包括特殊字符的数据

    </pre><span style="font-size:24px"></span><pre name="code" ...

  9. [英国][记录][战争中的世界:二战全史(26集)][BD-MKV/58G][中英双字][经典收藏]

    [英国][记录][战争中的世界:二战全史(26集)][BD-MKV/58G][中英双字][经典收藏] 原片名:The World at War  中文名:战争中的世界  导 演:Ted Childs, ...

  10. android 硬件解码学习

    FileInputStream in = new FileInputStream("/sdcard/sample.ts"); String mimeType = "vid ...