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

一. 声明

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

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

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

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

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

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

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

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

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

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

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

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

蓝牙学习目录http://www.javashuo.com/article/p-cydcgesb-nt.html

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

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

整个过程链接流程以下:

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

整理流程以下:

步骤整理以下:

步骤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

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

其中Information Payload格式为

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

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 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

00 00->Status

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

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

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

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,整个配置选项格式以下:

那MTU的格式以下:

01 -> MTU的type

02 -> length

8e 04 -> 0x48e = 1166byte

②对方回复L2CAP Configure Response

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

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

这个交互跟2)基本同样,因此再也不重复说明

步骤4)后续的SDU的交互

SDU的咱们走的basic mode,格式以下:

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

04 00 -> payload length是4

42 00 -> CID

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

 

OK,本章结束