[NFC]LLCP协议介绍-程序员宅基地

技术标签: NFC  



       依照学习流程,此章节主要介绍NFCForum中LLCP Spec。主要是将LLCP spec中重要的内容摘要出来,包含的内容肯定不是很全面,但基本上看代码是够用了。主要分为三部分:

        1.LLC概述

        2.LLC协议

        3.LLCP链路

 

1     LLC概述

        LLC:(logicallink control)按照网络协议的层次划分,就是其中的数据链层,用图表表示如下:


        依据数据传输模式,可以划分为:

        1.      面向连接传输

        2.      无连接传输


        依据连接的种类分:

        Class1:无连接传输

        Class2:面向连接传输

        Class3:无连接传输和面向连接传输

 

2     LLC协议

        由于LLCP Spec有49页,目前研究的是1.2版本,主要从以下几个方面进行解读:

 

2.1   LLC封包格式:

2.1.1   服务访问点(Service AccessPoint)

        其中服务访问点(Service Access Point)表征不同的服务,具体说明如下:

        细化00h-0Fh如下:

                00h:用于LLC管理模块,不能用于任何SAP

                01h:用于服务发现协议(Service Discovery Protocol),对应服务名urn:nfc:sn:sdp

                04h:用于SNEP协议(Simple NDEF ExchangeProtocol),对应服务名:urn:nfc:sn:snep

2.1.2   类型PTYPE

        其中PTYPE表征当前信息的类型,为较好说明问题,简单整理如下:

PDU TYPE

PTYPE

EXPLAIN

SEQUENCE

INFORMATION

SYMM

0000

可用于防止link timeout

X

X

PAX

0001

交换参数信息

X

V

AGF

0010

将数据拆包后发送,至少需要2个PDU

X

V

UI

0011

无编号信息

X

V

CONNECT

0100

连接请求

X

V

DISC

0101

断开连接

X

X

CC

0110

连接完成,信息域含有参数信息

X

V

DM

0111

断开模式,在CONNECT命令无法执行时回复,并且带有REASON字段

X

V

FRMR

1000

拒绝,会带flag说明拒绝原因

X

V

I

1100

有效信息,含N(S),N(R)

V

V

RR

1101

可以接收数据

V

X

RNR

1110

暂时无法接受数据

V

X

SNL

1001

服务名查询

X

V

        备注: X表示不含此field,V表示含有此field


每种TYPE的封包格式如下:

SYMM:


PAX:


AGF:


UI:


CONNECT:


DISC:

CC:

DM:

其中DM的reason字段说明如下:

       FRMR:

其中information字段说明

       I:

       RR:


       RNR:

SNL:



2.1.3   信息域(Information)

        介绍完PTYPE,就到Information域中的说明了,所有information中的信息都遵循TLV格式(type,length,value),spec整理了下面的table方便大家了解:


       同样,针对上面的名称,分别说明其格式:

VERSION:

MIUX:当information中的长度大于默认值128时,系统会发送IMUX给对方告知自身能力,对方会依据IMUX+128计算出实际接收的容量

WKS:依据SAP中00h-0Fh定义,每bit对应一个sap

LTO:默认为100ms,单位是10ms,表征上次收到数据和此次发送数据的时间差

RW:默认为1,表示每个I PDU都要回复,0表示不接收I PDU

SN:格式为“urn:nfc:sn:<servicename>”/“urn:nfc:xsn:<domain>:<sn>”

OPT:表征link service class(低2位)或其他(高6位)

SDREQ:

SDRES:

 

3     LLCP链路

        此部分详细过程请参考Spec第五章,抽取主要部分说明一下。


3.1   MIU说明

        MIU默认值是128,发送端的信息域大小不应该大于接收端的MIU,接收端收到大于自身MIU的数据时会直接丢弃。双方各自维护自己和对方的MIU,默认值为128,且满足MIUX+128=MIU。若收到对方的MIUX,保存对应的MIU信息。


3.2   链路激活流程

        当MAC层激活完成,并判断出对端节点带LLCP能力时,就会来建立LLCP连接。MAC层中交换的LLC参数,对于LLCP过程是可见的。

        在LLCP链路建立过程中,会先进行version判断

                1.      Version判断失败,则连接过程直接断开

                2.      Version检查成功,继续进行MIU的检查,最后链路才建立完成


3.3   PAX流程

        MAC层会知道当前的设备角色是Initiator/Target:

        1.      Target

                a)       发送MAC中还未交换的parameter信息,等待对方回复

                b)       收到回复,启动Version判断

                c)       Version通过,决定MIU,否则连接失败

        2.      Initiator

                a)       等待对方先发送PAX

                b)       Version检查通过,决定MIU,并发送PAX PDU


3.3.1   Version检查

        其中Version检查的流程如下:

        1.      Major&Minor 都相等  -> OK

        2.      Major相等,Minor不等,取Minor较小的版本  -> OK

        3.      Major&Minor都不相等,由major大的一端决定是否兼容,若兼容,使用Major小的版本


3.4   Intentional Link Deactivation

        当DISC PDU中的SSAP和DSAP为00h时,发送端发送后,直接断开本地连接,接收端收到后,也可以直接断开本地连接。此类DISC PDU(SSAP和DSAP为00h)不需要等待回复,但其他的DISC PDU(SSAP和DSAP不为00h)需要等待DM PDU。


3.5   链路建立流程

        在发送端发送CONNECT PDU,此类PDU(SSAP相同)不能在未收到CC/DM时重复发送。同时,收到CC PDU时,DSAP可能和CONNECT PDU中SSAP会不一致。


        此时分两种情况:

        Case1:发送端收到CC PDU,但未收到CONNECT的ACK时:

                I. CC中DSAP和CONNECT中SSAP相等

                        *初始化V(S),V(R),V(SA),V(RA)为0

                        *处理CC PDU中的参数

                        *进入数据传输阶段

                II. CC中DSAP和CONNECT中SSAP不相等

                        *直接放弃连接


        Case2:接收端收到CONNECT PDU时:

                I.  无法处理时,返回DM PDU

                II.  可处理时

                        *处理CONNECT PDU中的参数

                        *通知上层,并等待上层接收或者拒绝

                                >拒绝时,直接放弃连接,并发送DM

                                >接受时,发送CC PDU,V(S),V(R),V(SA),V(RA)为0并开始数据传输

       需要注意的是,在数据传输阶段,任何的CONNECT/CC PDU都会被认为是Invalid。


3.6   服务发现(Service Discover)

        SDREQ一般是出现在SNL PDU中。收到SDREQ后,需要先判断Service Name是否有注册,注册过则回复SDRES,其中含有效SAP及TID,未注册时,回复SDRES中SAP为全0。

 



        以上是该Spec大致的内容,基本上可以涵盖Android NFC中LLCP的流程。如果有描述不正确的地方,也欢迎大家指正,感谢。

       依照学习流程,此章节主要介绍NFCForum中LLCP Spec。主要是将LLCP spec中重要的内容摘要出来,包含的内容肯定不是很全面,但基本上看代码是够用了。主要分为三部分:

        1.LLC概述

        2.LLC协议

        3.LLCP链路

 

1     LLC概述

        LLC:(logicallink control)按照网络协议的层次划分,就是其中的数据链层,用图表表示如下:


        依据数据传输模式,可以划分为:

        1.      面向连接传输

        2.      无连接传输


        依据连接的种类分:

        Class1:无连接传输

        Class2:面向连接传输

        Class3:无连接传输和面向连接传输

 

2     LLC协议

        由于LLCP Spec有49页,目前研究的是1.2版本,主要从以下几个方面进行解读:

 

2.1   LLC封包格式:

2.1.1   服务访问点(Service AccessPoint)

        其中服务访问点(Service Access Point)表征不同的服务,具体说明如下:

        细化00h-0Fh如下:

                00h:用于LLC管理模块,不能用于任何SAP

                01h:用于服务发现协议(Service Discovery Protocol),对应服务名urn:nfc:sn:sdp

                04h:用于SNEP协议(Simple NDEF ExchangeProtocol),对应服务名:urn:nfc:sn:snep

2.1.2   类型PTYPE

        其中PTYPE表征当前信息的类型,为较好说明问题,简单整理如下:

PDU TYPE

PTYPE

EXPLAIN

SEQUENCE

INFORMATION

SYMM

0000

可用于防止link timeout

X

X

PAX

0001

交换参数信息

X

V

AGF

0010

将数据拆包后发送,至少需要2个PDU

X

V

UI

0011

无编号信息

X

V

CONNECT

0100

连接请求

X

V

DISC

0101

断开连接

X

X

CC

0110

连接完成,信息域含有参数信息

X

V

DM

0111

断开模式,在CONNECT命令无法执行时回复,并且带有REASON字段

X

V

FRMR

1000

拒绝,会带flag说明拒绝原因

X

V

I

1100

有效信息,含N(S),N(R)

V

V

RR

1101

可以接收数据

V

X

RNR

1110

暂时无法接受数据

V

X

SNL

1001

服务名查询

X

V

        备注: X表示不含此field,V表示含有此field


每种TYPE的封包格式如下:

SYMM:


PAX:


AGF:


UI:


CONNECT:


DISC:

CC:

DM:

其中DM的reason字段说明如下:

       FRMR:

其中information字段说明

       I:

       RR:


       RNR:

SNL:



2.1.3   信息域(Information)

        介绍完PTYPE,就到Information域中的说明了,所有information中的信息都遵循TLV格式(type,length,value),spec整理了下面的table方便大家了解:


       同样,针对上面的名称,分别说明其格式:

VERSION:

MIUX:当information中的长度大于默认值128时,系统会发送IMUX给对方告知自身能力,对方会依据IMUX+128计算出实际接收的容量

WKS:依据SAP中00h-0Fh定义,每bit对应一个sap

LTO:默认为100ms,单位是10ms,表征上次收到数据和此次发送数据的时间差

RW:默认为1,表示每个I PDU都要回复,0表示不接收I PDU

SN:格式为“urn:nfc:sn:<servicename>”/“urn:nfc:xsn:<domain>:<sn>”

OPT:表征link service class(低2位)或其他(高6位)

SDREQ:

SDRES:

 

3     LLCP链路

        此部分详细过程请参考Spec第五章,抽取主要部分说明一下。


3.1   MIU说明

        MIU默认值是128,发送端的信息域大小不应该大于接收端的MIU,接收端收到大于自身MIU的数据时会直接丢弃。双方各自维护自己和对方的MIU,默认值为128,且满足MIUX+128=MIU。若收到对方的MIUX,保存对应的MIU信息。


3.2   链路激活流程

        当MAC层激活完成,并判断出对端节点带LLCP能力时,就会来建立LLCP连接。MAC层中交换的LLC参数,对于LLCP过程是可见的。

        在LLCP链路建立过程中,会先进行version判断

                1.      Version判断失败,则连接过程直接断开

                2.      Version检查成功,继续进行MIU的检查,最后链路才建立完成


3.3   PAX流程

        MAC层会知道当前的设备角色是Initiator/Target:

        1.      Target

                a)       发送MAC中还未交换的parameter信息,等待对方回复

                b)       收到回复,启动Version判断

                c)       Version通过,决定MIU,否则连接失败

        2.      Initiator

                a)       等待对方先发送PAX

                b)       Version检查通过,决定MIU,并发送PAX PDU


3.3.1   Version检查

        其中Version检查的流程如下:

        1.      Major&Minor 都相等  -> OK

        2.      Major相等,Minor不等,取Minor较小的版本  -> OK

        3.      Major&Minor都不相等,由major大的一端决定是否兼容,若兼容,使用Major小的版本


3.4   Intentional Link Deactivation

        当DISC PDU中的SSAP和DSAP为00h时,发送端发送后,直接断开本地连接,接收端收到后,也可以直接断开本地连接。此类DISC PDU(SSAP和DSAP为00h)不需要等待回复,但其他的DISC PDU(SSAP和DSAP不为00h)需要等待DM PDU。


3.5   链路建立流程

        在发送端发送CONNECT PDU,此类PDU(SSAP相同)不能在未收到CC/DM时重复发送。同时,收到CC PDU时,DSAP可能和CONNECT PDU中SSAP会不一致。


        此时分两种情况:

        Case1:发送端收到CC PDU,但未收到CONNECT的ACK时:

                I. CC中DSAP和CONNECT中SSAP相等

                        *初始化V(S),V(R),V(SA),V(RA)为0

                        *处理CC PDU中的参数

                        *进入数据传输阶段

                II. CC中DSAP和CONNECT中SSAP不相等

                        *直接放弃连接


        Case2:接收端收到CONNECT PDU时:

                I.  无法处理时,返回DM PDU

                II.  可处理时

                        *处理CONNECT PDU中的参数

                        *通知上层,并等待上层接收或者拒绝

                                >拒绝时,直接放弃连接,并发送DM

                                >接受时,发送CC PDU,V(S),V(R),V(SA),V(RA)为0并开始数据传输

       需要注意的是,在数据传输阶段,任何的CONNECT/CC PDU都会被认为是Invalid。


3.6   服务发现(Service Discover)

        SDREQ一般是出现在SNL PDU中。收到SDREQ后,需要先判断Service Name是否有注册,注册过则回复SDRES,其中含有效SAP及TID,未注册时,回复SDRES中SAP为全0。

 



        以上是该Spec大致的内容,基本上可以涵盖Android NFC中LLCP的流程。如果有描述不正确的地方,也欢迎大家指正,感谢。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010025003/article/details/72354447

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签