L2CAP协议概述
L2CAP中文为逻辑链路适配层,主要提供信息数据的分割/重组等传输方式。在bluedroid中,很多的上层会向l2cap注册相关服务,比如rfcomm(虚拟串口,最多可虚拟64路),sdp,gatt等。
1、L2CA_Register (SDP_PSM, &sdp_cb.reg_info)
2、L2CA_Register (BT_PSM_ATT, (tL2CAP_APPL_INFO *) &dyn_info)
l2cap的框架结构图如下、
一、通道标识符
l2cap传输是基于信道的概念进行传输,没一个信道都有各自的信道标识符(channel identify,CID),在HCI层完成相关初始化后,信道就会被创建,在ACL链路中通常需要创建一个CID为0x0001的控制信道,用于传输控制命令。
CID为2byte,具体如下图所示(通常用于ER(常规蓝牙)传输ACL,ASB和AMP链路)
而在低功耗蓝牙中,需要使用如下的CID进行表示
二、信道工作模式
逻辑信道可以工作在5种不同的模式下(可以理解为5种不同的使用场景),最后一种是LE设备特有的:
1、Basic L2CAP Mode(equivalent to L2CAP specification in Bluetooth v1.1) 默认模式,在未选择其他模式的情况下,用此模式。
2、Flow Control Mode 此模式下不会进行重传,但是丢失的数据能够被检测到,并报告丢失。
3、Retransmission Mode 此模式确保数据包都能成功的传输给对端设备。
4、Enhanced Retransmission Mode 此模式和重传模式类似,加入了Poll-bit等提高恢复效率。
5、Streaming Mode 此模式是为了真实的实时传输,数据包被编号但是不需要ACK确认。设定一个超时定时器,一旦定时器超时就将超时数据冲掉。
6、LE Credit Based Flow Control Mode 被用于LE设备通讯。
三、数据包传输协议
1、面向连接通讯方式
面向连接方式主要用于保证数据传至的实时性与有效性,并且它的传输是错误可恢复的可靠性连接。其数据格式如下所示、
length为information payload的数据长度,CID为数据连接信道编号。
2、面向无连接通讯方式
length为information payload的长度,CID为固定的信道(0x0002),PSM为指定上层的传输类型。
3、重传/流控模式下面向连接的通讯方式
这种方式下分为S帧和I帧的传输方式、如下
Length为数据包的长度,Channel ID为通道标示符,L2CAP SDU Length表示数据单元的长度,FCS(Frame Check Sequence)帧校验序列,Control字段根据不同的架构和功能分为三种格式:
1)、Standard Control Field Formats
2)、Enhanced Control Field Formats
3)、Extended Control Field Formats
四、命令通道的传输格式
命令信道用于建立连接,配置协商,信道间管理等,在我们现有的协议中,普通蓝牙的命令通道是固定的(0x0001),在le中使用的是(0x0005),l2cap会根据蓝牙的模式在信道中选择不同的信道进行通讯,所以命令信道的传输的CID与当前蓝牙所处的模式有关,具体如下表。
如图描述,若当前蓝牙处于普通蓝牙模式下,CID = 0X0001
若当前蓝牙处于低功耗模式下,CID = 0X0005
其payload字段如下,payload由l2cap上层调用l2cap的信道进行数据传输时填入,
Identifer 标识数据包,用于匹配请求包和回复包,Lenght 数据长度,Data 数据荷载(可选),Code为标识命令的类型,具体描述如下:
所以在bluedroid中,可以看见sdp,gatt等注册相关callback到l2cap中。