书上这部分的小节逻辑性有点不强。。。
L2CAP主要负责高层协议复用,分段与重组,组管理,以及终端设备之间服务质量的传输。
两个蓝牙设备单元之间的ACL链路通过链路管理器来建立。基带协议保证了数|据分组传输的有序性,也提供了全双工的信道。但是并不是所有的L2CAP的通信都是双向的。组播和非双向业务(如视频业务)只需要单工信道而不需要双工信道。
L2CAP通过基带层定义的一些机制,为数据传输提供了一条可靠的信道。基带协议中规定信道的可靠性通过以下一些机制来保证:
L2CAP是建立在"信道"概念的基础之上。信道标识符(CID)表示的是一条L2CAP的逻辑信道端点的名称。每条 L2CAP逻辑信道的每个端点都由一个信道标识符来标识。下表中给出了信道标识符的说明。从 0x0001 到 0x003F 的标识符保留用作特殊的L2CAP功能,如:
在本地设备和远端设备之间同时存在多条L2CAP信道的情况下,本地设备中这些不同的L2CAP信道端点将对应不同的CID。
CID的分配与特定设备有关,即使与一个本地设备相连的多个远端为各自信道端点分配了相同的 CID 值,该本地设备仍然能够区分这些设备和信道。
【这两句话注意区分:第一句是说在设备A,远端设备B之间存在a,b,c,d四条L2CAP信道,那么a,b,c,d信道端点在设备A中将有不同的CID;第二句话意思是设备A与远端设备A, B,C,D四个设备相连,那么在设备B,C,D中,其信道端点的CID相同,那么此时设备A仍然可以识别出B,C,D设备和他们与设备A之间的信道。】
为了提高传输效率,在 L2CAP中定义了分段和重组(SAR)的操作。
SAR 支持最大传输单元(MTU)的传输,该传输单元的长度要比基带分组的最大长度还要大。通过把包含高层协议的分组分配到多个基带分组上传输,可以降低系统开销。所有的L2CAP分组都可以分段在基带数据分组上传输。L2CAP本身并不执行分段和重组的操作,但是L2CAP分组的格式可以支持将分组调整到较小的物理帧的长度。
在发送端,高层协议分组被分成多个较小的数据块,这些数据块通过主机控制器接口(HCL)被传送到链路管理器。
在接收端,根据HCI提供的或者分组头中包含的信息,分段的数据被重新组合成完整的L2CAP。
其实分段和重组只使用了基带分组的开销很小。基带分组中,ACL链路数据分组的 有效荷载头 中的 L_CH 字段表明了该有效荷载 为 L2CAP 分组的开始段或者后续段。
(1)分段
高层协议负责发往L2CAP层的分组长度在MTU之内;
L2CAP负责把这些分组分段,组成协议数据单元 (PDU) 发给下面协议层;
若 L2CAP 直接运行在基带协议基础上,那 L2CAP 应用将把高层协议分组分段组成基带协议,便于无线信道来传输。
若L2CAP运行在HCI上 ( 一般是这样 ),L2CAP应用将把已分段的数据块发送到主机控制器,然后这些数据块将被转换为基带分组。
注意!!!在与同一个L2CAP分组相关的所有L2CAP分段都被发送到基带层之前,不得再向同一个目的设备发送新的L2CAP分组。
(2)重组
基带协议对ACL分组的发送是按顺序的,并且通过16位 CRC 来确保数据的完整性。
通过自动重复请求(ARQ)机制,基带协议支持可靠的连接。基带控制器接收到ACL分组时,它或者在每个分组到达时即通知L2CAP层,或者在接收缓冲区已满或定时器超时时,将分组到达的消息通知L2CAP层。
L2CAP应用通过分组头中的长度字段来进行一致性校验,并舍弃那些与长度字段不相符的分组。如果对信道的可靠性没有要求,那么只需将长度不符的分组丢弃; 如果对信道可靠性有要求,还需要向更高的协议层通报信道已不可靠的消息。可靠的信道被定义为具有可刷新的超时值的信道,这一选项用于通知接收端发送设备的链路控制|器 or 链路管理器在放弃发送之前,尝试发送一个L2CAP段所用的时间。 【斜体部分懵】
L2CAP 面向连接信道假定不同协议层进行通信时有不同的状态。协议的这一部分描述了L2CAP面向连接信道的状态机,并定义了一些状态,引起状态转换的时间,以及响应时间的动作。
【状态机仅适用于双向信道!】【感觉好像是中断操作一般:定义不同的中断级别,中断触发条件,以及中断响应函数。。。】
客户和服务器分别代表请求的发起者和接收者。应用层的客户既可以发起也可以接收请求。
事件和动作的命名规则如下:两个协议层之间的接口(垂直方向接口)使用为高层提供服务的低协议层的前缀,如L2CA。位于相同协议层的实体之间的接口(水平方向接口)使用协议的前缀(即在协议层标识前加上"P"),这样L2CA变为L2CAP。
从上层来的事件称为"请求"(Req),相应的回答称为"证实"(Cfm);
从低层来的事件称为"指示"(Ind),相应的应答称为"响应"(Rsp)。
需要有进一步的处理过程的响应,称为"中间应答"(Phd)。这些表示证实或应答的记号都是表示肯定的答复,如果有否定的应答,就在记号后面加上"Neg"后缀,如L2CAP_ConnectCfmNeg。高层的请求信号必须有相应的证实应答(表示动作的执行成功或者不成功),而低层对高层的指示信号并不一定需要相应的应答,例如当指示信号用于向高层通知本地触发事件的信息时。
事件是指在一定时限内到达 L2CAP 层的消息。事件分为五类:
【每一类都有很多命令,不再列举】
动作分为五类:
当信道被设置时,它将会处于不同的状态。图已给出,你仔细品品。
除了面向连接信道外,L2CAP还支持面向“组”的信道,在这种信道中分组将被发往组的所有成员。这种信道不提供质量服务,因此不可靠。
【面向组也就是广播的形式?】
各字段内容如下:
L2CAP组服务接口提供的基本的组管理机制包括创建组、向组中添加成员、删除组成员,但是不能预先定义组。
代码:1字节。用于表示指令的类型。
标识符:1字节。用于请求与应答之间的匹配。该字段由请求设备设置,响应设备则在回复分组中使用相同的值表示应答,不同的指令必须使用不同的标识符。一个标识符在发起请求的分组发出后的360s时间内,不能被再次使用。在 RTX或ERTX定时器停止时,如果要重发同一个请求分组,那么必须使用相同的标识符。一个设备如果收到相同的请求分组,应该用相同的应答分组进行应答。0x0000被定义为非法标识符,不得用于任何指令中。如果收到含有不合法标识符的分组,该分组将被丢弃。
长度:2字节。用于指示指令数据字段的长度,不包括代码段、标识符和字段。
数据:数据字段的长度是可变的,格式由代码段来决定。
蓝牙协议通过使用选项分组的机制来提高对不同连接要求的协商能力,这种类型的分组包括选项类型字段,选项长度字段以及一个或者多个选项数据字段。
选项分组中各字段内容如下:
类型:1字节。选项类型字段指定了将被配置的参数。字段的最高位比特决了如果选项没有识别时所应采取的动作,该比特位取值意义如下:
0——选项必须被识别,拒绝配置请求;1——选项只是一个提示,跳过该选项,继续处理过程。
长度:1字节。指出选项的有效载荷的字节数,不包括类型和长度字段。
选项数据:表示具体的选项。该字段的内容由选项类型决定。
可以进行配置的选项包括最大传输单位(MTU)选项、超时刷新选项、服务质量选项,具体内容参见协议。
对信道参数的协商分为三步来进行:
① 向远端设备通知本地设备所希望设置的一些非缺省值参数。
② 远端设备同意或拒绝这些参数(包括一些缺省参数)。步骤1 和 步骤2 可以根据需要不断重复。
③ 在相反的方向上重复步骤1 和 2 ,直到本地设备和远端设备对参数的选择达成一致。
配置过程如下图所示:【这个图画的是啥玩意???】
这一选项用于说明发送设备所能接受分组的有效荷载长度。MTU的类型码为0x01,长度为 2 字节;有效荷载MTU段表明 L2CAP分组的最大有效荷载长度。
该选项用于将发送设备的链路控制器/管理器在成功发送一个L2CAP段之前尝试的时限通知接收端,超过该时限发送还没有成功时,发送设备将放弃发送并对该分组进行刷新。刷新超时选项的类型码为0x02,有效载荷长度为2字节,其格式如图所示。
服务质量选项用于对信道上的数据流参数进行说明。在配置请求分组中,请求设备用该选项说明请求设备输出数据流的情况。如果远端设备同意该选项的值,则在返回的肯定应答分组中载入相同的选项值以表示同意,否则返回否定应答分组并载入新的不同的选项值,以说明远端设备所希望的输入数据流的情况。
L2CAP应用只需要支持 “尽力而为” (Bet For) 服务。对其他服务类型的支持则是可选择的。尽力而为服务 不需要任何授权,因此如果在配置请求中没有对QoS选项进行配置,那么QoS 就默认为尽力而为服务;如果QoS需要授权,就必需要发送 QoS 配置请求,对选项进行设置。QoS 选项类型码为 0x03,有效载荷长度为 22 字节,选项格式如下图所示。
各字段内容如下:
标志:1字节。被设置为全0,保留备用。
服务类型:1字节。该字段用于说明所需要的服务的等级,如下表所示。如果值为0x00 表示没有传输业务,这时其他字段均可以忽略,如果选择缺省值(0x01),接收设备将把其余字段作为默认参数对待,忽略这些字段并将参数设置为默认值(这时QoS选项在应答分组中也被省略),或者返回新的参数值,以说明所希望的配置。
传输速率:4字节。该字段用于说明数据传输的速率,以字节/秒为单位。一个 L2CAP应用可以持续的以该速率发送数据。突发数据可以以令牌存储段的长度发送。突发数据传送完以后,必须将传输的速率调整回令牌速率。对 “尽力|而为” 服务,一个L2CAP应用可以有尽可能大的带宽;对授权服务,L2CAP应用只在需要时有最大的带宽。
令牌存储段长度:4字节。该字段表示令牌存储段(也就是缓冲区)的大小,以字节为单位。
缺省值为0x00000000,表示不需要令牌存储段。
如果存储段已满,应用或者等待,或者将数据丢弃。
OFFFFFFFF表示与最大存储段长度匹配的通配符。该值的意义取决于服务类型。对 “尽力而为” 服务,表示L2CAP应用需要尽可能大的存储段;对授权服务,该值表示在应用请求时,需要有最大的缓冲区空间。
峰值带宽:4字节。该字段用于限制分组发送的速率,以字节/秒为单位。一些中间系统可以利用该信息,更有效的分配资源。缺省值为0x000000,表示最大带宽未知。
等待时间:4字节。表示从发送设备开始无线传输到发送第一个数据比特之间 的最大延迟时间。这一时间的精确度由服务类型指定的授权等级决定。缺省值为OxFFFFF,表示忽略该时间值。
延迟变化:4字节。该字段值表示一个分组在信道上传输最大和最小的可能时延值之差。单位为微秒(us)。接收段通过该值决定缓冲区空间的大小。缺省值为OxFFFFFFFF,表示该值可忽略。