一、蓝牙协议栈概览与调优总纲

各位工程师朋友,大家好。我是老张,在蓝牙芯片这个坑里摸爬滚打了十几年。今天开始,咱们一起聊聊蓝牙连接稳定性调优这件事。

说实话,我刚入行那会儿,蓝牙协议栈对我来说就是个黑盒子。芯片连不上?加天线。断连?改重传次数。后来踩的坑多了,才慢慢摸清楚门道。嗯,这节课咱们先把地基打牢——搞懂BLE协议栈长什么样,调优到底在调什么。

1.1 BLE协议栈架构:三层分工

BLE协议栈,说白了就是一套软件分层体系。我习惯把它拆成三块:Controller(控制器)Host(主机)Application(应用)。你想想看,这三层各管各的事,但又必须紧密配合。

Controller层

这一层离硬件最近。它负责物理层(PHY)和链路层(LL)。说白了,就是管怎么发比特、怎么收比特、什么时候发、什么时候收。我在项目中遇到过,很多工程师觉得Controller层是芯片厂家的事,不用管。其实不然——连接间隔、延迟、超时这些关键参数,都在这一层定义。

核心组件:

  • PHY:1Mbps、2Mbps、Coded PHY(125kbps/500kbps)
  • LL:状态机(Standby、Advertising、Scanning、Initiating、Connection)
  • HCI:Host与Controller之间的通信接口

Host层

Host层是协议栈的大脑。它包含L2CAP、ATT、GATT、SM、GAP等模块。GATT定义数据怎么组织,GAP定义设备怎么发现和连接。我刚开始做蓝牙时,总把GATT和GAP搞混——后来记住一句话:GAP管连接,GATT管数据

Application层

这一层就是你的业务逻辑了。比如智能灯泡的调光逻辑、心率计的报警逻辑。调优时,很多人只盯着应用层改代码,却忽略了底层参数——这是个大坑。

我的经验:调优时,先从Controller层入手,再往上走。底层不稳,上层再怎么优化也是白搭。

1.2 连接稳定性核心指标

做调优,你得先知道什么是「稳定」。我一般看四个指标:RSSI、PER、连接间隔、延迟与超时。这四个指标,就像汽车的油表、速度表、水温表和故障灯——缺一不可。

指标 全称 含义 典型值
RSSI Received Signal Strength Indicator 接收信号强度,单位dBm -40 ~ -90 dBm
PER Packet Error Rate 丢包率,单位百分比 < 1% 为良好
连接间隔 Connection Interval 两次连接事件之间的时间 7.5ms ~ 4s
延迟与超时 Latency & Supervision Timeout 从断连到检测到断连的时间 超时 > 连接间隔 × (1 + 延迟数) × 2

RSSI

RSSI是信号强度的直接体现。我记得有一次,客户说设备在3米内正常,5米外就断连。我一看RSSI,-85dBm了。说白了,这个值低于-80dBm,你就得小心了。但要注意——RSSI受环境干扰很大,金属、墙壁、人体都会影响。别只看绝对值,要看相对变化。

PER

PER是丢包率。为什么这个指标重要?因为蓝牙是跳频的,37个数据信道,遇到干扰就会丢包。我见过一个案例,设备在WiFi路由器旁边PER飙到30%,连接基本废了。调优时,PER应该控制在1%以下,超过5%就要查原因了。

避坑指南:我曾经以为RSSI好PER就一定好。结果有一次RSSI -50dBm,PER却高达10%。后来发现是WiFi同频干扰。记住:RSSI好 ≠ 连接稳定

连接间隔

连接间隔决定了主从设备多久通信一次。间隔越小,实时性越好,但功耗越高。间隔越大,省电,但丢包后恢复慢。我一般这样选:

  • 实时控制类(如鼠标):7.5ms ~ 30ms
  • 数据采集类(如传感器):50ms ~ 100ms
  • 低功耗类(如信标):100ms ~ 1s

延迟与超时

延迟(Slave Latency)允许从设备跳过一些连接事件来省电。超时(Supervision Timeout)是主设备等待多久后判定连接断开。这两个参数要配合着调。我见过有人把延迟设成10,超时设成2秒——结果设备断连了要等2秒才能发现,用户体验极差。

我的建议:超时时间 = 连接间隔 × (1 + 延迟数) × 2,再留20%余量。比如连接间隔30ms,延迟4,那超时至少设30 × 5 × 2 = 300ms,再加20%就是360ms。

1.3 调优方法论总览

调优不是瞎调。我总结了一套流程,分四步走:

  1. 测量基线:先跑一遍默认参数,记录RSSI、PER、连接稳定性
  2. 识别瓶颈:是信号弱?干扰大?还是参数不合理?
  3. 针对性调整:改天线匹配、调连接间隔、优化重传策略
  4. 验证迭代:改一个参数测一次,别一次改一堆

举个例子。我之前调一个智能门锁项目,默认参数下PER 5%,用户反应偶尔打不开门。我第一步测基线,发现RSSI -70dBm不算差,但PER高。第二步查干扰,发现门锁装在金属门上,天线被屏蔽了。第三步,我调整了天线匹配电路,同时把连接间隔从50ms降到30ms。第四步验证,PER降到0.5%,问题解决。

调优三原则:

  • 一次只改一个参数——否则你永远不知道是哪个改动起了作用
  • 用数据说话——别凭感觉,拿RSSI和PER曲线说话
  • 考虑极端场景——最远距离、最大干扰、最低电量都要测

好了,这一章咱们把协议栈架构和核心指标理清了。下一章,我会带大家深入Controller层,看看连接参数到底怎么配才能又稳又省电。嗯,到时候我会分享一个我踩过的坑——连接间隔设太小,结果设备发热到烫手。咱们下章见。

课后思考:你的产品现在用的连接间隔是多少?有没有测过PER?如果没测过,建议先跑一晚上log看看。数据会告诉你真相。