第2章:连接状态机核心状态解析
Bluetooth LE 协议栈中,6 种核心状态构成连接状态机的全部生命周期。本章从架构角度逐一剖析每个状态的边界条件、进入/退出事件、组件职责、数据与控制流,以及多设备并发场景下的选型权衡与落地风险。理解这些状态是构建多连接管理系统的基石。
2.1 状态定义与边界
| 状态 | 英文名称 | 核心职责 | 边界条件(进入/退出) |
|---|---|---|---|
| 待机 | Standby | 射频电路关闭,无任何无线活动 | 上电复位、用户停止操作、从任何其他状态显式退出;仅可进入 Advertising 或 Scanning |
| 广播 | Advertising | 发送可连接或不可连接广播包,暴露设备存在 | 进入:Standby → Advertising;退出:收到连接请求 → Connection,或超时/用户停止 → Standby |
| 扫描 | Scanning | 接收广播包并上报给主机,发现周边设备 | 进入:Standby → Scanning;退出:收到特定设备广播 → Initiating,或超时 → Standby |
| 发起 | Initiating | 定向扫描目标广播者,并发送 CONNECT_REQ | 进入:Scanning 发现目标后自动发起;退出:收到连接响应 → Connection,或超时 → Standby |
| 连接 | Connection | 已建立链路,数据通道双向通信 | 进入:Initiating 成功或 Advertising 被连接;退出:连接超时、断开请求、链路丢失 → Standby |
| 同步 | Synchronization | 与周期性广播同步(PAST),接收等时数据且不建立连接 | 进入:从 Scanning 侧接收 Periodic Advertising Sync Info;退出:同步丢失或用户取消 → Standby |
边界要点:状态切换仅发生在特定事件触发时,不允许跨状态跳跃(如 Standby 直接进入 Connection)。子系统(Controller + Host)必须共同维护状态机一致性。
2.2 组件职责与分层
状态机在 Controller 层(链路层 LL)实现,Host 层(GAP/GATT)通过 HCI 命令间接控制。各状态对应的组件职责如下表。
| 状态 | Controller 职责 | Host 职责 | 关键 HCI 命令/事件 |
|---|---|---|---|
| Standby | 关闭射频、清空 TX/RX 缓冲区、停止所有定时器 | 释放资源、重置 GAP role 配置 | HCI_Reset、LE_Set_Scan_Parameters 清空 |
| Advertising | 按广播间隔发送 ADV_IND/ADV_DIRECT_IND 等PDU;响应 CONNECT_REQ | 设定广播数据、扫描响应数据、过滤策略 | LE_Set_Advertising_Data、LE_Set_Advertising_Enable |
| Scanning | 按扫描间隔监听广播信道;上报广播报告 | 过滤设备、触发扫描暂停/恢复 | LE_Set_Scan_Enable、LE_Advertising_Report |
| Initiating | 定向扫描目标,发送 CONNECT_REQ 并等待连接 | 配置发起参数(目标地址、连接参数) | LE_Create_Connection |
| Connection | 维护连接间隔、交换 LL 数据 PDU、处理超时 | 管理 ATT 事务、GATT 操作、加密流程 | LE_Connection_Complete、Disconnection_Complete |
| Synchronization | 接收 Periodic Advertising,维持同步包间隔 | 注册同步接收回调、解析 AUX_SYNC_IND 数据 | LE_Periodic_Advertising_Create_Sync、LE_Periodic_Advertising_Sync_Established |
2.3 数据流与控制流
以 Central 设备建立连接为例,跨状态的数据流与控制流如下:
- Standby → Scanning:Host 发送
LE_Set_Scan_Enable,Controller 开始在广播信道扫描。数据流:接收广播 PDU → 生成LE_Advertising_Report事件上报 Host。 - Scanning → Initiating:Host 判断目标可连接,发送
LE_Create_Connection。Controller 定向扫描目标并发送 CONNECT_REQ。控制流包含连接参数(间隔、延迟、超时)。 - Initiating → Connection:收到目标连接响应后,Controller 建立链路并上报
LE_Connection_Complete事件。此后数据通过连接事件循环双向流动。 - Connection → Standby:当连接超时或 Host 发送
Disconnect,Controller 清理链路,进入 Standby。
# 典型 HCI 命令序列(简化)
# 1. 启动扫描
hcitool le scan
# 2. 发现目标后发起连接
hcitool lecc [BD_ADDR]
# 3. 连接建立,进入 Connection
# 4. 断开
hcitool ledc [handle]
2.4 信任链路与风险点
多连接场景下状态管理核心风险在于并发状态转换冲突:
- 状态二义性:同一设备同时作为 Broadcaster 和 Observer 时,Controller 必须隔离广播/扫描角色;部分芯片不支持同时 Advertising 和 Scanning。
- 连接过多导致溢出:Controller 内部连接句柄池有限(通常 1-8 个),超出后拒绝新连接。
- 同步状态丢失:Periodic Advertising 同步易受干扰,同步丢失后设备状态机自动回退 Standby,需要 Host 层重同步策略。
- 时序风险:在 Initiating 阶段发送 CONNECT_REQ 后,若目标进入 Standby 或已连接,Controller 会重试直到超时,导致长期占用资源。
落地风险点:生产环境下,多连接并发 Initiating 会造成无线冲突。应限制同时发起连接数 ≤2,并为每个连接预留超时回退窗口。
2.5 状态机参考架构图
2.6 选型权衡
| 场景 | 推荐状态策略 | 权衡点 |
|---|---|---|
| 低功耗设备(传感器) | 长时间 Standby,短时间 Advertising | 广播间隔越长功耗越低,但连接延迟增大 |
| 多 Central 连接 | 使用 Scannable but non-connectable 广播 + 连接 Manager | 降低被无关连接打断的风险;需额外过滤机制 |
| 音频流同步 | 使用 Synchronization 状态 + Connected Isochronous Stream | 支持等时传输,但需 Controller 硬件支持 LE Audio |
| 快速发现 | 降低广播间隔 + 持续 Scanning | 功耗增加,可能遗漏其他广播 |
2.7 落地步骤
- 确定设备角色:Central(Scanner/Initiator)或 Peripheral(Broadcaster),或两者兼有(需要多角色芯片)。
- 配置状态机参数:为每个状态设定超时、间隔、过滤策略。例如广播间隔 100 ms,扫描窗口 30 ms。
- 实现状态切换回调:在 Controller 事件驱动下更新上层状态记录,避免 Host 与 Controller 状态不一致。
- 并发管理:使用状态池管理多个连接句柄,每个句柄关联独立的状态机实例。
- 异常处理:为每个状态添加超时复位(Watchdog),防止永久卡在 Initiating 或 Synchronization。
2.8 验收标准
- 所有 6 种状态可单向转换回 Standby,且不遗漏清理。
- 多设备并发 Advertising 和 Scanning 时,状态机无冲突(通过 HCI 日志确认无无效转换)。
- Synchronization 状态在丢失同步后自动回退 Standby,并在广播重新出现时可恢复。
- Initiating 超时后正确进入 Standby,不阻塞后续连接请求。
- 每秒状态切换次数≥50 时,无资源泄漏(通过内存监控工具验证)。