一. 声明
本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:蓝牙综合介绍 ,主要介绍蓝牙的一些概念,产生背景,发展轨迹,市面蓝牙介绍,以及蓝牙开发板介绍。
第二篇: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数据格式
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
1. 面向连接的基本模式数据格式(CONNECTION-ORIENTEDCHANNELS IN BASIC L2CAP 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.
2.无连接的基本模式数据格式(CONNECTIONLESS DATACHANNEL IN BASIC L2CAP MODE)
格式如下,无连接的基本模式称为G-frame
参数:
Length:InFormation payload + PSM的长度
CID:固定0x0002
PSM(Protocol/Service Multiplexer):主要就是用于标识协议的,协议的PSM具体参照,
https://www.bluetooth.com/specifications/assigned-numbers/logical-link-control/
如下:
Protocol and Service Multiplexers (PSMs)
Protocol | PSM | Reference |
---|---|---|
SDP | 0x0001 | See Bluetooth Service Discovery Protocol (SDP), Bluetooth SIG |
RFCOMM | 0x0003 | See RFCOMM with TS 07.10, Bluetooth SIG |
TCS-BIN | 0x0005 | See Bluetooth Telephony Control Specification / TCS Binary, Bluetooth SIG |
TCS-BIN-CORDLESS | 0x0007 | See Bluetooth Telephony Control Specification / TCS Binary, Bluetooth SIG |
BNEP | 0x000F | See Bluetooth Network Encapsulation Protocol, Bluetooth SIG |
HID_Control | 0x0011 | See Human Interface Device, Bluetooth SIG |
HID_Interrupt | 0x0013 | See Human Interface Device, Bluetooth SIG |
UPnP | 0x0015 | See [ESDP], Bluetooth SIG |
AVCTP | 0x0017 | See Audio/Video Control Transport Protocol, Bluetooth SIG |
AVDTP | 0x0019 | See Audio/Video Distribution Transport Protocol, Bluetooth SIG |
AVCTP_Browsing | 0x001B | See Audio/Video Remote Control Profile, Bluetooth SIG |
UDI_C-Plane | 0x001D | See the Unrestricted Digital Information Profile [UDI], Bluetooth SIG |
ATT | 0x001F | See Bluetooth Core Specification? |
?3DSP | 0x0021? | ??See 3D Synchronization Profile, Bluetooth SIG. |
?LE_PSM_IPSP | ?0x0023 | ?See Internet Protocol Support Profile (IPSP), Bluetooth SIG |
OTS | 0x0025 | See Object Transfer Service (OTS), Bluetooth SIG |
EATT | 0x0027 | See Bluetooth Core Specification |
我们的代码定义如下:
/* 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,所以就不贴了