逻辑链路(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:表示接收请求和发送响应的设备上的通道端点。