L2CAP(Logical Link Control and Adaptation Protocol)

发布时间 2023-12-21 16:55:51作者: 踏浪而来的人

逻辑链路(Logical Link):不是真实的物理链路(acl),上层的多个profile怎么表示连接呢?

就是通过逻辑链路,CID在逻辑链路的两端,举例:

1. 如本端和远端的SDP,SCID=0X40,DCID=0XB9,SCID=0X40和DCID=0XB9就表示一条逻辑链路;

2. 本端和远端的RFCOMM,SCID=0X41,DCID=0XBA,SCID=0X41和DCID=0XBA就表示另一条逻辑链路

两设备间只存在一个物理链路(ACL),但是基于这条物理链路抽象出两条逻辑链路,上层协议的连接都是基于逻辑链路的

SDU(Service Data Unit):L2CAP在L2CAP channel(CID)上与上层交换并传输的数据单元

PDU(Protocol Data Unit):l2cap层封装的数据(包括B-frames, I-frames, S-frames, C-frames(控制帧,仅在signaling channel 0x0001上使用), G-frames,K-frames)

SUD和PDU都可以拆包和组包

CID:BR/EDR  0x0001用于信令通道

         0x0007用于SMP

         0x0040~0xFFFF动态分配

  BLE      0x0004 ATT

       0x0005用于LE的信令通道

       0x0006用于LE的SMP

       0x0040~0x007F EATT

MTU(maximum size of an SDU):上层能够接受的最大数据单元大小

在L2CAP_CONFIGURATION_REQ请求中可以配置MTU,如上图,本端配置MTU为65535,表示在本端SDP这个CID上最多能承受65535个数据,即对端可以发送在65535内的数据包;

远端配置MTU为48,表示它上层的sdp最多能承受48个数据单元,即本端最多可以发送48个数据单元到远端

 

信令通道的数据格式

在CID为0x0001上发送的的数据包(C-frames),用于l2cap的连接、配置等

1. L2CAP_CONNECTION_REQ (CODE 0x02)

PDU Length+Channel ID(0x0001)+code(0x02)+identifier+data length(0x0004)+PSM+source cid

PSM:assinged number分配

Source CID:表示发送请求和接收响应的设备上的通道端点

2. L2CAP_CONNECTION_RSP (CODE 0x03)

PDU Length+Channel ID(0x0001)+code(0x03)+identifier+data length(0x0008) +destination CID+source CID+result+status

destination CID:表示接收请求和发送响应的设备上的通道端点。