L2CAP(Logical Link Control and Adaption Protocol),链路控制和适配协议,位于基带层之上,将基带层的数据分组交换以便于高层应用的数据分组格式,并提供复用和服务质量交换等功能。L2CAP屏蔽了低层传输协议中的许多特性,从而方便高层协议的开发。

1.L2CAP概述

  L2CAP处于链路控制协议之上,属于数据链路层。其采用协议复用、分段、重组和组抽象功能对上层协议提供面向连接和无连接数据服务。允许高层协议和应用发送和接受最大长度为64k字节的数据分组,也允许通过流控制和重传模式来进行每个信道的流控制和重传。L2CAP提供逻辑信道,叫做L2CAP信道,它通过ACL逻辑传输的支持映射到L2CAP逻辑链路。

1.1 L2CAP特征

L2CAP的功能要求包括协议/信道复用,分段和重组,每个信道的流控制、差错控制和组管理。

  下图表示了L2CAP层的结构,Channel manager(信道管理器)提供控制平面功能(Control Plane Function),并负责内部信令、L2CAP点对点信令以及它和高、低层之间的信令Retransmission(重传)Flow Control(流控制)块提供了每个信道的流控制和可选的重传应用。资源管理器负责提供对信道管理器、重传及流控制和流控制块,以及一些不需要重传和流控制服务的应用数据流的帧中继服务。它负责在低层接口提供的设备之上的和多路L2CAP信道有关的收发分组保持一致。

1.1.1 协议复用

  L2CAP必须能够区分高层协议,在信道建立时,协议复用功能用来发送请求来连接正确的上层协议;数据传输时,逻辑信道复用必须能够把用同一协议的不用几个高层实体区分出来。

1.1.2 分段与重组

  通过由资源管理器所提供的帧中继服务,在L2CAP层之上个人应用程序可以控制传输帧的大小。如果L2CAP控制了PDU的长度,那么就可为多路复用提供更好的服务,它提供下面的好处:

<1>分段将允许应用数据单元的交错,这样可以满足延时要求;

<2>在L2CAP控制了分组大小以后,内存和缓冲区管理就会变得更加简单;

<3>重传纠错更有效;

<4>减少丢失数据

<5>上层分组映射在低层分组中,并可以从底层分组中剥离出来。

  每个L2CAP信道的流控制,在同一个L2CAP逻辑链路上有几个数据流传输时,每个信道需要各自的流控制,L2CAP也对需要流控制的应用提供流控制。L2CAP连接建立过程,允许交换有关两蓝牙单元之间服务质量的信息。每个L2CAP设备必须监视由协议使用的资源并保证服务质量(QoS)的完整实现。

1.2 主要操作

  逻辑链路控制盒适配协议(L2CAP)是以信道概念为基础的。每个L2CAP信道的端点有信道标识符(Channel Identifier,CID)来表示。

1.2.1 信道标识符

  不同蓝牙设备的L2CAP层之间通信时,建立在逻辑链路的基础上,这些逻辑链路被称为信道(channel),每条信道的每个端点都被赋予了一个信道标志(Channel Identifier,CID)。CID是表示逻辑信道本地端设备的名字。从0x0001到0x003F的标志符保留用于特定的L2CAP功能,空标识符(0x0000)则定义为一个非法标识符,并且不得用于目标端,在本地设备与多个远端设备存在多个并发L2CAP信道的情况下,同一CID不得重新用作本地L2CAP信道端

  CID的分配与特定设备有关,一台设备可以独立于其他设备指定CID

L2CAP信道有三种类型:

  • 面向连接(Connection-Oriented,CO)信道,用于两个连接设备之间的双方通信;
  • 无连接(Connection-Less,CL)信道,用来向一组设备进行广播式的数据传输,为单项信道
  • 信令(Signaling)信道,用于创建CO信道。

1.2.2 设备间操作

  下图说明了不同设备之间的L2CAP实体间通信的使用方式。面向连接的数据信道提供了两设备间的连接,而CID则用于标识信道的每一端。。这些信道用于支持一个信道”组”,在该信道组里发送端CID用于表示一个或多个远程设备。

1.2.3 层间操作

  L2CAP的实施遵循下述总体体系结构,并可在高层协议和低层协议间传送数据。每个应用都必须支持一组用于L2CAP应用间通信的信令命令。L2CAP应用还应准备从底层接受某类型的事件,并可向高层发出事件

1.2.4 操作方式

L2CAP有三种不同的操作模式:

<1>基本L2CAP模式

<2>流控制模式

<3>重传模式

  模式的选择是通过配置过程完成的,默认模式是L2CAP模式。在流控制模式和重传模式下,双方传输的数据包都是编了号的。数据包中的序列号码用于控制缓冲。流控制模式下,丢失的数据包可以被检测出来,并通知对方丢失但不能重传重传模式下使用一个定时器,把需要重新传输的数据包发送过来,并确保所有的数据包发送给对方

2.数据分组格式

  L2CAP基于分组,但它实际上遵循的是一个基于信道的通信模型。一条信道代表远程设备上两个L2CAP实体间的一种数据流。信道可以是面向连接和面向无连接的。所有分组字段都采用小端字节命令。对应于三种信道类型,L2CAP有两种数据分组类型,一种用于CO信道,另一种CL信道,信令信道实际上使用的是CO信道的分组类型。三种信道的数据分组格式的信道ID不同。

2.1 面向连接信道

  在基本L2CAP模式下,面向连接信道上的L2CAP PDU也称作B-帧。如下图所示格式,

长度:2字节,指除了L2CAP报文头长度以外的信息净荷的大小,单位为字节,信息净荷的长度可以达65535个字节,长度字段用于重组时,并用于接收端重组后L2CAP分组的简单整数校验。

信道ID:2字节,用于标识分组的目标信道终端。

净荷信息:0~65535字节。净荷信息包含来自上层协议的净荷或者发送到上层协议的净荷。MTU的值在信道配置时确定,所支持的用于信道分组的MTU的最小值为48字节。

2.2 无连接数据信道

无连接数据信道上的L2CAP PDU也称作G-帧。

长度:2字节,信息净荷与PSM字段长度的和

信道ID:2字节,CL信道的ID固定为0x0002

协议/服务复用(PSM):2字节(最小)

信息净荷:0~65535字节。该信息净荷将分发到组中所有成员。

2.3 在重传/流控制模式下的面向连接信道

  为了支持流空和重传,在基本L2CAP头之外定义了协议元素的L2CAP PDU类型。在L2CAP实体之间,信息的传递用信息帧(I-帧),而使用监督帧(S-帧)来用作对I-帧的应答和请求重传。

2.3.1.L2CAP 头字段

长度:2字节,在L2CAP PDU的头两个字节包含了整个L2CAP PDU的长度字节信息,它所指明的长度包括长度和CID字段,对于I-帧和S-帧,长度字段包括控制、L2CAP SDU长度(当前的)、信息净荷字节和FCS的长度字节。如果存在L2CAP SDU长度字段,I-帧中的最大信息净荷字节长度为65529,如果不存在L2CAP PDU长度字段,则I-帧最大信息净荷字节长度为65531。

信道ID:2字节

2.3.2.控制字段(2字节)

控制字段定义了帧类型,包含可应用的序列号码,

信息帧格式:信息帧是用作在L2CAP实体之间传递信息的。每个信息帧都有一个TxSeq(发送序列号)RxSeq(接受序列号),这样可以对由数据链路层实体接收到的附加信息帧进行应答或者不应答。而重传位(R bit)决定信息帧是否重传。

信息帧中的SAR字段用来对分段和重组进行控制。L2CAP SDU长度字段指明了SDU的长度,包括所有分段的长度。

监督帧格式:用于对信息帧进行应答和请求重传。每个监督帧有一个RexSeq序列号码对数据链路层实体接收到的附加帧进行应答,和一个重传位(R Bit)来影响是否对信息帧进行重传。

监督帧类型:RR(Receice Ready)和REJ(Reject)。

Send Sequence Number—TxSeq(6位):用于对每个信息帧进行编号,来使能排序和重传。

Receive Sequence Number—RxSeq(6位):接收方用来对信息应答,REJ帧来请求重传指定序列号码的信息帧。

重传屏蔽位R(1位):

2.4 信令分组格式

2.5 配置参数选项

  选项和信息元素一样进行传输,它包括选项类型、选项长度和一个或多个选项数据段。

类型:1个字节

定义为要协商的参数,如果没能识别出选项,则由选项类型的最高位决定要采取的动作。

0:必须识别该选项,若无法识别则拒绝配置请求

1:若无法识别该选项则跳过该选项。

长度:1字节,定义选项净荷的字节数,无净荷的选项类型的长度值为0

选项数据:

取决于选项类型。

2.5.1 最大传输单位

表明发送方能接受的最大SDU大小,类型为0x01,净荷长度为2字节。净荷携带一两字节的MTU大小值为唯一信息单元,

2.5.2 刷新超时选项

用来通知对方发送者接收时所用刷新超时事件。刷新超时定义在基带中,其类型是0x02,2字节净荷。

刷新超时:表示以ms为单位的时间单元。它是一个不对称的值,请求发送者应该定义它的刷新时间值

2.5.3 服务质量选项

服务质量QoS选项说明与1363类似的流控制规范,QoS默认参数为0x03。

2.5.4重传和流控制选项

表明是否使用重传和流控制,

模式:1字节

2.6 状态机

CLOSED--信道没有连接

WAIT_CONNECT--接收到了一个连接请求,但是只能连接应答中标志状态为”Pending(未觉的)”

WAIT_CONNECT_RSP--发送了一个连接应答,等待确认连接应答。

CONFIG--不同的选项在双方进行配置

OPEN--数据用户传输状态

WAIT_DISCONNECT—发送了一个断开连接请求,等待断开连接应答。

2.7 L2CAP常规操作流程

2.7.2 分段和重组

  分段就是把PDU分解成小块,然后把这些小块通过L2CAP传输到下层重组就是通过对一个个分段进行重装来重新组成PDU,然后传输给上层。分段和重组可以用到任何类型L2CAP PDU。

1.分段

协议在基带净荷(帧头部)中定义了两位的LLID位,来通知接收方该分组是L2CAP PDU的开始或后续分段,10表示开始分段,01表示后续分段。

2. L2CAP PDU的重组

链路控制协议试图按顺序传输ACL分组,并使用16位的CRC来保护数据的完整性。在基带检测到错误的时候,就使用自动重传请求方案。L2CAP层应该使用在L2CAP PDU头中的长度字段来校验判断,如果长度不匹配,则要丢弃该L2CAP PDU。如果信道可靠性要求不高,则应该缺省地丢弃长度不匹配分组。

2.7.3 服务数据单元的封装

  服务数据单元(SDU)是L2CAP和上层协议之间交换的数据格式,它是上层协议传给L2CAP层的数据或者L2CAP要传送给上层的数据。

  在基本的L2CAP模式下,每个SDU被封装在一个最小的L2CAP协议元素中,形成的L2CAP  PDU叫做基本信息帧(B-frame)

  分段和重组操作只用在重传模式和流控制模式下。SDU被分段成一个个小的SDU段,然后每个段用L2CAP协议封装成L2CAP PDU,这种PDU叫做信息帧(I -frame)最大PDU负荷长度(MPS)定义了一个SDU分段的最大长度。MPS可以通过一个特定的接口通知上层。

1.L2CAP SDU的分组

在流控制或重传模式下,SDU被分段,然后单独用L2CAP协议封装(加头和长度元素)形成I-帧,头包括2bit的SAR段,用于确定该I-帧是原来SDU的开始或后续或是一个没经过分段的SDU。

2.L2CAP SDU的重组

接收方根据接收到的I-帧的SAR字段来进行重组过程。根据L2CAP SDU的长度字段和序列号码以确定那些SDU丢失了。

2.8 流控制和重传模式

2.9 L2CAP PDU数据分析

L2CAP_PDU根据信道的不同分为CO信道的L2CAP_PDU、CL信道的L2CAP_PDU信令信道L2CAP_PDU三种不同的PDU格式,传输过程中通过信道标识符区分。

对比三种PDU格式,他们的区别在于信道ID,这里的CID是表示对方的CID,

对于一个具体数据分组,可据其第三、四个字节来确定数据结构属于哪个信道的PDU。

<1>CID为0x0001,属于L2CAP_PDU。

代码是表示不同的信令命令,ox01~0xB共11种命令,标识符是应答命令和请求命令的匹配标识。长度代表后面数据的字节数。,根据代码的不同,可以找出不同的命令,然后根据不同命令所特有的格式和含义知道代码的含义。

<2>CID:0x0002,则属于CL信道的L2CAP_PDU。根据前面的CL信道的L2CAP_PDU标志图,可以获取其数据长度(第一,二字节),PSM代表所复用的协议,大于等于2字节,以最低字节的最低位为1,最高字节的最低位为0来表示,根据PSM取值,PSM小于0x1000,则其为SDP,0x0003则为RFCOMM,0x0005对应于TCS;PSM大于等于0x1000,则为动态分配并与SDP一同使用。

<3>CID为0x0040~0xFFFF

蓝牙—逻辑链路控制和适配协议(L2CAP)的更多相关文章

  1. BLE 5协议栈-逻辑链路控制与适配协议层(L2CAP)

    文章转载自:http://www.sunyouqun.com/2017/04/page/2/ 逻辑链路控制与适配协议通常简称为L2CAP(Logical Link Control and Adapta ...

  2. 树莓派开发笔记(十一):蓝牙的使用,BlueZ协议(双树莓探测rssi并通过蓝牙互传获取的rssi信号强度)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/110940484长期持续带来更多项目与技术分享, ...

  3. 蓝牙接收苹果手机通知 ANCS协议分析

    蓝牙接收苹果手机通知 ANCS协议分析 转载,请注明出处:http://www.cnblogs.com/alexcai/p/4321514.html 综述 现在有许多蓝牙手表.手环都能接收苹果ipho ...

  4. 第13节-BLE协议L2CAP层

    学习资料:官方手册 Vol 3: Core System Package [Host volume] Part A: Logical Link Control and Adaptation Proto ...

  5. 蓝牙(Bluetooth) IEEE 802.15.1 协议学习

    catalogue . 蓝牙概念 . 配对和连接 . 机密安全性 . 蓝牙协议分类 . 蓝牙协议栈 1. 蓝牙概念 蓝牙(Bluetooth)是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网 ...

  6. 蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)(转载)

    一.主机控制接口协议  HCI 蓝牙主机-主机控模型 蓝牙软件协议栈堆的数据传输过程: 1.蓝牙控制器接口数据分组:指令分组.事件分组.数据分组(1).指令分组 如:Accpet Connection ...

  7. Bluedroid: 蓝牙协议栈源码剖析

    一. 基础知识介绍 1.缩略语 BTIF: Bluetooth Interface BTU : Bluetooth Upper Layer BTM: Bluetooth Manager BTE: Bl ...

  8. BLE低功耗蓝牙关键技术解析与应用

    BLE基础知识 1.传统蓝牙的传输距离几十米到几百米不等,BLE 则规定为 100 米(实际上没有那么远,50米以内比较稳定,和设备发射功率有关) 2.为了实现极低的功耗,BLE 协议设计为:在不必要 ...

  9. BLE Mesh网络协议综述

    0 引言 自2012年蓝牙4.0规范推出之后,全新的蓝牙低功耗(BLE)技术由于其极低的运行和待机功耗.低成本和跨厂商互操作性,3 ms低延迟.AES-128加密等诸多特色,可以用于计步器.心律监视器 ...

随机推荐

  1. Loadrunner 关联 web_custom_request综合实例

    Loadrunner 关联 web_custom_request综合实例 Loadrunner 关联web_custom_request,针对自带的订票系统的一个综合实例,相信看了本文大家对学习loa ...

  2. mysql ODBC 在64位下提示找不到odbc驱动问题

    在64位机器上,如果你想要连接32位mysql ,一般会安装mysql connector/ODBC 64位,并在配置ODBC数据源测试中连接正常,但在程序连接,如ASP.asp.net.VB.Del ...

  3. pda完美结合开销售单据haohantech-安卓打票扫描PDA智能POS 发展现状如何,会取代传统电脑 代替手工开单 么?

    现场开单时指业务员每天到终端客户的现场进行谈单和接单的动作流程,现场开单一般主要是集中在BCD类门店和一些批发零售小店 现场开单的优势:现场开单可以及时掌控终端客户情况,促进客情关系,提高产品的铺市率 ...

  4. 阿里云SDK手册之java SDK

    进行阿里云sdk开发的前提是已经购买阿里云的相关服务才能调用阿里的相关接口进行开发.最近公司在做云管控的项目,于是进行下摘录总结. 一. 环境准备 阿里云针对不同的开发语言提供不同的sdk,由于项目用 ...

  5. jQuery对表单、表格的操作及更多应用(中:表格应用)

    内容摘录自锋利的JQuery一书 二.表格应用 1 表格隔行变色(:odd和:even选择器 P157) $(function(){ $("tr:odd").addClass(&q ...

  6. 字符串处理 Codeforces Round #296 (Div. 2) B. Error Correct System

    题目传送门 /* 无算法 三种可能:1.交换一对后正好都相同,此时-2 2.上面的情况不可能,交换一对后只有一个相同,此时-1 3.以上都不符合,则不交换,-1 -1 */ #include < ...

  7. BZOJ2862 : 分糖果

    二分答案$x$表示最大的一段的和. 设$f[i]$表示前$i$个最多分几段,满足最大的一段不超过$x$,若$f[n]\geq k$,则可行, 则$f[i]=\max(f[j])+1,sum[i]-su ...

  8. intro.js 页面引导简单用法

    下载地址:http://pan.baidu.com/share/link?shareid=1894002026&uk=1829018343 <!DOCTYPE HTML PUBLIC & ...

  9. TYVJ P1045 &&洛谷 1388 最大的算式 Label:dp

    描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号.例 ...

  10. mergeSort

    package POJ; public class Main { /** * * MergeSort * */ public static void main(String[] args) { Mai ...