传统蓝牙L2CAP的连接流程(以被连接为例)

一. 声明

本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:

第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。

第二篇:Transport层介绍,主要介绍蓝牙协议栈跟蓝牙芯片之前的硬件传输协议,比如基于UART的H4,H5,BCSP,基于USB的H2等

第三篇:传统蓝牙controller介绍,主要介绍传统蓝牙芯片的介绍,包括射频层(RF),基带层(baseband),链路管理层(LMP)等

第四篇:传统蓝牙host介绍,主要介绍传统蓝牙的协议栈,比如HCI,L2CAP,SDP,RFCOMM,HFP,SPP,HID,AVDTP,AVCTP,A2DP,AVRCP,OBEX,PBAP,MAP等等一系列的协议吧。

第五篇:低功耗蓝牙controller介绍,主要介绍低功耗蓝牙芯片,包括物理层(PHY),链路层(LL)

第六篇:低功耗蓝牙host介绍,低功耗蓝牙协议栈的介绍,包括HCI,L2CAP,ATT,GATT,SM等

第七篇:蓝牙芯片介绍,主要介绍一些蓝牙芯片的初始化流程,基于HCI vendor command的扩展

第八篇:附录,主要介绍以上常用名词的介绍以及一些特殊流程的介绍等。

另外,开发板如下所示,对于想学习蓝牙协议栈的最好人手一套。以便更好的学习蓝牙协议栈,相信我,学完这一套视频你将拥有修改任何协议栈的能力(比如Linux下的bluez,Android下的bluedroid)。

------------------------------------------------------------------------------------------------------------------------------------------

CSDN学院链接(进入选择你想要学习的课程):https://edu.csdn.net/lecturer/5352?spm=1002.2001.3001.4144

蓝牙交流扣扣群:970324688

Github代码:https://github.com/sj15712795029/bluetooth_stack

入手开发板:https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w4004-22329603896.18.5aeb41f973iStr&id=622836061708

蓝牙学习目录:https://blog.csdn.net/XiaoXiaoPengBo/article/details/107727900

------------------------------------------------------------------------------------------------------------------------------------------

二. L2CAP的连接流程(以主动连接RFCOMM为例)

整个过程连接流程如下:

传统蓝牙L2CAP的连接流程(以被连接为例)_第1张图片

其中红色就是SIGNALING command,也就是C-frame,绿框是SDU(解释见截图),也就是B-frame

传统蓝牙L2CAP的连接流程(以被连接为例)_第2张图片

整理流程如下:

传统蓝牙L2CAP的连接流程(以被连接为例)_第3张图片

步骤整理如下:

步骤1)我们发送L2CAP Connection Request with RFCOMM PSM,对方回复L2CAP Connection Response

步骤2)我们发送L2CAP Configure Request配置请求 with MTU,对方回复L2CAP Configure Response

步骤3)当MTU不符合要求的时候,对方发送L2CAP Configure Request配置请求with MTU,我们会送L2CAP Configure Response

步骤4)后续的SDU的交互。

我们就结合前面的知识来分析下raw data,加深我们上面的理解:

步骤1)我们发送L2CAP Connection Request with RFCOMM PSM,对方回复L2CAP Connection Response

① 我们L2CAP Connection Request with RFCOMM PSM

传统蓝牙L2CAP的连接流程(以被连接为例)_第4张图片

在这里我们还是重复下C-frame的封包格式,上面已经介绍,下面用到C-frame的时候格式我们就不再介绍。

传统蓝牙L2CAP的连接流程(以被连接为例)_第5张图片

其中Information Payload格式为

传统蓝牙L2CAP的连接流程(以被连接为例)_第6张图片

那么本步骤connection request以及connection response用到的information payload如下:

传统蓝牙L2CAP的连接流程(以被连接为例)_第7张图片

传统蓝牙L2CAP的连接流程(以被连接为例)_第8张图片

Raw data分析

08 00 01 00 02 04 04 00 03 00 41 00(hex data)

08 00 -> payload len,也就02 01 04 00 01 00 40 00

01 00->Signaling channel

 

02 -> Code,L2CAP_CONNECTION_REQ (CODE 0x02)

04->Identifier

04 00 -> data的长度,也就是01 00 40 00

03 00->PSM,0x0003就是RFCOMM

40 00->0x0040,Source cid

② 对方回复L2CAP Connection Response

传统蓝牙L2CAP的连接流程(以被连接为例)_第9张图片

L2CAP raw data为:0C 00 01 00 03 04 08 00 42 00 41 00 00 00 00 00

0c 00 -> 整个L2CAP payload长度,也就是 03 04 08 00 42 00 41 00 00 00 00 00

01 00-> Signaling channel

03 -> L2CAP_CONNECTION_RSP (CODE 0x03)

04 ->Identifier,可以看到跟connect req是一样的

08 00->data长度,也就是42 00 41 00 00 00 00 00长度

42 00 -> Destination CID

41 00->Source CID

00 00->Result connection successful

传统蓝牙L2CAP的连接流程(以被连接为例)_第10张图片

00 00->Status

步骤2)我们发送L2CAP Configure Request配置请求 with MTU,对方回复L2CAP Configure Response

用到的C-frame information payload格式如下:

传统蓝牙L2CAP的连接流程(以被连接为例)_第11张图片

传统蓝牙L2CAP的连接流程(以被连接为例)_第12张图片

①我们发送L2CAP Configure Request配置请求 with MTU‘

传统蓝牙L2CAP的连接流程(以被连接为例)_第13张图片

L2CAP raw data为0C 00 01 00 04 05 08 00 42 00 00 00 01 02 8E 04

0c 00 -> 后续payload长度,也就是04 05 08 00 42 00 00 00 01 02 8E 04的长度

01 00-> Signaling channel

04 ->L2CAP_CONFIGURATION_REQ (CODE 0x04)

05 ->Identifier

08 00-> 后续的data长度

42 00 -> Destination CID,在connection response的回复的

00 00->Flags (2 octets),no continye

01 02 8e 04是config opt,整个配置选项格式如下:

传统蓝牙L2CAP的连接流程(以被连接为例)_第14张图片

那MTU的格式如下:

传统蓝牙L2CAP的连接流程(以被连接为例)_第15张图片

01 -> MTU的type

02 -> length

8e 04 -> 0x48e = 1166byte

②对方回复L2CAP Configure Response

传统蓝牙L2CAP的连接流程(以被连接为例)_第16张图片

0A 00 01 00 05 05 06 00 41 00 00 00 00 00

0A 00-> 后续payload长度,也就是 05 05 06 00 41 00 00 00 00 00长度

01 00-> Signaling channel

05 ->L2CAP_CONFIGURATION_RSP (CODE 0x05)

05 -> Identifier

06 00 -> 后续的data长度

41 00-> Source CID

00 00->flag no continue

00 00->Result

传统蓝牙L2CAP的连接流程(以被连接为例)_第17张图片

步骤3)当MTU不符合要求的时候,对方发送L2CAP Configure Request配置请求with MTU,我们会送L2CAP Configure Response

这个交互跟2)基本一样,所以不再重复说明

步骤4)后续的SDU的交互

SDU的我们走的basic mode,格式如下:

传统蓝牙L2CAP的连接流程(以被连接为例)_第18张图片

传统蓝牙L2CAP的连接流程(以被连接为例)_第19张图片

Raw data为:04 00 42 00 03 3F 01 1C

04 00 -> payload length是4

42 00 -> CID

03 3F 01 1C -> 数据,也就是rfcomm数据

 

OK,本章结束

你可能感兴趣的:(蓝牙协议剖析,蓝牙协议栈精讲,蓝牙L2CAP,L2CAP连接)