本章节主要讲述蓝牙host层的协议,针对BLE,主要关注L2CAP、GATT/ATT、SMP、GAP这几层。根据spec的章节顺序,我们一次讲解:
PART A:A: LOGICAL LINK CONTROL AND ADAPTATION PROTOCOL SPECIFICATION
1. L2CAP概述(逻辑链路控制和适配协议)
![](https://img-blog.csdnimg.cn/20200914133004405.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
L2CAP层,中文翻译是逻辑链路控制和适配协议层,在BLE中提供的主要功能是:抽象出来logic channel供上层使用,同时能够对数据进行分包和重组。同时L2CAP能够提供必要的数据通信可靠性保证,如Flow control等。如上图所示,upper layer的data能够由L2CAP layer fragment,最终传输到Lower layer,即实现SDUs变为PDUs的过程。
Protocol/channel multiplexing:信道复用技术。这里需要提出一个概念:信道标识符,信道标识符是logic channel的唯一标识,针对BLE的面向无连接特性,BLE的信道标识符是固定的。BLE存在三条信道标识符,即用于ATT的0x0004,用于安全管理的0x0006,用于BLE信令的0x0005.
![](https://img-blog.csdnimg.cn/20200914140046355.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
Segmentation and reassembly:分段和重组技术。这里需要指出的是这里的Segmentation和reassembly说的是针对upper layer传输来的数据,即上层数据一般不需要自己做分段和重组操作,但是按照多大长度进行分段需要上层告知,这样才可适应upper layer。需要和Fragmentation and Recombination区别。
Flow control per L2CAP channel:流控技术。每个channel需要提供流控。
Error control and retransmissions:错误控制技术。传输出错能够重传或者汇报错误。
Support for Streaming:指出流媒体数据。
Fragmentation and Recombination:L2CAP的PDUs可能不能够适应HCI层的传输要求(HCI层一次能够接受的数据长度有限),为了能够将数据传给HCI层,需要进行分包操作。分包的数据必须加上标识,这样才能够被传输出去,便于对端设备重组包。
Quality of Service:支持Qos。
![](https://img-blog.csdnimg.cn/20200914140402845.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
根据上图我们可以看到,L2CAP和其上层或者下层的交互都是很可靠的传输。同时设备和对端设备之间的交互,都需要采用request和response的机制,确保数据交互的可靠性。
针对一个logic channel,L2CAP可以将其工作在以下的模式:
• Basic L2CAP Mode(标准模式):一般无任何特殊要求的情况下,L2CAP一个logic channel工作的模式。
• Flow Control Mode(流控模式):该logic channel能够支持flow control。
• Retransmission Mode(重传模式):利用一个timer和一套go-back-n repeat机制,保证数据能够传送到对端。
• Enhanced Retransmission Mode(增强重传模式):和Retransmission Mode类似,但是添加了新的机能保证数据的传输。
• Streaming Mode(流模式):为了传输real-time isochronous数据,数据被标记,无需ack机制,传输不使用TxWindow size。
• LE Credit Based Flow Control Mode(基于信任的流控模式):一种利用Credit做的流控机制
• Enhanced Credit Based Flow Control Mode(增强型基于信任的流控模式):一种利用Credit做的增强流控机制
需要注意的是,Flow Control Mode and Retransmission mode和其增强的Enhanced Retransmission mode, Enhanced Credit Based Flow Control mode, or Streaming mode不可共存。
2. L2CAP数据包格式
L2CAP的包根据使用的场景,分为面向连接的和无连接的(connection-oriented or connectionless)。
connectionless无连接的包很少使用,我们这里简单说明下格式:G-frame
![](https://img-blog.csdnimg.cn/20200914142548514.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
我们重点说下connection-oriented的包格式:
![](https://img-blog.csdnimg.cn/20200914142648631.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
B-frame最大自己数目可以达到65535个字节,前两个字节是length,中间的是channel id(CID),最后是包包括的数据payload。
为了支持RETRANSMISSION/FLOW CONTROL/STREAMING MODES,我们可以将B-frame继续划分为:S-frame和I-frame
![](https://img-blog.csdnimg.cn/20200914143144802.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
Information frames (I-frames)主要用于control information传输,例如后续的信令操作码操作(the Standard Control Field, the Enhanced Control Field, and the Extended Control Field)。I-frames根据应用的不同,其control Field大致可以分为3种如下:其中TxSeq和ReqSeq用来标识流控,R bit用来实现重传机制。(Retransmission mode and Flow Control mode)。F bit用来实现Poll/Final bit 机制。
![](https://img-blog.csdnimg.cn/20200914144204496.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
Supervisory frames (S-frames) 用于回复I-frame(acknowledge I-frames and request retransmission of I-frames)。这里基本意思和I-frame类似,其中的Supervisory function - S bits,主要有以下四个意思:RR(Receiver Ready), REJ (Reject), RNR (Receiver Not Ready) and SREJ (Selective Reject).
![](https://img-blog.csdnimg.cn/20200914145155819.png)
![](https://img-blog.csdnimg.cn/20200914145256264.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
为了支持LE CREDIT BASED FLOW CONTROL MODE AND ENHANCED CREDIT BASED FLOW CONTROL MODE,我们可以将B-frame继续划分为:K-frame。
![](https://img-blog.csdnimg.cn/20200914145643565.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
3. L2CAP信令包格式(可以理解为传输上述数据时候必要的控制包)
对BLE来说,信令包传输的CID是0x0005,它提供了L2CAP的一些基本交互信令和参数配置信令。
采用的包为C-frame,这个包的最大长度是由MTUsig定义的,协议中规定了MTUsig的最小值如下:BLE我们一般设置为23.
![](https://img-blog.csdnimg.cn/20200914150617963.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200914150851987.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
看起来和G-frame都差不多吧,重点是information部分存在区别。即下面的command format。
![](https://img-blog.csdnimg.cn/20200914150909571.png)
![](https://img-blog.csdnimg.cn/20200914150944595.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20200914151009393.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3N6al9ibGU=,size_16,color_FFFFFF,t_70)
目前L2CAP的信令已经扩展到0x1A个信令,我们比较关注的是BLE部分的,即CID是0x0005部分的有以下几个:
命令拒绝:L2CAP_COMMAND_REJECT_RSP
解除连接:L2CAP_DISCONNECTION_RSP 、L2CAP_DISCONNECTION_REQ
连接参数请求:L2CAP_CONNECTION_PARAMETER_UPDATE_REQ、L2CAP_CONNECTION_PARAMETER_UPDATE_RSP
流控配置:L2CAP_LE_CREDIT_BASED_CONNECTION_REQ、L2CAP_LE_CREDIT_BASED_CONNECTION_RSP
L2CAP_FLOW_CONTROL_CREDIT_IND、
L2CAP_CREDIT_BASED_CONNECTION_REQ
L2CAP_CREDIT_BASED_CONNECTION_RSP
L2CAP_CREDIT_BASED_RECONFIGURE_REQ
L2CAP_CREDIT_BASED_RECONFIGURE_RSP
这里需要说明,Identifier这个直接是设备维护的自增的一个值,作为master设备应该维护这个值自增。例如发送者发送REQ包后,作为接受者回馈RSP时候,必须保持包中Identifier一致。Signaling identifier 0x00 is an illegal identifier and shall never be used in any command.
由于信令太多,在此处我们不做介绍,有兴趣的同学可以自己查看spec理解。
4. L2CAP中的几个参数
MAXIMUM TRANSMISSION UNIT (MTU):MTU是指设备自己具备的传输数据的最大字节能力,这是一个不可商量的值,每个设备自己固定。对于BLE设备,这个值不可以小于23字节。
FLUSH TIMEOUT OPTION:FLUSH TIMEOUT值代表着数据丢失后重传的时机,是双方设备可以协商的值,ms作为单位。如果这个值为0xffff,那么这个通道将会是一个可靠通道(区别尽最大努力传输)。
QUALITY OF SERVICE (QOS) OPTION:Qos定义了qos通信需要的必要参数,Service Type等。
RETRANSMISSION AND FLOW CONTROL OPTION:定义了重传和流控需要的一些参数,
FRAME CHECK SEQUENCE (FCS) OPTION:FCS是否开启选项
EXTENDED FLOW SPECIFICATION OPTION、EXTENDED WINDOW SIZE OPTION:是否开启extended传输功能
本章节剩下内容会在下一篇博客中讲。。。。