(二)广播、扫描与连接:一次 BLE 通信的完整生命周期
(二)广播、扫描与连接:一次 BLE 通信的完整生命周期
系列:《低功耗蓝牙从入门到进阶》第 2 篇
读者:想系统学习 BLE 的新手
难度:★★★☆☆
0. 本文解决什么问题
在学习一项新的东西时,应该从整体是什么、要干什么出发,所以本文就从一次 BLE 通信从“广播”到“断开”出发,在链路层(Link Layer, LL) 上经历了哪些环节,每个环节的关键结构与参数是什么。
每个蓝牙设备有就绪、广播、扫描、发起、连接等5种状态,BLE 连接状态下有 中央设备(Central)、外围设备(Peripheral) 等2种角色,通常也说成蓝牙主机、蓝牙从机,或者中心、外设,蓝牙设备在各状态间跳转进行连接和通信。
下面将按 广播 → 扫描 → 连接建立 → 连接事件 → 断开 的顺序展开,看看蓝牙通信过程中发生了什么。
本篇先从整体出发, 遇到蓝牙的专业名词不用担心,作为初学者,你无需很快弄懂 ,各环节的具体实现将在后续文章展开。
1. 广播(Advertising)
在手机上安装nRF Connect,打开扫描,此时你的手机从就绪态进入扫描态,你可以发现周围很多个蓝牙设备,这些设备充当的是 外围设备 的角色。
为什么你的手机能搜到这些蓝牙设备?是因为手机能扫描到蓝牙设备的 广播 信息。
蓝牙广播以无线电的形式存在,在空中传播,蓝牙信号并非一个固定不变的正弦波,而是由数字信号通过高斯频移键控(GFSK)调制产生的信号,空气中有那么多无线信号,除了蓝牙,还有Wi‑Fi(802.11 b/g/n)、ZigBee(IEEE 802.15.4)、4G等,为了互不干扰,不同的通信方式使用不同的频率和信道。
信道:蓝牙技术联盟规定,蓝牙系统运行在 2.4GHz 的ISM频段。该频段的频率范围是 2400MHz 至 2483.5MHz。 射频信道的间隔为 1 MHz,并按照信道编号 k 的顺序排列,如下表所示《蓝牙核心规范v6.3》Vol2 PartA 2。
| 频率范围 | 射频信道 |
|---|---|
| 2.400 GHz 至 2.4835 GHz | f = 2402 + k MHz,k = 0,...,78 |

BLE 在 2.4 GHz ISM 频段划分 40 个 2 MHz 信道(编号 0~39),其中 37、38、39 三个为主广播信道(primary advertising channels),蓝牙设备广播时,会在三个广播信道依次广播一次,广播信道还刻意避开了 Wi-Fi 最常占用的 1、6、11 信道;其余 37 个为 数据信道,设备连接后传输数据就是在数据信道进行,当信道有干扰时,蓝牙会自动跳转到其他信道。
数字信号0和1分别是信道中心频率向下偏移和向上偏移0.25MHz,以信道0为例,中心频率为2404MHz,(2404 - 0.25)MHz是0,(2404 + 0.25)MHz是1。蓝牙在空中的波到底长什么样,涉及到数字信号处理等知识,我们就不展开说了。
广播事件:广播者按固定周期(广播间隔 advInterval,20 ms ~ 10.24 s,步进 0.625 ms)在三个广播信道上依次发送同一帧广播包,并短暂监听(可选),蓝牙规定一组三信道发送广播包和监听应答构成一次广播事件。
需要强调的是,蓝牙在被连接后仍能广播,但是否仍然要广播由开发者决定;通常手机搜索不到已连接的蓝牙设备,但不代表广播是未连接的专属状态。
广播包结构:
广播包就是蓝牙广播时向空中广播的内容,广播包长什么样的?它的协议如下图。

BLE 物理层有 3 种实现方案,即 LE 1M PHY、LE 2M PHY 和 LE Coded PHY,前两种为未编码物理层方案,第三种是编码物理层方案,本文只介绍最常用的未编码物理层方案,编码物理层方案可阅读《蓝牙核心规范v6.3》Vol6 PartB 2。在 LE 1M PHY 上发送或接收时,前导码为 1 字节;在 LE 2M PHY 上发送或接收时,前导码为 2 字节;接入地址为 4 字节;数据包(也是 Protocol Data Unit,数据协议单元,简称PDU)的范围是从 2 到 258 字节;循环冗余校验(CRC)为 3 字节。
其中,蓝牙在未连接时的接入地址通常固定为 0x8E89BED6 ,广播包的 CRC 通常是由芯片内部的基带硬件加速器完成,属于蓝牙本身的校验,如果你发送的数据中协议带有 CRC,那这两个 CRC 不是一个东西。
整个数据包以相同的符号速率(要么是 1 Msym/s 调制,要么是 2 Msym/s 调制。Msym/s 是符号速率,在未编码物理层方案中,1 Msym/s = 1 Mb/s)进行传输。不包括恒定音调扩展(Constant Tone Extension)部分的数据包的传输时间在 44 到 2128 us之间。若使用恒定音调扩展功能,其持续时间在 16 至 160 ussss之间。恒定音调扩展是用于测向室内定位的,普通 BLE 开发 了解即可。
其中,PDU 包含一个 16 位的头部字段和一个可变大小的负载字段 Payload,PDU 是蓝牙事件中 最重要的 参数,在链路层,整个蓝牙周期都围绕 PDU 展开,协议如下图所示。

其中,PDU 的 16 位头部字段如下所示。

ADV_IND 是最常见的一种 PDU,ADV_IND 是它的名字 ,其 Payload 为:
AdvA(6B 广播者地址) | AdvData(0~31B 广播数据)
除 ADV_IND,蓝牙规定了所有 PDU 类型,如下图所示,其中也包括后续将介绍的扫描、连接请求等 PDU 类型《蓝牙核心规范v6.3》Vol6 PartB 2.3,Page2995。

常见的几个广播 PDU 类型:
| PDU 类型 | 名称 | 可连接 | 可扫描 | 典型用途 |
|---|---|---|---|---|
| ADV_IND | 无定向可连接广播 | 是 | 是 | 大多数可连接外设 |
| ADV_DIRECT_IND | 定向广播 | 是 | 否 | 指定对端的快速重连 |
| ADV_SCAN_IND | 可扫描不可连接 | 否 | 是 | 希望被“看见”但不被连接 |
| ADV_NONCONN_IND | 不可连接不可扫描 | 否 | 否 | Beacon |
功耗权衡:广播间隔越短,被发现越快、功耗越高;越长越省电、发现越慢。这是 BLE 里第一组“可见性 × 功耗”的取舍。
小tip:如果你手上有 USB Dongle,你可以使用 Wireshark 进行蓝牙空中抓包,如下图,下方红色框内是一个广播包的所有原始数据,上方红色框是 Wireshark 对其解析。

2. 扫描(Scanning)
使用手机 nRF Connect 进行扫描,那么手机充当的就是 中央设备 的角色。
扫描者(scanner / observer)周期性打开接收机监听37、38、39 三个 主广播信道,行为由两个参数决定:
- 扫描窗口
scanWindow:每次监听多久 - 扫描间隔
scanInterval:多久监听一次
它们的范围都是 2.5 ms ~ 10.24 s,步进 0.625 ms。
扫描占空比 = scanWindow / scanInterval,决定听到广播的概率与扫描功耗。
两种扫描模式:
- 被动扫描:只接收广播 PDU,不发送任何内容。
- 主动扫描:收到广播后回发
SCAN_REQ(扫描请求)索取更多数据,广播者回复SCAN_RSP(扫描响应)。
发现延迟:广播与扫描是异步过程,双方互不知晓对方的周期,就像两个人不约定时间见面,实际 发现延迟 取决于广播间隔与扫描占空比的匹配,最坏情况可达广播间隔的数倍——这就是 扫了十几秒设备才出现 的直接原因。因此,在开发中,如果要兼顾功耗,调整合适的广播间隔和扫描间隔不容易。
值得一提的是,和广播一样,蓝牙在被连接后仍能扫描,但是否仍然要扫描由开发者和用户决定;就像手机已经连了蓝牙耳机还能扫描连接智能手环,因此扫描也不是未连接的专属状态。
3. 连接建立(Connection Setup)
发起者(initiator)扫描到可连接广播,收到 ADV_IND 或 ADV_DIRECT_IND后,在同一信道回发 CONNECT_IND(连接请求),一次携带全部建链参数,包括下面三个:
-
连接参数:连接间隔
connInterval(7.5 ms ~ 4 s,步进 1.25 ms)、从机延迟slaveLatency、监督超时supervisionTimeout -
跳频信息:channel map(可用数据信道集合)与跳频算法参数
-
链路标识:接入地址(access address,双方随机生成,用于区分同信道上的不同连接,注意 和广播时固定的接入地址不同,连接后便变成随机的了)与 CRC 初始值
从设备收到 CONNECT_IND 即进入连接状态。连接建立后,外围设备通常停止广播,直到链路断开才恢复,当然正如前文,连接后也能继续广播,这由开发者决定。
4. 连接事件与数据传输(Connection Events)
蓝牙连接后,通信发生在 37 个 数据信道 上。
连接不是“持续在线”,而是周期性短脉冲:每个连接间隔,双方在约定的数据信道上“醒来”一次,完成一次连接事件后又“睡去”。
连接事件:建立连接后,由中央设备发起,中央设备和外围设备在同一个数据信道上交替收发数据包的一次通信周期。一个连接事件内可连续发送多个包,直到事件结束条件满足,比如数据发完或事件窗口耗尽;每次连接事件切换一个数据信道(自适应跳频 adaptive frequency hopping),利用 channel map 避开干扰。
每次连接事件都会相互发送数据包,即使没有重要的数据也会,那样发送的就是 空数据包 ,告诉对方“我没失联”,以保证连接状态。
需要强调,有人称数据空包为广播空包,严格讲这是不严谨的,广播包属于广播时的范畴,不应混为一谈!
三个关键参数:
| 参数 | 作用 | 范围 |
|---|---|---|
connInterval |
两个连接事件的间隔 | 7.5 ms ~ 4 s(步进 1.25 ms) |
slaveLatency |
允许从机连续跳过的连接事件数 | 0 ~ 499 |
supervisionTimeout |
超过该时长未收到任何包则判链路超时断开 | 100 ms ~ 32 s |
slaveLatency 是省电的核心机制:它允许从机“睡过”若干个连接事件,代价是主机发来的数据要等它下次醒来才能收到,响应延迟随之上升。
参数之间有一个规范强制的约束《蓝牙核心规范v6.3》Vol6 PartB 4.5.2,当主机发起连接,发送 CONNECT_IND PDU,外围设备校验这组连接参数是否满足该不等式,如不,则直接拒绝建立连接,上报断开原因码 0x3B Unacceptable Connection Parameters,公式如下:
supervisionTimeout > (1 + slaveLatency) × connInterval × 2
5. 断开(Disconnection)
断开有三条路径:
- 主动断开:任一方发送
LL_TERMINATE_IND,携带原因码。 - 监督超时:
supervisionTimeout内未收到任何包,任一方判定链路丢失。 - 物理丢失:设备超出射程或关机——在协议层通常表现为 监督超时。
断开后,外设通常回到广播状态,由开发者决定。
蓝牙断开时,常见的有以下几种原因《蓝牙核心规范v6.3》Vol1 PartF。
| 错误码 | 名称 | 说明 |
|---|---|---|
| 0x08 | Connection Timeout | 监督超时,链路丢失(距离远、干扰、掉电) |
| 0x13 | Remote User Terminated Connection | 对端用户主动断开(对方发 LL_TERMINATE_IND) |
| 0x14 | Remote Device Terminated due to Low Resources | 对端资源不足断开 |
| 0x15 | Remote Device Terminated due to Power Off | 对端即将断电断开 |
| 0x16 | Connection Terminated by Local Host | 本地主机主动调用断开,本地 Host 下发 HCI 断开命令 |
| 0x3B | Unacceptable Connection Parameters | 不接受本次连接参数,从机主动断开 |
| 0x3D | Connection Terminated due to MIC Failure | 加密 MIC 校验失败,安全原因断开 |
6. 蓝牙生命周期全貌
中央设备主动扫描 + 可连接外设的典型时序:
外设 [Advertising] 手机 [Scanning / Initiating]
|-- ADV_IND ------------------->|
|<-- SCAN_REQ ------------------| 主动扫描
|-- SCAN_RSP ------------------>|
|<-- CONNECT_IND ---------------| 手机切换为 Initiating,停止广播
|-- 连接事件:数据包双向互发 ------>| 按 connInterval 周期重复
|-- LL_TERMINATE_IND ---------->| 主动断开
|-- ADV_IND ------------------->| 回到广播,重新可见
7. 速查表
| 阶段 | 关键实体 | 关键参数 / 结构 | 典型范围 |
|---|---|---|---|
| 广播 | Broadcaster | advInterval;AdvData |
20 ms ~ 10.24 s;≤31 B(legacy) |
| 扫描 | Observer | scanWindow / scanInterval |
占空比越高越费电 |
| 建链 | Initiator | CONNECT_IND;access address | interval 7.5 ms ~ 4 s |
| 数据 | Central / Peripheral | connInterval / slaveLatency / supervisionTimeout |
1.25 ms 步进 / 0~499 / 100 ms ~ 32 s |
| 断开 | 任一方 | LL_TERMINATE_IND / 监督超时 | 原因码 / 超时时间 |
参考资料与内容验真
- 信道划分、广播 PDU 类型、CONNECT_IND 内容、连接参数与状态机:蓝牙核心规范 Bluetooth Core Specification
- 本文参数范围均为规范定义值,可在 bluetooth.com/specifications/specs/ 交叉核验。
浙公网安备 33010602011771号