L2CAP信令封包(SIGNALING PACKET)格式

一. 声明


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

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

第二篇: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

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

二.信号封包的数据格式(SIGNALING PACKET FORMATS)

L2CAP的命令叫做signaling command(叫做C-frame),所有的命令都是通过signaling channel来发送,传统蓝牙的CID是固定的0x0001,低功耗的CID是固定的0x0005,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第1张图片

其中Length跟CID不需要额外说明,在signaling command的information payload的格式为:

L2CAP信令封包(SIGNALING PACKET)格式_第2张图片

参数:

Code:标示Signaling command id,如下:

L2CAP信令封包(SIGNALING PACKET)格式_第3张图片

L2CAP信令封包(SIGNALING PACKET)格式_第4张图片

Identifier (1 octet):用于标示command的发送序列,response必须跟request相同

Length (2 octets):用于标示后续的data长度

Data (0 or more octets):针对不同的signaling command,后续的data是不同的,具体command具体分析。下面我们来看下具体的signaling command,command的格式只提出红框部分。

L2CAP信令封包(SIGNALING PACKET)格式_第5张图片

也就是这个部分

L2CAP信令封包(SIGNALING PACKET)格式_第6张图片

三.信号封包介绍

此部分针对于每个SIGNALING来做说明

1. L2CAP_COMMAND_REJECT_RSP (CODE 0x01)

此命令是在command不合法以及对方的response不合法的情况下发送给对方Information的格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第7张图片

Reason (2 octets):告知remote端为什么发送拒绝封包,reason有以下值:

L2CAP信令封包(SIGNALING PACKET)格式_第8张图片

Data (0 or more octets):此部分长度并不是固定的,要看具体拒绝reason

如果拒绝reason是0x0000,那么是remote端发送的command id是错误的,data部分则是0byte,什么都不需要填写

如果拒绝reason是0x0001,那么就是MTU有问题,data就是2byte的MTU

如果拒绝reason是0x0002,那么会有4byte的data,分别来表示local (first) and remote(second) channel endpoints

总结图示如下:

L2CAP信令封包(SIGNALING PACKET)格式_第9张图片

2 L2CAP_CONNECTION_REQ (CODE 0x02)

该命令是发起连接请求,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第10张图片

其中Code,Identifier,Length,PSM不做说明了,前面已经说明了

Source CID:连接的放用source ID,也就是本地的CID.

L2CAP信令封包(SIGNALING PACKET)格式_第11张图片

下面我们来看一个我抓取的BTsnoop封包.

L2CAP信令封包(SIGNALING PACKET)格式_第12张图片

3 .L2CAP_CONNECTION_RSP (CODE 0x03)

该命令是响应发起连接请求,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第13张图片

我们只说Destination CID,Source CID,Result,Status

Destination CID:可以认为是发送response的本地CID

Source CID:发送L2CAP_CONNECTION_REQ的CID

Result:连接的结果,如图:

L2CAP信令封包(SIGNALING PACKET)格式_第14张图片
Status (2 octets):只有当Result = 0x0001 connection pending的时候才会用到,值如下:

L2CAP信令封包(SIGNALING PACKET)格式_第15张图片

L2CAP信令封包(SIGNALING PACKET)格式_第16张图片

下面我们来看一个我抓取的BTsnoop封包

L2CAP信令封包(SIGNALING PACKET)格式_第17张图片

4 L2CAP_CONFIGURATION_REQ (CODE 0x04)

该命令是发起配置请求,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第18张图片

Destination CID - DCID (2 octets):此部分连接发起的是source cid,连接response是destination id,也就是连接接收的CID,所以要根据谁发起的连接来填写

Flags (2 octets):只有一个C(continue)被定义,表明是否后续是否有数据

L2CAP信令封包(SIGNALING PACKET)格式_第19张图片

Configuration Options:配置参数,下面我们来详细说明下配置参数,内容比较多

配置选项的格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第20张图片

Type (1 octet):配置的类型,有以下几个:

0x01:MAXIMUM TRANSMISSION UNIT (MTU)

0x02:FLUSH TIMEOUT OPTION

0x03:QUALITY OF SERVICE (QOS) OPTION

0x04:RETRANSMISSION AND FLOW CONTROL OPTION

0x05:FRAME CHECK SEQUENCE (FCS) OPTION

0x06:EXTENDED FLOW SPECIFICATION OPTION

0x07:EXTENDED WINDOW SIZE OPTION

Length:option data的长度

Option data:根据不同的type,里面的数据不同

我们来一一分析每个配置选项

0x01:MAXIMUM TRANSMISSION UNIT (MTU):是上层协议的最大封包数

L2CAP信令封包(SIGNALING PACKET)格式_第21张图片

0x02:FLUSH TIMEOUT OPTION:

L2CAP信令封包(SIGNALING PACKET)格式_第22张图片

L2CAP信令封包(SIGNALING PACKET)格式_第23张图片

0x03:QUALITY OF SERVICE (QOS) OPTION

L2CAP信令封包(SIGNALING PACKET)格式_第24张图片

0x04:RETRANSMISSION AND FLOW CONTROL OPTION

L2CAP信令封包(SIGNALING PACKET)格式_第25张图片

0x05:FRAME CHECK SEQUENCE (FCS) OPTION

L2CAP信令封包(SIGNALING PACKET)格式_第26张图片

0x06:EXTENDED FLOW SPECIFICATION OPTION

L2CAP信令封包(SIGNALING PACKET)格式_第27张图片

0x07:EXTENDED WINDOW SIZE OPTION

L2CAP信令封包(SIGNALING PACKET)格式_第28张图片

下面我们举一个例子看看发送MTU的configure request的btsnoop

L2CAP信令封包(SIGNALING PACKET)格式_第29张图片

5. L2CAP_CONFIGURATION_RSP (CODE 0x05)

L2CAP configuration的response,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第30张图片

Result:configuration req的结果,有以下几个值

L2CAP信令封包(SIGNALING PACKET)格式_第31张图片

Config:就是我们上面所说的配置参数

我们来看一个btsnoop

L2CAP信令封包(SIGNALING PACKET)格式_第32张图片

6 L2CAP_DISCONNECTION_REQ (CODE 0x06)

L2CAP channel断开请求,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第33张图片

其中参数我们都见过了,直接来看一个BTSnoop。

L2CAP信令封包(SIGNALING PACKET)格式_第34张图片

7. L2CAP_DISCONNECTION_RSP (CODE 0x07)

断开请求的reponse,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第35张图片

参数我们已经明了,来看下一个BTSnoop.

L2CAP信令封包(SIGNALING PACKET)格式_第36张图片

8.L2CAP_ECHO_REQ (CODE 0x08)

用来请求一个L2CAP的ECHO response,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第37张图片

9.L2CAP_ECHO_RSP (CODE 0x09)

回复一个echo rrequest,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第38张图片

10.L2CAP_INFORMATION_REQ (CODE 0x0A)

用来请求一些信息,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第39张图片

InfoType:信息类型,有以下值:

L2CAP信令封包(SIGNALING PACKET)格式_第40张图片

我们来看几个不同的info的BTSNOOP.

L2CAP信令封包(SIGNALING PACKET)格式_第41张图片

L2CAP信令封包(SIGNALING PACKET)格式_第42张图片

11. L2CAP_INFORMATION_RSP (CODE 0x0B)

Information请求的response,格式如下:

L2CAP信令封包(SIGNALING PACKET)格式_第43张图片

其中InfoType就是Infomation request请求的type

Result如下:

L2CAP信令封包(SIGNALING PACKET)格式_第44张图片

Data:根据不同的Info type有不同长度的值,如下:

L2CAP信令封包(SIGNALING PACKET)格式_第45张图片

其中MTU就是普通的2个byte,没有啥好说的

EXTENDED FEATURE MASK值如下:

L2CAP信令封包(SIGNALING PACKET)格式_第46张图片

FIXED CHANNELS SUPPORTED定义如下:

L2CAP信令封包(SIGNALING PACKET)格式_第47张图片

我们来抓几个btsnoop看看.

L2CAP信令封包(SIGNALING PACKET)格式_第48张图片

L2CAP信令封包(SIGNALING PACKET)格式_第49张图片

你可能感兴趣的:(蓝牙协议剖析,蓝牙协议栈精讲,L2CAP,L2CAP,signaling,C-frame,蓝牙协议栈)