(三)BLE协议栈协议分层架构设计详解--图文结合通俗易懂
BLE协议分层
- 1、协议分层概述
- 2、BLE为什么进行协议分层?
- 2.1、核心概念:服务、协议与接口
- 2.2、模块化与抽象
- 2.3、标准化
- 2.4、分层架构:BLE的战略性商业推动力
- 3、BLE是怎样分层的?
- 3.1、主机-控制器接口(HCI)
- 3.2、低功耗蓝牙协议栈各层及其核心功能摘要
- 4、BLE每层的具体内容是什么?
- 4.1、BLE控制器层深度分析
- 4.1.1 、物理层(PHY):无线电
- 4.1.2、链路层(LL):无线电的管理者
- 4.1.3、PHY层的演进:反映BLE不断扩大的市场雄心
- 4.2、BLE主机层全面剖析
- 4.2.1、逻辑链路控制与适配协议(L2CAP)
- 4.2.2、安全管理器(SM)
- 4.2.3、属性协议(ATT):属性概念
- 4.2.4、通用属性规范(GATT):数据框架
- 4.2.5、通用访问规范(GAP)
- 5、实践应用:BLE协议栈中数据封装与流转
- 6、小节
1、协议分层概述
闲话:我们要想了解一个东西或者一个对象,首先最简单的思维模型就是就是黄金思维圈:它为什么要这样划分?用什么方法进行划分的?具体的划分内容是什么?搞懂这三方面,也就对他们有一定的理解了,再加上实践消化和反馈,就会融会贯通。
本文主要讲述层架构的根本原因、关键技术的发展历程以及各层级的核心功能。BLE协议栈采用分层架构,这并非偶然,而是遵循了现代网络工程中模块化、抽象化和标准化的核心设计原则。这种架构将复杂的通信问题分解为一系列独立且易于管理的功能模块,极大地简化了开发、调试和维护过程,同时促进了不同厂商设备间的互操作性,为构建一个开放、竞争和创新的物联网(IoT)生态系统奠定了基础。
本文详细解构BLE协议栈的两大核心部分:控制器(Controller)和主机(Host)。控制器包含物理层(PHY)和链路层(LL),负责处理所有与无线电相关的实时、时序关键型任务,如信号调制、频率跳变和数据包收发。主机则包含逻辑链路控制与适配协议(L2CAP)、安全管理器(SM)、属性协议(ATT)、通用属性规范(GATT)和通用访问规范(GAP),负责处理更高级的逻辑功能,如数据复用、安全管理、数据组织与发现以及连接控制。通过对这些层级的逐一分析,旨在让初学者更好了解BLE协议分层。
2、BLE为什么进行协议分层?
在探讨低功耗蓝牙协议栈(BLE)的具体细节之前,必须首先理解其设计的基石——分层协议架构。这种架构并非BLE所独有,而是现代网络通信(如OSI和TCP/IP模型)普遍采用的战略性设计方法 。其核心目标是将一个庞大而复杂的通信系统,分解为一系列更小、更易于管理的功能层,每一层都具有明确定义的职责 。
2.1、核心概念:服务、协议与接口
分层架构的运作依赖于三个核心元素:服务(Service)、协议(Protocol)和接口(Interface)。
- 服务:指下层向上层提供的一组功能。每一层都利用其下一层提供的服务来完成其任务,并向其上一层提供更为高级、更为抽象的服务 。
- 协议:是一套规则,规定了位于不同设备上的对等层(Peer Layer)之间如何进行通信。它定义了交换信息的格式、顺序以及收发信息时所采取的行动 。
- 接口:定义了在同一设备上,相邻层之间传递数据和控制信息的方式。它明确了上层如何调用下层的服务。
2.2、模块化与抽象
分层架构最显著的优势在于其模块化(Modularity)和抽象化(Abstraction)。
模块化意味着每一层的功能都是独立的。这种“关注点分离”(Separation of Concerns)的设计使得各层可以独立开发、测试和更新。只要层与层之间的接口保持不变,对某一层的实现进行修改(比如,升级物理层的无线电硬件或切换传输介质)就不会影响到其他层的功能 。比如,开发者可以从有线网络切换到无线网络,而无需修改高层的Web浏览器或邮件应用程序,因为传输介质的改变仅影响物理层和数据链路层 。这种特性是技术能够快速迭代和演进的关键推动力。
抽象化则向上层隐藏了下层的复杂实现细节。高层协议的开发者无需关心数据是如何在物理介质上传输的。例如,一个使用GATT(通用属性规范)进行数据交换的应用程序开发者,完全不必了解底层链路层的跳频算法或物理层的CRC(循环冗余校验)计算 。这种抽象极大地降低了开发门槛,使开发者能够专注于应用逻辑本身,从而加速创新。
2.3、标准化
分层模型为网络通信提供了一个通用的语言和参考框架,这对于实现标准化(Standardization)和互操作性(Interoperability)至关重要。
-
通用参考框架:像OSI这样的模型为所有开发者和制造商提供了一个共同的理解基础,确保了来自不同供应商的设备能够使用标准协议进行有效通信 。
-
简化设计与故障排查:通过将网络功能划分为逻辑上解耦的层次,整个系统的设计和管理变得更加简单。当出现问题时,网络专业人员可以将问题隔离到特定的层级,从而显著缩短调试和定位根本原因的时间 。
-
促进健康的生态系统:标准化避免了“供应商锁定”(Vendor Lock-in)的风险,允许市场上有多种实现方案共存和竞争。这促进了更快的研究与开发,因为不同的团队可以专注于不同层级的技术创新,从而共同推动整个技术生态系统的发展。
2.4、分层架构:BLE的战略性商业推动力
将这些原则应用于BLE,我们可以看到,分层架构不仅仅是一种技术上的最佳实践,更是一项根本性的商业和生态系统战略。它巧妙地将硬件和软件的创新速率解耦,从而催生了一个多元化且充满竞争力的市场。
这一战略的实现逻辑如下:首先,技术上的模块化(如“一层中的变化不影响其他层”)和标准化(如“更快的研发”)带来了显著的市场优势,例如避免“供应商锁定”。将这些点联系起来,便揭示了一个更深层次的战略意图。一个芯片供应商(如Nordic、TI或Silicon Labs)可以将其研发资源集中在创建高度优化的控制器(即PHY和LL层的硬件与固件)上。与此同时,成千上万的独立软件公司可以在主机层之上构建创新的应用程序。
这种分离意味着应用程序开发者无需成为射频工程师,而芯片设计师也无需成为用户界面专家。它允许一个原始设备制造商(OEM)为其硬件选择一流的控制器,并将其与自己独特的应用软件相结合,而无需从头构建整个协议栈。这极大地降低了进入门槛,缩短了产品上市时间,并最终推动了我们今天所见的丰富多样的BLE设备生态系统的形成。因此,BLE协议栈的分层设计是其在全球物联网市场取得巨大成功的关键战略支柱。
3、BLE是怎样分层的?
低功耗蓝牙协议栈的整体架构划分为三个基本的构建块:应用程序(Application)、主机(Host)和控制器(Controller)。这种划分是BLE设计的核心,它定义了软件与硬件、逻辑与物理之间的界限。
-
应用程序(Application):位于协议栈的最顶层,是面向用户的代码。它利用主机提供的服务来实现特定的用例,例如,一个健身追踪应用程序通过GATT服务读取心率数据 。
-
主机(Host):包含协议栈的上层部分,即逻辑链路控制与适配协议(L2CAP)、安全管理器(SM)、属性协议(ATT)、通用属性规范(GATT)和通用访问规范(GAP)。主机负责处理通信的逻辑方面,如数据流控制、安全性、数据组织以及设备发现和连接管理。它通常作为软件库在设备的主处理器上运行 。
-
控制器(Controller):包含协议栈的底层部分,即物理层(PHY)和链路层(LL)。它负责处理所有与无线电信号物理传输相关的任务,是协议栈中对时序要求最为严格的部分。控制器通常由硬件(无线电收发器)和运行在其上的低级固件共同实现,处理所有实时的、时序关键的操作,如数据包的发送和接收、跳频序列管理以及链路建立 。
3.1、主机-控制器接口(HCI)
连接主机和控制器的桥梁是主机-控制器接口(Host-Controller Interface, HCI)。HCI是一个标准化的通信协议,它精确定义了主机和控制器之间如何交换命令、事件和数据 。本质就是一个接口, 当方案实现架构需要 HIC 通信时, 是完成 Host 和Controller 两者之间的通信协议层。
HCI的存在使得主机和控制器可以被物理地分离。根据系统设计的不同,HCI的实现方式也有所区别:
-
在单芯片(System-on-Chip, SoC)方案中,主机和控制器运行在同一个芯片上,HCI通过软件API或内部消息队列实现。
-
在双芯片方案中,主机和控制器位于不同的芯片上,HCI通过物理传输层(如UART、SPI或USB)进行通信 。
HCI通信依赖于三种基本的数据包类型:
-
命令包(Command Packets):由主机发送给控制器,用于指示控制器执行特定操作(例如,开始扫描)。
-
事件包(Event Packets):由控制器发送给主机,用于通知主机已发生的事件(例如,发现了一个设备或连接已建立)。
-
数据包(Data Packets):在主机和控制器之间双向传输,用于承载上层应用数据(ACL数据)。
主机-控制器分离:功耗管理与系统设计的核心策略
主机与控制器之间的明确分离,这一架构设计源自于经典蓝牙(Classic Bluetooth),在BLE中被战略性地保留并优化,成为其实现超低功耗设计的基石。它通过允许耗电量大的应用处理器(运行主机)长时间处于深度睡眠状态,同时由一个高效的低功耗核心(运行控制器)来管理对时序要求严格的无线电操作,从而实现了精密的功耗管理。
这一设计的背后逻辑是系统级的功耗优化。无线电协议具有严格的时序要求,例如,必须在精确的时刻(连接事件)唤醒以收发数据。要管理这些时序,需要一个处理器保持活跃。如果将所有协议栈逻辑都放在主应用处理器上,那么为了满足这些微秒级的时序要求,这个强大的处理器就必须频繁唤醒,甚至无法进入深度睡眠,这将导致巨大的功耗。
通过将对时序敏感的链路层(LL)逻辑放入一个专用的、小型的、高度优化的控制器核心中,系统可以将主要的、功能强大的应用处理器(运行用户应用和主机协议栈)在绝大部分时间里置于深度睡眠模式。HCI此时扮演了消息总线的角色。只有当控制器接收到需要应用层面处理的数据,或者发生了重要的链路事件(如连接建立或断开)时,它才会通过一个HCI事件来唤醒主机。这种架构选择是实现BLE功耗效率目标的基础,是一种深思熟虑的、旨在优化功耗的软硬件协同设计策略。
3.2、低功耗蓝牙协议栈各层及其核心功能摘要
下表提供了一个BLE协议栈各层的高级概览,作为后续深入分析的路线图。
低功耗蓝牙协议栈各层及其核心功能摘要 | ||
---|---|---|
协议栈模块 | 层级名称 | 核心功能/职责 |
控制器 | 物理层 (PHY) | 负责无线电收发,处理比特流的调制/解调和频率选择。 |
链路层 (LL) | 管理无线电状态,定义设备角色(主/从),控制连接、广播和扫描过程。 | |
主机 | 逻辑链路控制与适配协议 (L2CAP) | 提供协议复用,数据包的分段与重组,管理逻辑信道。 |
安全管理器 (SM) | 负责配对、绑定、加密和认证,保障通信安全。 | |
属性协议 (ATT) | 定义客户/服务器模型,用于发现、读取和写入被称为“属性”的数据。 | |
通用属性规范 (GATT) | 在ATT之上构建服务框架,定义了服务、特征和描述符的数据层次结构。 | |
通用访问规范 (GAP) | 定义设备发现、连接建立的流程和模式,管理设备在网络中的角色。 |
4、BLE每层的具体内容是什么?
开始之前,我们先总结一下BLE的协议框架,后面章节会根据该框架,采用自下向上的方法逐层分析介绍。如下面图片1所示,BLE的协议可分为Bluetooth Application和Bluetooth Core两大部分,而Bluetooth Core又包含BLE Controller和BLE Host两部分。
4.1、BLE控制器层深度分析
控制器是BLE协议栈的基石,它直接与硬件交互,负责将数字比特流转换为无线电波,并在空中进行可靠传输。它由物理层(PHY)和链路层(LL)组成。
4.1.1 、物理层(PHY):无线电
物理层(PHY)是协议栈的最底层,它定义了BLE设备如何利用无线电波进行通信。它涵盖了所有与射频(RF)相关的物理特性 。
-
射频频谱:BLE工作在无需授权的2.4 GHz工业、科学和医疗(ISM)频段,具体频率范围为2.4000 GHz至2.4835 GHz。这个频段与Wi-Fi、经典蓝牙以及许多其他无线技术共享,因此抗干扰性是其设计的重要考量 。
-
信道化:该频段被划分为40个射频信道,每个信道带宽为2 MHz。这些信道并非全部用于相同目的:
-
广播信道:信道37(2402 MHz)、38(2426 MHz)和39(2480 MHz)被指定为主要广播信道。设备在这三个信道上发送广播包,以被其他设备发现。将广播信道设置在频段的两端和中间,是为了最大限度地减少与Wi-Fi信道的持续冲突 。
-
数据信道:信道0至36用于已建立连接的设备之间的数据交换 。
-
频率/MHz | 信道编号 | 类型 |
---|---|---|
2402 | 37 | 广播信道 |
2426 | 38 | 广播信道 |
2480 | 39 | 广播信道 |
2404 | 0 | 数据信道 |
2406 | 1 | 数据信道 |
2408 | 2 | 数据信道 |
2410 | 3 | 数据信道 |
2412 | 4 | 数据信道 |
2414 | 5 | 数据信道 |
2416 | 6 | 数据信道 |
2418 | 7 | 数据信道 |
2420 | 8 | 数据信道 |
2422 | 9 | 数据信道 |
2424 | 10 | 数据信道 |
2428 | 11 | 数据信道 |
2430 | 12 | 数据信道 |
2432 | 13 | 数据信道 |
2434 | 14 | 数据信道 |
2436 | 15 | 数据信道 |
2438 | 16 | 数据信道 |
2440 | 17 | 数据信道 |
2442 | 18 | 数据信道 |
2444 | 19 | 数据信道 |
2446 | 20 | 数据信道 |
2448 | 21 | 数据信道 |
2450 | 22 | 数据信道 |
2452 | 23 | 数据信道 |
2454 | 24 | 数据信道 |
2456 | 25 | 数据信道 |
2458 | 26 | 数据信道 |
2460 | 27 | 数据信道 |
2462 | 28 | 数据信道 |
2464 | 29 | 数据信道 |
2466 | 30 | 数据信道 |
2468 | 31 | 数据信道 |
2470 | 32 | 数据信道 |
2472 | 33 | 数据信道 |
2474 | 34 | 数据信道 |
2476 | 35 | 数据信道 |
2478 | 36 | 数据信道 |
-
调制方式:BLE采用高斯频移键控(Gaussian Frequency-Shift Keying, GFSK)进行调制。这是一种二进制频率调制技术,通过微小的频率偏移来表示数据比特‘0’和‘1’。GFSK具有实现简单、功耗效率高的优点,非常适合BLE的低功耗设计目标 。
-
跳频技术:为了在拥挤的2.4 GHz频段中保持通信的鲁棒性,BLE在数据信道上使用了自适应跳频扩频(Adaptive Frequency Hopping Spread Spectrum, AFHSS)技术。在连接期间,主从设备会按照一个预先商定的伪随机序列,在37个数据信道之间不断切换通信频率。自适应机制能够检测并避开那些受到严重干扰的信道,从而显著提高通信的可靠性 。
-
PHY变体(蓝牙5.0及以后):蓝牙5.0的发布是BLE物理层发展的一个里程碑,它引入了多个PHY选项,使得BLE能够适应更多样化的应用场景:
-
LE 1M PHY:这是最初的、所有BLE设备都必须支持的标准PHY,数据传输速率为1 Mbps 。
-
LE 2M PHY:这是一个可选的高速PHY,数据速率提高到2 Mbps。它通过更宽的频率偏移实现,代价是牺牲了少许的接收灵敏度(即通信距离)。它非常适用于需要更高吞吐量的应用,如固件空中升级(OTA)或传输大量传感器数据 。
-
LE Coded PHY:这是一个可选的远距离PHY。它通过引入前向纠错(Forward Error Correction, FEC)编码技术,以牺牲数据速率为代价,显著提高了通信距离。数据在传输前会被编码,增加了冗余信息,使得接收端能够在信号较弱或有噪声的情况下恢复原始数据。它支持两种编码方案,分别对应125 kbps和500 kbps的数据速率 。
-
4.1.2、链路层(LL):无线电的管理者
如果说PHY是BLE的"肌肉",负责执行物理传输,那么链路层(Link Layer, LL)就是控制器的"大脑"。它在OSI模型中大致对应于媒体访问控制(MAC)子层,负责控制PHY的状态,并管理设备之间的逻辑链路 。
核心职责:LL的核心职责是定义设备“何时”以及“如何”使用PHY进行通信。频道选择,数据链路层,负责数据包收发,保证通信链路稳定性。它管理着BLE通信的所有基本流程,包括广播、扫描和连接。
状态机:LL的运行可以通过一个定义明确的状态机来描述。设备在任何时刻都处于以下状态之一 :
-
待机状态(Standby State):设备的默认空闲状态,不进行任何发送或接收。直到接收到主机的命令。就绪态可以进入广播态、扫描态或者发送态(就是进不了连接态)。 从其他的任何状态都能进入就绪态。
-
广播状态(Advertising State):设备在广播信道上周期性地发送广播包,以宣告自身存在或广播数据。注意,并不是所有的蓝牙一定要有发送和接收机。例如,当广播者仅仅是广播自己而不让其他设备进行连接时,就可以只需要发送机而不需要接收机。广播态的设备停止广播可以进入就绪态,也可以收到发起者的连接请求后进入连接态。
-
扫描状态(Scanning State):设备在广播信道上监听广播包。它有两个子状态:被动扫描和主动扫描。
-
被动扫描态, 设备只能被动的扫描,不能发送任何报文,因此,被动扫描可在只有接收机的设备中实现, 以控制成本。
-
主动扫描中,链路层一旦发现了新的广播态设备,都会发送扫描请求, 并等待该请求的响应。扫描请求和响应报文都是在广播通道中传输。
-
-
发起连接状态(Initiating State):设备在监听到一个可连接的广播包后,发送连接请求以建立连接。如果收到了来自该设备的广播报文,链路层会向其发送连接请求并进入链接状态,并假设广播者也进入了连接状态,这个假设是什么意思呢?就是发起态发送连接请求后就会进入数据通道,不管和对方有没有真正建立连接,都假设已经建立,在数据通道过程中进行数据包发送,如果能应答说明连接建立,如果发送数据包应答超时,那么连接失败发起态进入就绪态。
-
连接状态(Connection State):设备与另一个设备建立了连接,在数据信道上周期性地交换数据包。
-
主机只能从发起态进入,必须向对端设备发起连接,并且主设备必须定期向从设备发送报文(即链接事件),从设备只能回复主机发送的报文时才能发送自己的数据。
-
从机只能从广播状态进入, 必须向对端设备进行广播, 对于从设备是没有主动发送数据的能力,只有当主机发起了连接事件后,从机才能发送自己的数据, 如果从机有更多的数据需要发送,那么将继续在同一个连接事件同一个信道上进行报文交互,当然如果从机没有数据需要发送,也可以忽略主机发送的连接事件以达到节能的目的。
-
连接中的设备角色:在连接状态下,设备扮演以下两种角色之一:
-
中心设备(Central)或主设备(Master):发起连接的设备,通常是智能手机或电脑。中心设备负责定义连接的时序参数,如连接间隔(Connection Interval),并主导跳频序列 。
-
外围设备(Peripheral)或从设备(Slave):接受连接请求的设备,通常是传感器、健身手环等。外围设备严格遵循中心设备设定的时序进行通信 。
数据包结构:LL定义了在空中传输的数据包的精确格式。一个标准的LL数据包包含以下几个部分 :
-
前同步码(Preamble):一个固定的比特序列,用于接收端进行频率同步和定时。
-
接入地址(Access Address):一个32位的数值,用于标识一个特定的物理链路。在广播时使用固定的接入地址,在连接中则使用一个随机生成的唯一地址。
-
协议数据单元(PDU):这是数据包的有效载荷,其内容由LL的上层(即主机)提供。PDU的长度是可变的。
-
循环冗余校验(CRC):一个24位的校验和,用于检测数据在传输过程中是否出错。
4.1.3、PHY层的演进:反映BLE不断扩大的市场雄心
蓝牙5.0中引入的LE 2M PHY和LE Coded PHY不仅仅是一次技术升级,它标志着BLE从一个单一用途的低速协议,转变为一个灵活的无线工具包。这一演变反映了蓝牙技术联盟(Bluetooth SIG)的一项战略决策:将BLE的应用市场从个人区域网络扩展到高吞吐量和远距离物联网应用领域,从而直接与其他无线标准展开竞争。
这一战略演进的逻辑路径清晰可见。蓝牙4.x时代仅有的LE 1M PHY足以满足其最初的目标市场——可穿戴设备和简单传感器,这些设备通常只发送少量、非频繁的数据包 。然而,随着物联网市场的发展,新的需求应运而生。
LE 2M PHY的出现直接解决了对更高吞吐量的需求。在1M PHY上进行固件空中升级(OTA)或传输大量传感器日志的过程非常缓慢,严重影响用户体验。将速度翻倍不仅改善了现有应用,还为新的应用场景(如传输更高质量的传感器数据)打开了大门。
而LE Coded PHY的引入则更具战略意义。它通过牺牲速度换取了通信距离的显著增加 。这一举措使BLE有能力在某些应用场景中,成为其他低功耗广域网(LPWAN)技术(如LoRaWAN或NB-IoT)的有力竞争者。例如,在大型仓库中进行资产追踪,或在农田中部署传感器网络,这些过去被认为是BLE力所不能及的领域,现在都成为了可能。
因此,PHY层的演进清晰地表明,蓝牙技术联盟的愿景是让BLE成为覆盖从短距离、高速度到远距离、低速度等更广泛物联网应用场景的主导协议。
4.2、BLE主机层全面剖析
主机位于控制器之上,是BLE协议栈中以软件为中心的部分。它负责处理所有高级逻辑功能,并为应用程序提供API接口。主机由多个协同工作的逻辑层组成,包括L2CAP、SM、ATT、GATT和GAP。
4.2.1、逻辑链路控制与适配协议(L2CAP)
LL 层只关心传输的数据本身, L2CAP 就要区分是加密通道还是普通通道,同时还要对连接间隔进行管理。L2CAP层位于主机协议栈的底层,直接与HCI接口交互。它扮演着一个关键的“交通枢纽”角色,为上层协议提供逻辑信道,并负责数据的分段和重组 (规范4.2开始,增强的基于信用的流控模式)。
-
协议复用(Protocol Multiplexing):在一个BLE连接中,物理链路上只有一个数据流。然而,主机的上层可能有多个协议(如ATT和SM)需要同时传输数据。L2CAP通过信道标识符(Channel Identifiers, CIDs)来实现协议复用。它为每个上层协议分配一个逻辑信道,并在L2CAP数据包头中加入CID字段。当接收端收到一个L2CAP包时,它会检查CID,以确定应将数据包的有效载荷递交给哪个上层协议处理 。例如,ATT协议使用固定的CID:0x0004,而SM协议使用 0x0006 。
- 下面表可以比喻为:为L2CAP层提供一个“地址簿”,使其能够正确地将数据分发给不同的上层协议(ATT, SMP等);定义了蓝牙协议中不可或缺的核心系统服务的“门牌号”。
CID | Description | Notes |
---|---|---|
0x0000 | Null identifier | Not used (ever) |
0x0001 | L2CAP Signaling Channel | Used over BR/EDR |
0x0002 | Connectionless Channel | Used over BR/EDR |
0x0003 | AMP Manager Protocol | Used over BR/EDR |
0x0004 | Attribute Protocol | Used over LE only |
0x0005 | LE L2CAP Signaling Channel | Used over LE only |
0x0006 | Security Manager Protocol | Used over LE only |
- 分段与重组(Segmentation and Reassembly, SAR):上层协议(特别是ATT)可能需要传输大于链路层PDU最大载荷的数据块。L2CAP负责将这些大的数据包(称为SDU)分割成多个较小的片段,使其能够封装在LL PDU中进行传输。在接收端,L2CAP再将这些片段重新组装成原始的、完整的数据包,然后递交给上层协议 。这个过程对上层是透明的,使得应用层可以处理高达64KB的数据单元 (蓝牙4.2规范开始)。
- 流量控制(Flow Control):对于某些信道模式(如面向连接的信道),L2CAP还提供基于信用的流量控制机制。接收端会给予发送端一定数量的“信用点”(credits),每发送一个数据包消耗一个信用点。当信用点耗尽时,发送端必须停止发送,直到从接收端获得新的信用点。这可以防止快速的发送设备淹没处理能力较慢的接收设备,确保通信的稳定性 。
4.2.2、安全管理器(SM)
安全管理器(Security Manager, SM)负责BLE连接中的所有安全相关事宜。它定义了一套协议和流程,用于在两个设备之间建立一个安全的、加密的链路 。 定义了 BLE 通信两端设备的配对方法和密钥分发的工作模式,提供了一系列加密算法(例如AES),为 BLE 通信提供了加密、认证等安全保障。它与 GAP 层密切相关,关于安全需求的一些配置是在 GAP 层中完成的。
核心安全流程:
- 配对(Pairing):这是两个设备首次建立信任关系的过程。在此过程中,它们会根据选择的配对方法(如Just Works、Passkey Entry等)交换或生成一个临时的密钥。
- 加密(Encryption):一旦配对完成并生成了短期密钥(Short Term Key, STK),链路就可以使用AES-128 CCM算法进行加密。所有后续的数据交换都将在加密的链路上进行,以防止窃听 。
- 绑定(Bonding):如果设备希望在未来重新连接时不必重复配对过程,它们可以选择绑定。在绑定过程中,设备会交换并存储长期密钥(Long Term Keys, LTKs)和其他身份信息。当设备下次重连时,它们可以直接使用存储的密钥来快速加密链路。
- 认证(Authentication):配对过程可以提供认证,以确保用户连接到的是正确的设备,防止中间人攻击(Man-in-the-Middle, MITM)。
安全模式:
这两种模式的区别就是 mode1 是将 LL 层的净荷数据(不包括包头包尾)加密使其由明文变成密文,而 mode2 则是在数据中传送相应签名告知接收方,相当于印章的作用, CSRK 密钥用于数字签名的解析。
向下兼容:对于同一种模式,等级是向下兼容的,例如配置主机为 level3,从机为 level4,那么在配对时,两者最高只能走 level3 的配对模式。
安全问题:
- 窃听:当采用 mode1_level1 和 mode2_level1 模式时,空中包数据就会被抓住。
- MIMT 攻击:中间人攻击是指第三方设备混入 BLE 通信链路之间,伪造通信数据迷惑双方。假如设备 A 和设备 B 在通信之始,设备 M 注意到二者要进行通信,设备 M 截取设备A 发起的连接请求,伪装成设备 B 跟其建立连接进行通信,通信完毕后再伪装成设备 A向设备 B 发起连接请求,建立连接后重复设备 A 在前面发送的数据。这样设备 A 就一直以为在跟设备 B 进行通信,设备 B 也同样,却不知二者中间还藏着一个主从一体的第三者。
- 追踪:如果设备地址不变的话,就可以根据 MAC 地址信息追踪广播设备的位置, 手机系统一般都会启动随机地址来预防这个威胁(定时更改设备地址)。
4.2.3、属性协议(ATT):属性概念
ATT和GATT是BLE中数据交换的核心。它们共同定义了一个简单而强大的客户端-服务器架构,用于组织和传输应用数据。BLE协议栈中,开发者接触最多的就是ATT。简单来说,ATT层用来定义用户命令及命令操作的数据,比如读取某个数据或者写某个数据。
ATT:协议基础:属性协议(Attribute Protocol, ATT)是GATT的基础,它定义了最基本的数据交换单元和操作。在ATT模型中,一个设备(服务器)暴露一组被称为“属性”的数据。另一个设备(客户端)可以通过ATT协议来发现、读取或写入这些属性 。
每个属性由四个部分组成 :
- 属性句柄(Attribute Handle):一个16位用作识别 Attribute server 上的所有 Attribute 的唯一标识。取值范围 0x0001~0xffff。通过属性句柄可以操作多个同样类型的属性:同一类型的多个 Attribute,可以组成一个 Group, 客户端 client 可以通过这个 Group 中的起始 handle 访问所有的Attributes。
- 属性类型 (Attribute Type):一个通用唯一标识符(UUID),用于定义该属性代表什么样的数据(例如,心率测量值)。区分当前属性是服务项、 特征值还是描述符。 使用UUID 区分, 有 2 或 16 字节两类,一般 2 字节表示的都是官方规定过的类型(具体参考《16-bit UUID Numbers Document.pdf》),而用户自定义的 UUID 都是 16bytes 的。
类别 | UUID | 说明 |
---|---|---|
标准服务类型 | 0x1800 – 0x26FF | 由SIG定义的标准GATT服务 |
计量单位 | 0x2700 – 0x27FF | 由SIG定义的标准计量单位 |
属性类型 (Attribute Types) | 0x2800 – 0x28FF | GATT中用于声明的属性类型 (总范围) |
0x2800 | Primary Service (首要服务) | |
0x2801 | Secondary Service (次要服务) | |
0x2802 | Include (包含服务) | |
0x2803 | Characteristic (特征声明) | |
描述符类型 | 0x2900 – 0x29FF | 由SIG定义的GATT描述符 |
特征值类型 | 0x2A00 – 0x7FFF | 由SIG定义的GATT特征 |
-
属性值 (Attribute Value):属性所包含的实际数据。而属性值 (Attribute Value) 的内容,则根据属性类型 (Attribute Type) 的不同而不同:
- 如果类型是“服务声明”: 值为服务的UUID。
- 如果类型是“特征声明”: 值为 {操作权限, 值句柄, 特征UUID} 的组合数据。
- 如果类型是“特征值”: 值为实际的用户数据(温度、电量、文本等)。
- 如果类型是“特征用户描述描述符”: 值为一段描述性文本(比如“设备电量”)。
- 如果类型是“客户端特征配置描述符”: 值为 0x0000, 0x0001 或 0x0002,用来开启或关闭通知/指示。
-
属性权限 Attribute Permissions:对属性值的一种保护,有 5 类,每一类又可分为“可读、可写、可读写”。
-
访问有关的权限(使用许可)
-
加密有关的权限
-
认证有关的权限(认证许可)
-
安全连接权限
-
授权有关的权限(授权许可)
-
ATT定义了六种PDU类型:请求、响应、命令、确认、通知和指示(如下图)。
- 请求( Request)PDU是由客户端发送给服务器,请求回复。
- 响应(Response,)PDU是服务器在请求回复时对客户端的回复。
- 命令(Command)PDU是由客户端发送给服务器,不需要回复。
- 通知(Notification, )PDU是由服务器发送给客户端,不需要回复。
- 指示(Indication)PDU是由服务器发送给客户端,需要回复。
- 确认(Confirmation)PDU是客户端发送给服务器,作为对指示的回复。
这些PDU类型使得在BLE堆栈的ATT层中,客户端和服务器(CS架构)之间能够进行信息和控制的交换。
4.2.4、通用属性规范(GATT):数据框架
GATT:结构化框架:通用属性规范(Generic Attribute Profile, GATT)位于ATT之上,它利用ATT提供的机制,定义了一个用于组织属性的、有意义的层次结构。GATT使得数据交换变得标准化和可互操作 。
GATT的层次结构如下 :
-
服务(Service):一组相关特征的集合,代表了设备的一个特定功能或特性。指一系列有数据和相关行为组合的集合,为了去完成某个特定的功能,服务项本身并不是包含数据,仅仅相当于一个容纳特征值的容器。一个服务由:服务声明、 0 个或多个包含定义 Include、 1 个或者多个特征值Characteristic 组成,服务的定义从服务声明开始, 到下一个服务声明或者句柄 0xFFFF 结束。服务类型包含下面:
- 主要服务:暴露设备的主要可用功能,例如有一台支持心率计的蓝牙设备,那么心率计将被实例化为首要服务。
- 次要服务:旨在由主要服务引用,不需要被客户端直接访问或者不需要客户端理解的行为和特性的服务。只能被首要服务用 Include 包含引用,当然首要服务也可以引用首要服务。
- 扩展服务:当扩展A服务的时候,来保证其兼容性。
- 结合服务:引用其他服务,融合在一起,成为其他组合的行为。
-
特征(Characteristic):这是应用数据的基本容器。一个特征包含一个值(Value)以及描述该值如何被访问的属性(Properties)(如可读、可写、可通知等)。一个特性Characteristic包含3个基本的要素:特性声明,声明的属性值的声明,特性描述符。
- 声明(declaration):声明是一个特征的开始—性质(读取/写入/通知/指示/广播/命令/签名认证;数值句柄—特性值的存储位置;特性UUID)
- 声明属性值(value):包含此特性的实际值
- 描述符(descriptors):描述符包含此特性的附加信息或配置。附加信息;任何数量;任何顺序;可以是供应商特定的
-
描述符(Descriptor):一个可选的属性,用于提供关于特征值的附加信息,例如,一个人类可读的描述(“每分钟心跳次数”)或值的单位。
- 客户端特性配置描述符(CCCD):有时候client不想监听characteristic notify或者indicate过来的数据,那么就可以使用CCCD来关闭characteristic 的notify或者indicate功能,如果client又需要监听characteristic 的notify或者indicate,俺么它可以重新使能CCCD来打开相关操作,总结一下,当characteristic 具有notify或者indicate操作功能时,那么必须添加CCCD,以方便cilent来使能或者禁止notify功能。
通过GATT,客户端可以发现服务器上的所有服务及其特征,然后根据特征的属性来读取或写入数据,或者订阅通知(Notification)/指示(Indication)以在数据变化时获得自动更新。
Ble设备里面会提供多个Service,这些Service会提供一些特定的功能。而每个Service里面有会有多个Characteristic,这些Characteristic里面的value实际就是功能具体的属性值。
例如电池服务Battery Service里面就有一个Characteristic叫做Battery Level,手机可以读取这个Characteristic的value值来获取Ble设备当前的电量。我们来看看实际设备读取出来的数据:
1.4.4.6 规程
GATT还定义了一些用来发现和使用服务service、Characterstic与Descriptor的标准方法,例如“发现服务信息、客户端发起通信、MTU交换”等规程,提供通用、信息的存储和共享等功能。
GATT规程可以分为三种基本的类型:
- 发现规程
- 客户端发起规程
- 服务器发起规程
4.2.5、通用访问规范(GAP)
通用访问规范(Generic Access Profile, GAP)定义了设备如何与外部世界进行交互,是BLE网络行为的最高层控制器。它规定了设备如何被发现、如何建立连接,以及如何管理安全 。 从编程视角来看, GAP 中的内容就像是一个 config 文件, BLE 协议栈其他层的工作,都要从 GAP 中获取初始化参数和配置信息。GAP 中定义了一系列模式(Mode)和规(Procedure),二者相互配合,完成广播和连接的工作,部分模式规程如下表所示。
主要角色:GAP定义了设备在网络中可以扮演的宏观角色 :
- 广播者(Broadcaster):仅发送广播数据,不可连接。例如,一个发送室内位置信息的iBeacon设备。
- 观察者(Observer):仅扫描并接收广播数据,不发起连接。
- 外围设备(Peripheral):发送可连接的广播包,并接受连接请求。这是典型的传感器设备角色。
- 中心设备(Central):扫描并向外围设备发起连接。这是典型的智能手机或网关角色。
核心流程:GAP定义了实现这些角色的具体流程,包括:
- 广播(Advertising):设备如何配置和发送广播包。
- 扫描(Scanning):设备如何发现正在广播的其他设备。
- 连接建立(Connection Establishment):中心设备如何向外围设备发起连接。
- 安全启动:GAP负责启动由安全管理器(SM)执行的安全流程。
GAP与GATT的二元性:BLE互操作性与灵活性的核心
GAP和GATT之间的关系是理解BLE强大功能和广泛采用的关键。它们共同构成了BLE通信模型的支柱,但职责明确分离:GAP定义了通信的“方式”(如何发现设备并与之连接),而GATT定义了通信的“内容”(设备提供什么数据以及如何使用这些数据)。
这种优雅的分离带来了巨大的灵活性。GAP的角色(如中心设备/外围设备)关注的是网络链路本身的拓扑和状态 。而GATT则定义了一个完全独立的客户端/服务器数据模型 。重要的是,GATT的服务器角色并不与GAP的外围设备角色绑定,尽管它们在实践中经常同时出现。一个GAP中心设备(如智能手机)几乎总是GATT客户端,但它也可以同时作为GATT服务器,向连接的设备暴露自己的服务(例如,提供时间信息)。
这种解耦的能力非常强大。以一个智能恒温器为例:
- 它作为GAP外围设备,广播自身并等待手机(GAP中心设备)的连接。
- 连接后,它作为GATT服务器,暴露一个“恒温器服务”,让手机(GATT客户端)可以读取当前温度或写入新的目标温度。
- 同时,这个恒温器还可以扮演GAP中心设备的角色,去扫描并连接一个室外的无线温度传感器(GAP外围设备)。
在这种连接中,恒温器则扮演GATT客户端的角色,从室外传感器(GATT服务器)读取温度数据。
这种根据应用场景灵活组合GAP和GATT角色的能力,正是由GAP的“方式”和GATT的“内容”之间的明确分离所实现的。这是实现复杂多样的现代物联网用例的基础架构原则,也是BLE能够兼具标准化互操作性(通过标准化的GATT服务)和定制化创新(通过自定义的GATT服务)的根本原因。
5、实践应用:BLE协议栈中数据封装与流转
理论知识的最终目的是为了理解实际应用。本节将通过一个具体的场景——智能手机应用(GATT客户端)读取蓝牙手表温度传感器(GATT服务器)的当前温度——来逐步追踪一个数据请求在BLE协议栈中自上而下封装和自下而上解封装的全过程。这个过程完美地诠释了分层架构的核心工作原理。
场景:读取蓝牙手表的温度特征值
步骤1:数据流的封装(客户端发送请求)
当用户在手机App上点击“刷新温度”按钮时,一个数据请求便开始了它在协议栈中的旅程:
- 应用层:用户的操作触发了应用程序调用一个高级API函数,例如readCharacteristic(temperatureCharacteristic)。
- GATT/ATT层(主机):GATT层接收到这个API调用,并将其转换为一个ATT协议数据单元(PDU)。具体来说,它会创建一个ATT读取请求(Read Request)PDU。这个PDU非常简洁,主要包含两个部分:一个字节的操作码(Opcode),用于标识这是一个“读取请求”操作;以及两个字节的属性句柄(Attribute Handle),指向服务器上温度特征值的地址 。
- L2CAP层(主机):ATT层将构建好的ATT PDU作为其有效载荷(即服务数据单元,SDU)向下传递给L2CAP层。L2CAP层接收到这个PDU后,会为其添加一个L2CAP头部,从而将其封装成一个L2CAP B-frame。L2CAP头部包含该数据包的长度和用于标识ATT协议的固定信道ID(CID)0x0004 。
- HCI层:主机将完整的L2CAP帧通过主机-控制器接口(HCI)发送给控制器。这个数据包被封装在一个HCI ACL数据包中 。
- 链路层(LL)(控制器):控制器的链路层接收到来自HCI的L2CAP帧作为其有效载aho。LL会为其添加一个LL头部和一个LL尾部。LL头部包含链路控制信息,如序列号(用于确认和重传)。LL尾部则是一个24位的循环冗余校验(CRC)值,用于在接收端进行错误检测 。此时,它已成为一个完整的数据信道PDU。
- 物理层(PHY)(控制器):PHY层接收到完整的LL数据包。它会在数据包的最前端添加前同步码(Preamble)和接入地址(Access Address)。然后,它使用GFSK将整个比特序列调制成无线电信号,并在当前连接事件所使用的跳频信道上将其发射出去 。
步骤2:空中传输
经过调制的无线电波在空中传播,从智能手机传输到温度传感器。
步骤3:数据流的解封装与响应(服务器接收并回应)
温度传感器接收到信号后,开始逆向的解封装过程:
- 物理层(PHY)(控制器):传感器的无线电接收到信号,对其进行解调,将无线电波还原为数字比特流,并移除前同步码和接入地址。
- 链路层(LL)(控制器):LL接收到比特流,首先检查CRC以确保数据在传输过程中没有损坏。如果CRC校验通过,它会处理LL头部信息,然后将有效载荷(即L2CAP帧)通过HCI接口传递给主机。
- L2CAP层(主机):主机的L2CAP层接收到数据帧,检查其头部的CID。发现CID为 0x0004 后,它便知道这个数据包的有效载荷(即原始的ATT读取请求PDU)应该递交给ATT协议处理器。
- GATT/ATT层(主机):ATT层解析收到的读取请求PDU。它根据请求中的属性句柄,从设备的应用层或直接从硬件传感器获取当前的温度值。然后,它构建一个ATT读取响应(Read Response)PDU。这个响应PDU包含一个“读取响应”的操作码,以及作为其值的实际温度数据。
- 返回之旅:这个ATT读取响应PDU随后会经历与请求过程完全相反的封装过程:在服务器端被L2CAP、LL和PHY层层封装,然后通过无线电发送出去;在客户端(智能手机)则被层层解封装,最终,原始的温度数据被提取出来并传递给应用程序,显示在用户界面上。
6、小节
低功耗蓝牙已经远远超出了其最初作为“个人区域网络”协议的范畴。通过持续的技术演进,它已经成熟为一个全面、灵活且功能强大的物联网网络解决方案。其精心设计的、具有前瞻性的分层架构,不仅成就了它今天的辉煌,也为其未来的发展奠定了坚实的基础。随着测向、LE Audio、信道探测和PAwR等新功能的不断普及,BLE正准备在智能家居、智慧城市、工业自动化和医疗健康等要求更高的领域中扮演更加核心的角色,继续引领物联网连接技术的未来(个人能力有限,如果错误请您指出讨论修改,谢谢!)