本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。
第二篇: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 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,加深我们上面的理解:
在这里我们还是重复下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 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
用到的C-frame information payload格式如下:
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
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
这个交互跟2)基本一样,所以不再重复说明
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,本章结束