本章节继续讲述蓝牙host层的L2CAP协议,主要针对PROCEDURES,对应spec章节为:
PART A:A: LOGICAL LINK CONTROL AND ADAPTATION PROTOCOL SPECIFICATION
7 GENERAL PROCEDURES
1. 参数配置process
在BLE中,L2CAP层的初始化,应该包括 L2CAP的参数配置部分。主要是通过信令L2CAP_CONFIGURATION_REQ和L2CAP_CONNECTION_RSP的交互来实现。下图的例子,说明了Device A和Device B的L2CAP参数MTU信息是如何交互的:
图中的Device A首先发送 L2CAP_CONFIGURATION_REQ,其中包含MTU参数为0x0100。Device B收到后,首先需要利用L2CAP_CONNECTION_RSP信令来回复,同时还需要将自己的MTU通过 L2CAP_CONFIGURATION_REQ发送出去,由此实现MTU的交互。通过两回合的确认,设备A和设备B知道了对方支持的MTU大小。
同理,其他参数也可以利用上面的交互流程进行交互,例如上章节最后提及的几个参数:
需要注意的是,上述交互流程是建立在Standard Configuration process基础上的。除此之外,还存在Lockstep Configuration process ,一般我们只使用Standard Configuration process,Lockstep process在channel parameters中包换an Extended Flow Specification option的时候才会使用。Lockstep process只发送一次L2CAP_CONFIGURATION_REQ。
如果在参数配置的过程中,双方设备发现了参数不匹配,那么需要协商一个值作为双方的匹配值。以MTU为例子:
上图中,Device B由于不支持option 0x20,所以一开始返回了一个‘unknown parameter’ 的L2CAP_CONFIGURATION_RSP 包。Device A第二次发送了一个不含有option 0x20 的L2CAP_CONFIGURATION_REQ包,Device B接受了这个包,但是其MTU的大小只有0x80,所以用L2CAP_CONFIGURATION_RSP 回复了一个包含信息MTU option=0x80的包,这样就表明了Device A不要发送超过0x80大小的数据包。
2. 分段和重组FRAGMENTATION AND RECOMBINATION
这里提及的分段和重组,是针对L2CAP PDUs而言的,需要区别于L2CAP 的SDUs。
在经典蓝牙中,使用了LLID这个包头(位于HCI层的包)来标识是否为分段包,BLE沿用了这个规则:
LLID=0b10:起始包
LLID=0b01:后续包
具体的,L2CAP层的B-frame可以按照下图进行fragment:
Recombination即fragment的逆过程,按照LLID进行组合即可。这里就需要注意Recombination会和timer有关系,因为当信道不理想时,会有部分分段包丢失,这时候需要考虑是否继续等待或者采用其他机制。
除了B-frame的分段(用于basic mode),针对I-frame(用于Enhanced Retransmission mode, Streaming mode, Retransmission mode, FlowControl mode)有以下分段方式:
第一步是将L2CAP SDU封装为I-frame,通过SAR bits可以分为 'start', 'end' or 'continuation' packet.
第二步是将I-frame的包再次通过上述的LLID方式分包。
3. 冲突解决方式OPERATION COLLISION RESOLUTION
当Device A和Device B同时发起相同code的process,则会发生冲突。一旦设备检测到冲突,应当使用以下算法(BD_ADDR比较算法)进行规避:
4. 流控process和重传process
这两个process发生在以下mode:Enhanced Retransmission mode, Streaming Mode, Flow Control Mode, and Retransmission mode。
Flow Control and Retransmission使用的是I-frame和S-frame。关于这两种frame的具体格式,在上篇文章中已经讲到。S-frame是用于监督I-frame的,可以分为两种监督方式:Receiver Ready (RR) and Reject (REJ).
receiver ready (RR) S-frame在以下情形使用:
1. 确认当前的I-frame:Acknowledge I-frames numbered up to and including ReqSeq - 1.
2. 开启或者取消I-frame的重传:updating the receiver with the current status of the Retransmission Disable Bit.
The reject (REJ) S-frame 用来回复retransmission of all I-frames starting with the I-frame with TxSeq equal to ReqSeq specified in the REJ.一旦出现reject (REJ) S-frame,那么会触发REJ Exception condition。只有解除REJ Exception condition,才可以进行下一次的reject (REJ) S-frame传输。
几个重要的参数:
发送端:
• TxSeq – the send sequence number used to sequentially number each new I-frame transmitted.
• NextTxSeq – the sequence number to be used in the next new I-frame transmitted.
• ExpectedAckSeq – the sequence number of the next I-frame expected to be acknowledged by the receiving peer.
接收端:
• ReqSeq – The sequence number sent in an acknowledgment frame to request transmission of I-frame with TxSeq = ReqSeq and acknowledge receipt of I-frames up to and including (ReqSeq-1).
• ExpectedTxSeq – the value of TxSeq expected in the next I-frame.
• BufferSeq – When segmented I-frames are buffered this is used to delay acknowledgment of received
总体来讲Flow Control和Retransmission就是根据以上的六个参数来做相关的机制运转,以发送端为例子:
图中的TxWindow=5,数据发送时候,通过I-frame和S-frame的不断交互,来获取TxSeq等参数的值。具体的处理方式详细看spec协议,是一个比较复杂的过程。
这里面提到了一个TxWindow的概念,这个值的范围1 to 32 for Retransmission mode and Flow Control mode. 在Enhanced Retransmission mode中,被扩展到1 to 63。这个值越大,则说明设备能够有足够大的空间用来数据的缓存。
重传机制,是在上述数据交互机制出错时候被触发。这里比较典型的触发条件是RetransmissionTimer溢出,当I-frame被发送后,RetransmissionTimer即被开启,RetransmissionTimer将会在收到ack后被关闭。一旦RetransmissionTimer溢出,标志着I-frame没有被正确接收。
Flow Control mode状态下,为了达到流控的目的,有以下两个注意事项:
• REJ frames shall not be used in Flow Control Mode.
• The RetransmissionDisableBit shall always be set to zero in the transmitter, and shall be ignored in the receiver.
针对BLE,还有一个LE Credit Based Flow Control Mode,使用的是K-frames。K-frame包含一个credit,通过增减credit的值来实现Flow Control。
5. 小结
L2CAP作为蓝牙架构中的中间层,能够将上层的SDU转换为PDU。同时进行分段等操作适应HCI层,本层还可以进行流控和重传等机制。L2CAP的协议栈设计好坏,能够直接影响整个协议栈数据通信的能力好坏。
至此L2CAP的内容已经全部看完,下面我们关注ATT/GATT的部分。。。。
.