本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。
第二篇: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学院链接(进入选择你想要学习的课程):
蓝牙交流扣扣群:970324688
Github代码:
入手开发板:
蓝牙学习目录:
------------------------------------------------------------------------------------------------------------------------------------------
L2CAP的数据格式除非特别声明,否则都是小端
L2CAP一共有记下几个操作模式
• Basic L2CAP Mode((equivalent to L2CAP specification in Bluetooth v1.1) 默认模式,在未选择其他模式的情况下,用此模式。
• Flow Control Mode,此模式下不会进行重传,但是丢失的数据能够被检测到,并报告丢失。
• Retransmission Mode,此模式确保数据包都能成功的传输给对端设备。
• Enhanced Retransmission Mode,此模式和重传模式类似,加入了Poll-bit等提高恢复效率。
• Streaming Mode,此模式是为了真实的实时传输,数据包被编号但是不需要ACK确认。设定一个超时定时器,一旦定时器超时就将超时数据冲掉。
• LE Credit Based Flow Control Mode,被用于LE设备通讯。
• Enhanced Credit BasedFlow Control Mode
格式如下,面向连接的基本模式称为B-frame
参数:
Length:Information payload的长度
Channel ID:The channel ID (CID) identifies the destination channel endpoint of the packet.
Infomation payload:就是后面的数据,有可能是L2CAP本身的(比如signal通道),也有可能是上层协议
我们找一个B-frames来看下
其中:
0x0e 0x00 -> payload len是0xe,也就是CID后面黄色长度
0x40 0x00-> CID为0x0040.
格式如下,无连接的基本模式称为G-frame
参数:
Length:InFormation payload PSM的长度
CID:固定0x0002
PSM(Protocol/Service Multiplexer):主要就是用于标识协议的,协议的PSM具体参照,
如下:
Protocol and Service Multiplexers (PSMs)
Protocol | PSM | Reference |
---|---|---|
SDP | 0x0001 | |
RFCOMM | 0x0003 | |
TCS-BIN | 0x0005 | |
TCS-BIN-CORDLESS | 0x0007 | |
BNEP | 0x000F | |
HID_Control | 0x0011 | |
HID_Interrupt | 0x0013 | |
UPnP | 0x0015 | |
AVCTP | 0x0017 | |
AVDTP | 0x0019 | |
AVCTP_Browsing | 0x001B | |
UDI_C-Plane | 0x001D | |
ATT | 0x001F | |
3DSP | 0x0021 | |
LE_PSM_IPSP | 0x0023 | |
OTS | 0x0025 | |
EATT | 0x0027 |
我们的代码定义如下:
/* Protocol and service multiplexor */
#define SDP_PSM 0x0001
#define RFCOMM_PSM 0x0003
#define TCS_BIN_PSM 0x0005
#define TCS_BIN_CORDLESS_PSM 0x0007
#define BNEP_PSM 0x000F
#define HID_CONTROL_PSM 0x0011
#define HID_INTERRUPT_PSM 0x0013
#define UPNP_PSM 0x0015
#define AVCTP_PSM 0x0017
#define AVDTP_PSM 0x0019
#define AVCTP_BROWSING_PSM 0x001B
#define UDI_C_PLANE 0x001D
#define ATT_PSM 0x001F
#define DSP_3_PSM 0x0021
#define LE_PSM_IPSP_PSM 0x0023
#define OTS_PSM 0x0025
#define EATT_PSM 0x0027
InFormation payload:上层协议的数据。
我们没有K-frame的btsnoop,所以就不贴了