4、BLE广播机制:广播信道、广播PDU类型、广播间隔与微调、扫描请求与响应、扩展广播

广播,是BLE设备对外“喊话”的唯一方式。你想想看,一个蓝牙设备刚上电,它怎么告诉别人“我在这儿”?靠的就是广播信道。这一节,我把广播机制的底牌全翻出来给你看。

4.1 广播信道:为什么是37、38、39?

BLE在2.4GHz频段里划了40个信道,编号0到39。但广播只用其中三个:37(2402MHz)、38(2426MHz)、39(2480MHz)。

为什么偏偏选这三个?我刚开始做蓝牙项目时也纳闷。后来查了规范才明白——这三个信道刻意避开了Wi-Fi的1、6、11信道中心频点。说白了,就是为了减少和Wi-Fi打架的概率。

广播信道三兄弟:

  • 信道37(2402 MHz):起始信道,设备刚上电默认在此发送
  • 信道38(2426 MHz):中间信道,通常干扰最小
  • 信道39(2480 MHz):最高频信道,也是广播拓扑的默认监听信道

设备会在三个信道上轮流发广播包。接收方只要在任意一个信道上听到,就能建立联系。这种设计,说白了就是用冗余换可靠性。

4.2 广播PDU类型:四种报文,各司其职

广播报文不是只有一种。规范里定义了四种广播PDU类型,我列个表给你看,一目了然:

PDU类型 名称 用途 能否携带数据
ADV_IND 可连接无定向广播 最常用,普通设备广播 是(最多31字节)
ADV_DIRECT_IND 定向广播 快速连接指定设备 否
ADV_NONCONN_IND 不可连接无定向广播 仅广播数据,不响应连接 是(最多31字节)
ADV_SCAN_IND 可扫描无定向广播 允许扫描请求,但不接受连接 是(最多31字节)

我在项目中遇到过最典型的场景:做低功耗传感器时,用ADV_NONCONN_IND,发完数据就睡,省电。但如果你想让手机连上来配置参数,就得用ADV_IND。

我的习惯:产品原型阶段一律用ADV_IND,调试方便。量产时再根据功耗需求换成ADV_NONCONN_IND或ADV_SCAN_IND。

4.3 广播间隔与微调:别让设备“喊”太勤

广播间隔,就是设备两次广播之间的时间。规范里允许的范围是20ms到10.24s,步进0.625ms。

但这里有个坑——广播间隔不是固定值。规范要求设备在间隔上加上0到10ms的随机微调。为什么要加?

你想想看,如果两个设备都用100ms间隔,它们可能永远在同一时刻发广播,互相撞车。加了微调,碰撞概率就大大降低了。

我曾经踩过的坑:有个项目为了省电,把广播间隔设成5秒。结果手机扫描时经常漏包,用户体验极差。后来改成500ms + 随机微调,功耗只多了不到10%,但连接成功率从60%升到了98%。

广播间隔的选择,本质上是在功耗和响应速度之间做权衡:

  • 20ms - 100ms:快速连接场景(如蓝牙遥控器),但功耗高
  • 100ms - 1s:大多数消费品,平衡点
  • 1s - 10s:低功耗传感器,牺牲响应时间换续航

4.4 扫描请求与响应:一问一答的“握手”

广播包只有31字节数据,很多时候不够用。这时候就需要扫描请求和响应来帮忙。

流程很简单:

  1. 广播者发ADV_IND或ADV_SCAN_IND
  2. 扫描者收到后,发SCAN_REQ(扫描请求)
  3. 广播者回复SCAN_RSP(扫描响应),再带31字节数据

这样一来,数据容量就从31字节翻倍到62字节。我在做ibeacon项目时,就用扫描响应来携带额外的设备信息,比如电池电量、固件版本。

注意:扫描请求和响应只在广播信道上交互,不会触发连接。如果你想建立连接,必须用ADV_IND类型,并且扫描者发的是CONNECT_REQ,不是SCAN_REQ。

4.5 扩展广播:BLE 4.2之后的“大喇叭”

31字节不够用怎么办?BLE 4.2引入了扩展广播(Extended Advertising)。

扩展广播的核心变化:

  • 数据容量:从31字节扩展到最多1650字节(PDU最大255字节,配合AUX_CHAIN可串联)
  • 信道选择:不再局限于37/38/39,可以用全部40个信道
  • 广播集:可以定义多个广播集,每个集独立配置

我最近做的一个医疗设备项目,需要广播大量传感器数据(心率、血氧、体温、加速度),传统31字节根本塞不下。换成扩展广播后,一个包就搞定了。

我的建议:如果你的设备需要广播超过31字节数据,或者需要更灵活的广播策略,直接上BLE 5.0以上的芯片,用扩展广播。别在传统广播上死磕。

4.6 广播机制知识图谱

下面这张图,把整个广播机制的脉络画清楚了:

BLE广播机制知识图谱 广播信道 信道37 / 38 / 39 广播PDU类型 ADV_IND ADV_DIRECT_IND ADV_NONCONN_IND ADV_SCAN_IND 广播间隔与微调 间隔:20ms ~ 10.24s 微调:0 ~ 10ms 随机 扫描请求与响应 SCAN_REQ → SCAN_RSP 扩展广播 数据容量:≤1650字节 信道:全部40个 广播集:多个独立配置 核心要点 广播机制是BLE设备发现的基础,理解信道选择、PDU类型、间隔微调、扫描交互和扩展广播, 才能设计出稳定、低功耗、高兼容性的蓝牙产品。

4.7 实战避坑指南

最后,分享几个我在项目中积累的经验:

我曾经犯过的错:

  • 广播间隔设太短:有个穿戴设备项目,我把广播间隔设成20ms,结果电池两天就耗光了。后来改成200ms,续航直接翻到两周。
  • 忽略微调:在展会演示时,多个设备同时广播,互相撞包严重。加上随机微调后,问题解决。
  • 扫描响应滥用:有人把扫描响应当成普通广播来用,结果手机扫描时频繁请求响应,功耗飙升。记住,扫描响应只在被请求时才发。

广播机制,说白了就是BLE世界的“门面”。门面做不好,后面连接、数据传输都无从谈起。把这节吃透,你的蓝牙产品就成功了一半。