技术标签: NFC
依照学习流程,此章节主要介绍NFCForum中LLCP Spec。主要是将LLCP spec中重要的内容摘要出来,包含的内容肯定不是很全面,但基本上看代码是够用了。主要分为三部分:
1.LLC概述
2.LLC协议
3.LLCP链路
LLC:(logicallink control)按照网络协议的层次划分,就是其中的数据链层,用图表表示如下:
依据数据传输模式,可以划分为:
1. 面向连接传输
2. 无连接传输
依据连接的种类分:
Class1:无连接传输
Class2:面向连接传输
Class3:无连接传输和面向连接传输
由于LLCP Spec有49页,目前研究的是1.2版本,主要从以下几个方面进行解读:
其中服务访问点(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
其中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:
介绍完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:
此部分详细过程请参考Spec第五章,抽取主要部分说明一下。
MIU默认值是128,发送端的信息域大小不应该大于接收端的MIU,接收端收到大于自身MIU的数据时会直接丢弃。双方各自维护自己和对方的MIU,默认值为128,且满足MIUX+128=MIU。若收到对方的MIUX,保存对应的MIU信息。
当MAC层激活完成,并判断出对端节点带LLCP能力时,就会来建立LLCP连接。MAC层中交换的LLC参数,对于LLCP过程是可见的。
在LLCP链路建立过程中,会先进行version判断
1. Version判断失败,则连接过程直接断开
2. Version检查成功,继续进行MIU的检查,最后链路才建立完成
MAC层会知道当前的设备角色是Initiator/Target:
1. Target
a) 发送MAC中还未交换的parameter信息,等待对方回复
b) 收到回复,启动Version判断
c) Version通过,决定MIU,否则连接失败
2. Initiator
a) 等待对方先发送PAX
b) Version检查通过,决定MIU,并发送PAX PDU
其中Version检查的流程如下:
1. Major&Minor 都相等 -> OK
2. Major相等,Minor不等,取Minor较小的版本 -> OK
3. Major&Minor都不相等,由major大的一端决定是否兼容,若兼容,使用Major小的版本
当DISC PDU中的SSAP和DSAP为00h时,发送端发送后,直接断开本地连接,接收端收到后,也可以直接断开本地连接。此类DISC PDU(SSAP和DSAP为00h)不需要等待回复,但其他的DISC PDU(SSAP和DSAP不为00h)需要等待DM PDU。
在发送端发送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。
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链路
LLC:(logicallink control)按照网络协议的层次划分,就是其中的数据链层,用图表表示如下:
依据数据传输模式,可以划分为:
1. 面向连接传输
2. 无连接传输
依据连接的种类分:
Class1:无连接传输
Class2:面向连接传输
Class3:无连接传输和面向连接传输
由于LLCP Spec有49页,目前研究的是1.2版本,主要从以下几个方面进行解读:
其中服务访问点(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
其中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:
介绍完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:
此部分详细过程请参考Spec第五章,抽取主要部分说明一下。
MIU默认值是128,发送端的信息域大小不应该大于接收端的MIU,接收端收到大于自身MIU的数据时会直接丢弃。双方各自维护自己和对方的MIU,默认值为128,且满足MIUX+128=MIU。若收到对方的MIUX,保存对应的MIU信息。
当MAC层激活完成,并判断出对端节点带LLCP能力时,就会来建立LLCP连接。MAC层中交换的LLC参数,对于LLCP过程是可见的。
在LLCP链路建立过程中,会先进行version判断
1. Version判断失败,则连接过程直接断开
2. Version检查成功,继续进行MIU的检查,最后链路才建立完成
MAC层会知道当前的设备角色是Initiator/Target:
1. Target
a) 发送MAC中还未交换的parameter信息,等待对方回复
b) 收到回复,启动Version判断
c) Version通过,决定MIU,否则连接失败
2. Initiator
a) 等待对方先发送PAX
b) Version检查通过,决定MIU,并发送PAX PDU
其中Version检查的流程如下:
1. Major&Minor 都相等 -> OK
2. Major相等,Minor不等,取Minor较小的版本 -> OK
3. Major&Minor都不相等,由major大的一端决定是否兼容,若兼容,使用Major小的版本
当DISC PDU中的SSAP和DSAP为00h时,发送端发送后,直接断开本地连接,接收端收到后,也可以直接断开本地连接。此类DISC PDU(SSAP和DSAP为00h)不需要等待回复,但其他的DISC PDU(SSAP和DSAP不为00h)需要等待DM PDU。
在发送端发送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。
SDREQ一般是出现在SNL PDU中。收到SDREQ后,需要先判断Service Name是否有注册,注册过则回复SDRES,其中含有效SAP及TID,未注册时,回复SDRES中SAP为全0。
以上是该Spec大致的内容,基本上可以涵盖Android NFC中LLCP的流程。如果有描述不正确的地方,也欢迎大家指正,感谢。
文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib
文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang
文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些
文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器
文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距
文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器
文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn
文章浏览阅读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
文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql
文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...
文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120
文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数