蓝牙协议分层

分层

分层的好处主要是分而治之, 将复杂系统模块化; 上层逻辑可以不关心下层实现细节, 简化应用逻辑.

OSI 通信模型

作为一个概念模型, OSI 提供了一个通信系统的基本参考模型, 包括物理层, 数据链路层, 网络层, 传输层, 会话层, 表达层, 应用层. 估计会话层和表达层大家都不太明白, 所以没有看到具体实现.

蓝牙协议分层

App - Profile
L2CAP - L2CAP Channel
Logical - Logical link / Logical Transport
Physical - Physical Link / Physical Channel

用人与人的沟通来说的话, Physical 相当于是沟通所用的语言, 不能鸡同鸭讲. Logical约定了双方沟通要不要确认, 不能说的太小声, 会听不见, 也不能一方一直说的不停, 需要看下对方有没有回应. App 相当于具体的谈话内容, L2CAP 保证了多个谈话内容的对应关系和上下文切换, 一方说完“吃了吗”, 下一句不一定是“吃的是什么”, 可能就是“你丫怎么又胖了”, 另一方需要能够切换的过来.

蓝牙协议实现了 OSI 模型中的物理层和数据链路层, L2CAP 相当于是传输层.

物理层

两个无线系统要能够通信上, 需要在一段时间内确保是同频的, 这样天线和滤波器等才能调整到合适的条件去进行调制解调. 为了支持多个设备, 支持上下行, 支持并发, 就必须在频率或者时间上进行划分, 于是产生了 TDD, FDD 等双工机制. 蓝牙使用的 TDD, 也就是说在上下行都在同一个频率上, 通过时间 slot 来区分上下行. 为了避免干扰, 引入了调频机制, 也就是在通信一段时间后双方都跳往另外一个设定的频率继续通信.

数据链路层

提供了异步通信链路 ACL 和同步通信链路 SCO, 提供了主副之间的双向逻辑通路. ACL可以无限重传,SCO 链路不行,有对应的保留时隙。这里就引入了和物理层的一个耦合关系,设计上还是有点复杂。

L2CAP

L2CAP 提供了 Channel-based 的抽象给应用层, 包括了分包和组包, 数据的合路和分路。这个地方有个 MTU 最大服务单元的概念,MTU 是协议层和应用层的最大处理单元,在物理层仍然会根据使用 2DH5/3DH5 来决定实际空中数据包的大小。

Profile

具体的应用层协议,最为常见的就是 A2DP (用于音乐播放),HFP(打电话),规定了具体的应用逻辑。每个应用可能用到一个或者多个 L2CAP 逻辑信道,实现数据流的传输和控制逻辑的传输。

Host & Controller

Host

介于 Profile 和 HCI 之间的逻辑概念, 主要包括 L2CAP, SDP, ATT, GATT, GAP 等

Controller

HCI 之下的逻辑概念, 主要包括 RF, BB, LMP 等

HCI

HOST 与 CONTROLLER 之间的通信协议,二进制协议,解析需要特定的工具辅助。