第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 设备建立连接为例,跨状态的数据流与控制流如下:

  1. Standby → Scanning:Host 发送 LE_Set_Scan_Enable,Controller 开始在广播信道扫描。数据流:接收广播 PDU → 生成 LE_Advertising_Report 事件上报 Host。
  2. Scanning → Initiating:Host 判断目标可连接,发送 LE_Create_Connection。Controller 定向扫描目标并发送 CONNECT_REQ。控制流包含连接参数(间隔、延迟、超时)。
  3. Initiating → Connection:收到目标连接响应后,Controller 建立链路并上报 LE_Connection_Complete 事件。此后数据通过连接事件循环双向流动。
  4. 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 状态机参考架构图

BLE 连接状态机核心状态转换图 Standby Advertising Scanning Initiating Connection Synchronization LE_Set_Advertising_Enable LE_Set_Scan_Enable LE_Create_Connection Connection Complete 收到 CONNECT_REQ Disconnect / 超时 Periodic Sync 信息 说明:虚线表示可选路径或断开路径;实线为常规转换。所有状态最后都可通过用户操作回到 Standby。

2.6 选型权衡

场景推荐状态策略权衡点
低功耗设备(传感器)长时间 Standby,短时间 Advertising广播间隔越长功耗越低,但连接延迟增大
多 Central 连接使用 Scannable but non-connectable 广播 + 连接 Manager降低被无关连接打断的风险;需额外过滤机制
音频流同步使用 Synchronization 状态 + Connected Isochronous Stream支持等时传输,但需 Controller 硬件支持 LE Audio
快速发现降低广播间隔 + 持续 Scanning功耗增加,可能遗漏其他广播

2.7 落地步骤

  1. 确定设备角色:Central(Scanner/Initiator)或 Peripheral(Broadcaster),或两者兼有(需要多角色芯片)。
  2. 配置状态机参数:为每个状态设定超时、间隔、过滤策略。例如广播间隔 100 ms,扫描窗口 30 ms。
  3. 实现状态切换回调:在 Controller 事件驱动下更新上层状态记录,避免 Host 与 Controller 状态不一致。
  4. 并发管理:使用状态池管理多个连接句柄,每个句柄关联独立的状态机实例。
  5. 异常处理:为每个状态添加超时复位(Watchdog),防止永久卡在 Initiating 或 Synchronization。

2.8 验收标准

  • 所有 6 种状态可单向转换回 Standby,且不遗漏清理。
  • 多设备并发 Advertising 和 Scanning 时,状态机无冲突(通过 HCI 日志确认无无效转换)。
  • Synchronization 状态在丢失同步后自动回退 Standby,并在广播重新出现时可恢复。
  • Initiating 超时后正确进入 Standby,不阻塞后续连接请求。
  • 每秒状态切换次数≥50 时,无资源泄漏(通过内存监控工具验证)。