低功耗蓝牙协议栈预备知识
最近收到两块中科蓝讯芯片的板子 . 本来只是想跑跑原厂示例代码,调调 api 简单玩一下的,但是后来发现上手没那么简单…至少一些基本的蓝牙协议栈概念是需要学习了解的。本文是我阅读<<低功耗蓝牙开发权威指南>> 以及 www.bluetooth.com 蓝牙官网文档的学习笔记,最终目的是将 NimBLE 协议栈给用起来!想要进一步深入理解低功耗蓝牙协议栈机制的建议去啃官方的文档!
(注意:本文所有的描述都是围绕低功耗蓝牙来讲的,不涉及到经典蓝牙.)
低功耗蓝牙协议栈概览
为了便于理解,我重新画了张框框图,这张图描述了低功耗蓝牙协议栈的结构,在后面章节内容里,我会对每一个框图分章节进行详细描述.
蓝牙协议栈从宏观角度上看大致分为三层: 1. 控制器;2. 主机;3. 应用;
一个蓝牙产品的芯片解决方案分为三种:
- 单芯片解决方案: 一个芯片内部包含(控制器/主机/应用 ).
- 双芯片解决方案:两个芯片,(A 芯片包含应用/主机, B 芯片包含控制器)或者(A 芯片包含应用,B 芯片包含主机/控制器).
- 三芯片解决方案:三个芯片,应用/主机/控制 各一块芯片.
控制器 (Controller)
控制器不仅包含物理层和链路层,还包含直接测试模式以及主机控制器接口的下层部分.
物理层 (PHY)
物理层是蓝牙的基石,控制无线电信号的收发与调制.使用的是 2.4G 无线信号.传输无线电信号时候,控制信号频率,以每个信道的中心频率为基点,高出 185KHZ 的为逻辑 1,低出185KHZ 的为逻辑 0. 物理层每 us 可以传输 1 bit 数据.
链路层 (LL)
链路层用于规范无线电传输.负责 广播/扫描/建立连接/维护连接.
低功耗蓝牙协议栈将 2.4G 频段分为 40 个信道,每个信号的宽度为 2MHZ(经典蓝牙是 79 个信道,1MHZ 宽度) . 其中 37,38,39 为广播信道,其余为数据信道. 广播信道在整个 2.4G 频段内的排列比较特殊,可以看下图所示,之所以这样排列,是为了远离 WIFI 等信号接入点的干扰.具体原因可阅读 <<低功耗蓝牙开发权威指南>> 第七章-信道 章节内容.这里就不再赘述.
链路层一共有五种状态:
- 就绪态
- 广播态
- 扫描态
- 发起态
- 连接态
链路层可以拥有多个独立的状态机,但是一个链路层不能同时成为主从设备。
直接测试模式
直接测试模式允许测试人员直接通过控制器来发送测试数据包。
主机控制器接口(HCI)
主机控制器接口顾名思义,处在主机与控制器之间 。 HCI 既定义了物理接口也定义了逻辑接口。
物理接口
- UART 接口
- 三线 UART 接口
- USB 接口
- SDIO 接口
逻辑接口
逻辑接口定义了 命令/事件/数据的封装格式。
主机 (HOST)
主机构建于 HCI 之上,包含了如下几个模块:
- 逻辑链路控制和适配协议。
- 安全管理器。
- 属性协议。
- 通用属性规范。
- 通用访问规范。
主机对应用层开发来说,并没有规定统一的接口。(所以应用开发需要根据具体的协议栈实现而定?存疑)
逻辑链路控制和适配协议 (L2CAP)
低功耗蓝牙一共使用了三条不同的信道,这三条信道分别用于:
- 属性协议
- 低功耗蓝牙信令
- 安全管理
L2CAP 是一个复用层,可以让低功耗蓝牙复用这三条不同的信道。低功耗蓝牙只支持固定信道,固定信道是指两个设备一建立连接就已经存在的,没有任何配置参数的信道。
安全管理器 (SM)
安全管理器负责蓝牙的配对和密钥的分发。为了保证低功耗蓝牙的绝大多数安全特性必须完成两件事:
- 设备必须互相配对。
- 连接一旦加密,设备必须分配用于加密、保障隐私并对消息进行验证的密钥。
属性协议 (AP)
属性协议定义了客户端与服务器如何相互发送符合标准的信息。一共有六种类型的信息:
- 从客户端发送至服务器的请求;
- 从服务器发送至客户端的回复请求的响应;
- 从客户端发送至服务器的无需响应的命令;
- 从服务器发送至客户端的无需确认的通知;
- 从服务器发送至客户端的通知;
- 从客户端发送至服务器的回复指示的确认;
通用属性规范 (GATT)
通用属性规范位于属性协议之上,定义了属性的类型及其使用方法(包括如何发现与使用服务、特性与描述符的标准方法)。GATT 定义了三种类型的规程:
- 发现规程。
- 客户端发起规程。
- 服务器发起规程。
通用访问规范 (GAP)
通用访问规范定义了设备如何彼此发现、建立连接以及如何实现绑定、同时描述设备如何成为广播者和观察者,并且实现无需连接的数据传输。也定义了如何使用不同类型的地址来实现隐私性和可解析性。
低功耗蓝牙设备一共有四种 GAP 角色:
- 广播者:发送广播报文的设备,通常广播一些服务数据给处于观察者角色的设备。(必须有发射装置)
- 观察者:用于扫描广播者,并且将信息报告给应用的设备。(必须有接收装置)
- 外围设备:利用可连续广播报文进行广播的设备。(发射装置 接收装置 必须同时拥有)
- 中央设备:向外围设备发起连接的设备。(发射装置 接收装置 必须同时拥有)
一个设备可以同时支持多个角色。