一直搞不太清楚蓝牙BLE协议,不知道LL层和L2CAP层是如何划分的,后来博士给我讲了讲就理解了,写下来,做个记录:
1. 我们知道,除了蓝牙5.1新出的CTE,所有的BLE都是如下类型的包:
对于连接后的通讯包,PDU的最前面两个字节为header,header的最前两个bit为LLID,蓝牙BLE就是通过LLID来区分LL层数据和L2CAP层数据的。
2. LL层的包如下:
其中LLID这两个bit就是用于区分LL层数据和L2CAP层数据的。
当LLID为3时,该数据包为LL控制层数据,如下所示:
3. L2CAP层的包如下:
当LLID为2时,该数据包为L2CAP层数据包的起始包,起始包后续会有L2CAP层的长度和L2CAP层的channel ID,
当LLID为1时,该数据包为L2CAP层数据包的延续包,延续包后续没有L2CAP层的长度和L2CAP层的channel ID,但这种情况只有当
MTU的值大于data length时才会出现这样的包,但一般我们不这样用。
如下图为L2CAP层数据包格式:
4. L2CAP层的数据,根据channel ID不同,又分为三种不同的L2CAP指令,如下图所示:
上图可看出L2CAP包括三种指令:ATT指令,信令指令,SMP指令。
其中,
ATT指令用于传输应用通讯数据;
信令指令用于更新连接间隔的指令,和拒绝错误操作码时使用此信令指令;如下图:
SMP指令用于配对过程;