
这部分讲的是 GAP 中的 Discovery modes and procedures,也就是"发现模式和发现过程"。
它解决的是一个非常基础的问题:
一个 BLE 设备是否允许被别人发现?另一个 BLE 设备又应该通过什么过程去发现它?
可以一句话概括:
Discovery 关注的是"发现设备",不是"连接设备"。
一、这部分整体想表达什么?
这段内容主要说了三件事:
第一,所有设备都必须处于某一种"可发现状态"中:
Non-discoverable mode
General discoverable mode
Limited discoverable mode
第二,正在寻找其他设备的设备,需要执行 discovery procedure:
Limited discovery procedure
General discovery procedure
第三,如果设备使用 Extended Advertising,最好也同时提供 Legacy Advertising 形式的广播,因为有些设备只能扫描 legacy advertising PDUs。
二、关键信息 1:所有设备都必须处于"不可发现"或"可发现"模式之一
原文说:
All devices shall be in either non-discoverable mode or one of the discoverable modes.
意思是:
所有设备都必须处于以下状态之一:
不可发现模式
或者
某一种可发现模式
也就是设备不会处于一个"没有定义发现状态"的中间状态。
从 GAP 角度看,设备要么:
我不希望被别人发现
要么:
我允许别人发现我
这就是 Discovery modes 的核心。
三、关键信息 2:Discoverable mode 分为 General 和 Limited 两种
原文说:
A device in the discoverable mode shall be in either the general discoverable mode or the limited discoverable mode.
意思是:
如果设备处于可发现模式,那么它必须进一步属于下面两种之一:
General Discoverable Mode
Limited Discoverable Mode
这两个模式的区别可以这样理解。
1. General Discoverable Mode:普通可发现模式
General Discoverable Mode 可以理解为:
设备长期或常规地允许被发现。
例如:
一个 BLE 模块一直在广播;
手机 App 打开扫描后可以一直发现它;
它没有明显的"短时间配网窗口"概念。
常见场景:
BLE 串口模块
普通蓝牙外设
传感器设备
可长期被 App 扫描到的设备
它表达的是:
我现在是可被发现的,发现我的设备可以把我列出来。
2. Limited Discoverable Mode:有限可发现模式
Limited Discoverable Mode 可以理解为:
设备只在有限时间或特定条件下允许被发现。
例如:
设备刚开机后的 30 秒内可被发现;
用户长按按键进入配对/配置模式后可被发现;
设备进入"添加设备"模式时才可被发现。
它表达的是:
我现在临时开放发现窗口,过一段时间可能就不再可发现。
常见场景:
配网模式
添加设备模式
临时绑定模式
用户按键触发的发现窗口
所以:
General = 常规可发现
Limited = 临时可发现 / 有限可发现
四、关键信息 3:Non-discoverable mode 表示设备不可被发现
原文说:
A device in the non-discoverable mode is not discoverable.
意思很直接:
处于 Non-discoverable mode 的设备不可被发现。
这里要注意,它不是说设备一定不发任何广播,而是从 GAP 发现语义上说:
发现过程不应该把它当成可发现设备
比如一个设备可能仍然发送某些广播数据,但如果它没有设置 discoverable 相关语义,那么它不属于"可发现设备"。
这也是前面 Broadcast mode 那节里强调的:
Broadcast mode 不能设置 LE General Discoverable Mode 或 LE Limited Discoverable Mode flag。
原因就是:
Broadcast mode 是广播无连接数据
Discoverable mode 是允许被发现
它们不是一回事。
五、关键信息 4:可发现设备可以被 discovering device 找到
原文说:
Devices operating in either the general discoverable mode or the limited discoverable mode can be found by the discovering device.
意思是:
处于 General Discoverable Mode 或 Limited Discoverable Mode 的设备,可以被执行发现过程的设备发现。
这里出现了两个角色语义:
Discoverable device:允许被发现的设备
Discovering device:正在发现别人的设备
从 BLE App 开发角度看,通常可以理解为:
BLE 外设 / 模块:Discoverable device
手机 App / 中心设备:Discovering device
但要注意,这只是常见情况,不是绝对绑定。
六、关键信息 5:发现别人时有两种 procedure
原文说:
A device that is discovering other devices performs either the limited discovery procedure ... or the general discovery procedure ...
意思是:
一个正在发现其他设备的设备,会执行以下两种发现过程之一:
Limited Discovery Procedure
General Discovery Procedure
也就是说,不只是"被发现方"有模式,"发现方"也有过程。
1. Limited Discovery Procedure:有限发现过程
Limited Discovery Procedure 主要用于寻找处于:
Limited Discoverable Mode
的设备。
也就是:
我现在只想找那些处于临时可发现状态的设备
典型场景:
App 中点击"添加新设备";
只希望扫描那些正在配网/配对窗口中的设备;
不希望把所有普通广播设备都列出来。
2. General Discovery Procedure:普通发现过程
General Discovery Procedure 用于更一般地发现设备。
它可以发现处于:
General Discoverable Mode
Limited Discoverable Mode
的设备。
也就是:
我想找附近所有可发现的设备
典型场景:
BLE 调试工具扫描周围设备;
App 展示附近可连接设备列表;
类似 nRF Connect / LightBlue 扫描设备列表。
七、关键信息 6:有些设备只能扫描 Legacy Advertising PDUs
原文说:
Some devices may only scan for advertising events using legacy advertising PDUs.
意思是:
有些设备可能只能扫描使用 Legacy Advertising PDU 的广播事件。
这是在提醒扩展广播的兼容性问题。
BLE 后续版本支持 Extended Advertising,但不是所有设备都支持扩展扫描。
如果一个设备只使用 Extended Advertising,而另一个扫描设备只支持 Legacy Advertising,那么扫描设备可能发现不了它。
所以规范建议:
devices using advertising events with the extended advertising PDUs also use an advertising set with advertising events that use legacy advertising PDUs.
意思是:
如果设备使用 Extended Advertising PDUs,最好也同时配置一个使用 Legacy Advertising PDUs 的 advertising set。
目的就是:
提高兼容性
让只支持 Legacy 扫描的设备也能发现你
从实际开发看,这句话很重要。
如果你做 BLE 模块或 BLE 外设产品,不能只考虑新手机、新系统、新蓝牙版本。很多设备、旧手机、旧扫描器可能只识别 Legacy Advertising。
所以更稳妥的做法是:
Extended Advertising:用于更多数据、更高级能力
Legacy Advertising:用于基础发现和兼容
八、关键信息 7:多个 Advertising Sets 使用同一身份时,应共享相同过滤策略
原文说:
If the device is in one of the discoverable modes, and if multiple advertising sets are used with the same Identity Address or the same IRK, then those advertising sets shall also share the same advertising filter policy.
意思是:
如果设备处于某种可发现模式,并且多个 advertising sets 使用相同的:
Identity Address
或者相同的:
IRK
那么这些 advertising sets 应该共享相同的 advertising filter policy。
这句话比较底层,拆开理解。
1. Identity Address 是什么?
Identity Address 可以理解为设备的长期身份地址。
例如:
Public Device Address
Static Random Address
它代表设备身份,不像 RPA 那样频繁变化。
2. IRK 是什么?
IRK 是:
Identity Resolving Key
也就是身份解析密钥。
如果设备使用 RPA,可解析私有地址,别人不能单靠地址直接知道它是谁。
但如果对方有它的 IRK,就可以解析出这个 RPA 对应的身份。
所以:
同一个 IRK ≈ 同一个设备身份
3. Advertising Filter Policy 是什么?
Advertising Filter Policy 是广播过滤策略。
它决定广播方如何处理来自扫描方或连接方的请求。
例如:
是否允许任意设备扫描
是否只允许 Filter Accept List 中的设备扫描
是否允许任意设备连接
是否只允许 Filter Accept List 中的设备连接
虽然这里是 Discovery 章节,但广播过滤策略会影响别人能不能获取扫描响应、能不能进一步连接。
4. 为什么多个 Advertising Sets 要共享相同过滤策略?
因为如果多个 advertising sets 代表同一个设备身份,但过滤策略不同,就可能造成行为不一致。
例如:
Advertising Set 1:允许所有设备扫描
Advertising Set 2:只允许白名单设备扫描
如果它们使用同一个 Identity Address 或同一个 IRK,那么从外部看,它们其实是同一个设备。
但不同 advertising set 表现出不同过滤行为,就可能让发现过程变得混乱。
所以规范要求:
同一个身份下的多个可发现 advertising sets,应使用一致的 advertising filter policy
这样可以保证发现行为一致。
九、这部分和前一节 Broadcast / Observation 的区别
这里非常容易混淆。
Broadcast / Observation 关注的是:
无连接广播数据的发送和接收
Discovery 关注的是:
设备是否可被发现,以及如何发现设备
区别如下:
| 内容 | 重点 | 是否强调连接 |
|---|---|---|
| Broadcast mode | 发无连接广播数据 | 不连接 |
| Observation procedure | 接收无连接广播数据 | 不连接 |
| Discoverable mode | 设备允许被发现 | 不一定连接 |
| Discovery procedure | 扫描并发现可发现设备 | 不一定连接 |
所以:
发广播,不一定是为了被发现。
扫描广播,也不一定是在执行 Discovery。
如果只是收 Beacon 数据,更像 Observation。
如果是为了找可发现设备并列入设备列表,更像 Discovery。
十、结合 App 开发理解
假设做一个 BLE App,用户点击"搜索设备"。
手机开始扫描周围设备。
如果 App 的目标是找出附近可以添加的设备,那么手机就是 discovering device,执行 Discovery Procedure。
而 BLE 模块如果希望被 App 找到,就需要处于某种 Discoverable Mode。
常见情况:
模块长期允许被发现:
General Discoverable Mode
模块只在配网/添加设备阶段允许被发现:
Limited Discoverable Mode
模块不希望被 App 发现:
Non-discoverable Mode
如果模块使用扩展广播,但 App 要兼容旧手机,那么最好同时保留 Legacy Advertising Set,否则旧手机可能扫描不到。
十一、这部分学习时要抓住的主线
这一节要抓住几个关键词:
Non-discoverable Mode
General Discoverable Mode
Limited Discoverable Mode
General Discovery Procedure
Limited Discovery Procedure
Legacy Advertising PDU
Extended Advertising PDU
Advertising Filter Policy
Identity Address / IRK
最重要的是理解下面这条逻辑:
被发现方:处于某种 Discoverable Mode
发现方:执行某种 Discovery Procedure
发现依赖广播事件
广播格式还要考虑 Legacy / Extended 兼容性
如果多个 advertising set 代表同一身份,过滤策略要一致
十二、总结
这部分的核心可以总结为:
所有 BLE 设备都必须处于不可发现模式或某一种可发现模式。
可发现模式分为 General Discoverable Mode 和 Limited Discoverable Mode。
Non-discoverable Mode 表示设备不可被发现。
处于 General 或 Limited Discoverable Mode 的设备,可以被执行发现过程的设备找到。
发现方执行的是 Limited Discovery Procedure 或 General Discovery Procedure。
有些设备只能扫描 Legacy Advertising PDUs,所以使用 Extended Advertising 的设备建议同时提供 Legacy Advertising Set,以保证兼容性。
如果多个 Advertising Sets 使用相同 Identity Address 或相同 IRK,并且设备处于可发现模式,那么这些 advertising sets 应共享相同的 advertising filter policy。
可以把 Discovery 这一节理解为:
GAP 对"设备如何被发现、设备如何发现别人"做出的规范定义。
它是后续理解扫描、广播、设备列表、连接前发现流程的基础。

这部分开始进入 Discovery modes and procedures 的具体要求 ,尤其是先讲了 Non-discoverable mode,不可发现模式。
它主要想表达的是:
Peripheral 设备必须支持"不可发现模式";处于不可发现模式的设备,即使仍然可以发送广播,也不能被 General Discovery 或 Limited Discovery 过程发现。
这里最关键的一点是:
Non-discoverable mode ≠ 不发广播。
它真正表示的是:设备不把自己声明为"可发现设备"。
一、表 9.2 想表达什么?
表 9.2 是 Device Discovery requirements,也就是不同 GAP 角色对发现模式和发现过程的支持要求。
表里有四个 GAP 角色:
Peripheral
Central
Broadcaster
Observer
表里常见字母含义可以这样理解:
M = Mandatory,必须支持
O = Optional,可选支持
E = Excluded,不适用 / 不要求支持
C.1 = 条件要求
这张表的重点是区分:
谁负责"被发现"
谁负责"发现别人"
二、表 9.2 的关键信息
1. Peripheral 必须支持 Non-discoverable mode
表中:
Non-Discoverable mode
Peripheral = M
意思是:
Peripheral 角色必须支持不可发现模式。
这很好理解。
Peripheral 通常是被 Central 扫描、发现、连接的一方。
但 Peripheral 并不是永远都必须让别人发现它。
它必须有能力进入:
我现在不希望被发现
这种状态。
比如:
设备已经被绑定,不再开放给新用户发现;
设备进入低功耗状态;
设备不在配网模式;
设备只允许指定设备连接;
设备只想广播某些数据,但不希望被当成可发现设备。
2. Limited Discoverable mode 对 Peripheral 是可选的
表中:
Limited Discoverable mode
Peripheral = O
意思是:
Peripheral 可以选择是否支持有限可发现模式。
Limited Discoverable mode 通常用于临时发现窗口。
比如:
用户按下设备按键后,设备 60 秒内可以被 App 发现;
设备刚恢复出厂设置后,短时间进入添加设备模式;
设备进入配网模式时才允许被发现。
不是所有 Peripheral 都需要这种模式,所以它是 Optional。
3. General Discoverable mode 对 Peripheral 是 C.1 条件要求
表中:
General Discoverable mode
Peripheral = C.1
表下面解释:
C.1: Optional if limited discoverable mode is supported, otherwise mandatory.
意思是:
如果设备支持 Limited Discoverable mode,那么 General Discoverable mode 可以不支持;如果设备不支持 Limited Discoverable mode,那么 General Discoverable mode 就必须支持。
换句话说,Peripheral 至少要有一种"可发现"的方式。
可以是:
Limited Discoverable mode
也可以是:
General Discoverable mode
如果两者都不支持,那这个 Peripheral 就永远无法被发现,这显然不符合普通 Peripheral 的使用场景。
所以规范的意思是:
Peripheral 必须支持 Non-discoverable mode;
Peripheral 至少要支持一种 Discoverable mode;
Limited 和 General 不一定都要支持。
4. Central 必须支持 General Discovery procedure
表中:
General Discovery procedure
Central = M
意思是:
Central 角色必须支持普通发现过程。
Central 通常是手机、网关、主机设备。
它需要能够扫描并发现周围的可发现 Peripheral。
所以 General Discovery procedure 对 Central 是必须的。
从 App 开发角度看:
手机 App 扫描周围 BLE 外设
这就是 Central 侧非常典型的 General Discovery 行为。
5. Central 可选支持 Limited Discovery procedure
表中:
Limited Discovery procedure
Central = O
意思是:
Central 可以选择支持有限发现过程。
Limited Discovery procedure 主要用于只查找那些处于 Limited Discoverable mode 的设备。
比如 App 只想找"正在配网模式"的设备,而不是把所有可发现设备都列出来。
这不是所有 Central 都必须实现的,所以是 Optional。
6. Name Discovery procedure 对 Peripheral 和 Central 都是可选的
表中:
Name Discovery procedure
Peripheral = O
Central = O
意思是:
名称发现过程对 Peripheral 和 Central 都是可选支持。
Name Discovery procedure 关注的是获取对方设备名称。
在实际 BLE App 中,设备名称可能来自:
Advertising Data
Scan Response Data
GATT Device Name characteristic
系统缓存
所以它作为一个独立过程,不一定是所有设备都必须支持。
7. Broadcaster 和 Observer 在 Discovery 表里基本都是 E
表中 Broadcaster、Observer 对这些 Discovery modes/procedures 基本都是:
E
这是因为:
Discovery 这一节主要围绕 Peripheral / Central 的发现关系。
Broadcaster / Observer 是前一节 Broadcast / Observation 的角色:
Broadcaster:只发无连接广播数据
Observer:只接收无连接广播数据
而 Discovery 强调的是:
设备是否可被发现
设备如何发现可发现设备
所以 Discovery 这套模式和过程主要适用于 Peripheral 和 Central。
三、9.2.2 Non-discoverable mode 想表达什么?
这一小节讲的是 不可发现模式。
它分为两部分:
Description:描述
Conditions:条件
核心意思是:
处于 Non-discoverable mode 的设备,不会被执行 General Discovery procedure 或 Limited Discovery procedure 的设备发现。
注意,这里说的是不会被"发现过程"发现,不是说它一定不会被扫描到任何广播包。
四、Non-discoverable mode 的 Description
原文大意是:
配置为 non-discoverable mode 的设备,不会被任何正在执行 general discovery procedure 或 limited discovery procedure 的设备发现。
也就是说:
如果一个设备处于不可发现模式,那么扫描方即使在执行:
General Discovery procedure
或者:
Limited Discovery procedure
也不应该把它当作"可发现设备"。
这里有一个重要理解:
Non-discoverable mode 是 GAP 语义上的不可发现,不一定代表空口上完全没有广播。
也就是说:
设备可能仍然发广播;
扫描设备可能仍然收到某些广播包;
但这个设备没有声明自己处于 discoverable mode;
所以它不属于 discovery procedure 要发现的目标。
五、Non-discoverable mode 的 Conditions
1. 不可发现模式下,设备仍然可以发送 advertising events
原文说:
A device in the non-discoverable mode may send advertising events.
意思是:
处于不可发现模式的设备,可以发送广播事件。
这句话非常关键。
很多人会误以为:
不可发现 = 不发广播
这是不准确的。
更准确地说:
不可发现 = 不通过 GAP discoverable 标志声明自己可被发现
设备仍然可能发送广播,用于:
广播无连接数据
广播厂商自定义数据
广播非发现用途的数据
定向给特定设备的广播
配合某些过滤策略进行受控扫描/连接
所以要把两个概念分开:
是否发广播
和:
是否可被发现
这是两个不同维度。
2. 如果发送广播,不能设置 General / Limited Discoverable Flag
原文说:
If the device sends advertising events, it shall not set the 'LE General Discoverable Mode' flag or 'LE Limited Discoverable Mode' flag in the Flags AD type.
意思是:
如果设备处于 Non-discoverable mode,并且它还发送广播,那么它不能在 Flags AD Type 里设置:
LE General Discoverable Mode
LE Limited Discoverable Mode
也就是说,它不能一边说:
我处于不可发现模式
一边又在广播 Flags 里声明:
我是 General Discoverable
或者:
我是 Limited Discoverable
这会造成 GAP 语义冲突。
六、Flags AD Type 中的 Discoverable Flag 是什么?
BLE 广播数据通常由一个个 AD Structure 组成:
Length | AD Type | AD Data
其中 AD Type = 0x01 是 Flags。
Flags 里面有一些 bit 位,用来表达设备当前的 GAP 语义状态。
常见有:
LE Limited Discoverable Mode
LE General Discoverable Mode
BR/EDR Not Supported
Simultaneous LE and BR/EDR capability
在 Discovery 这里最关键的是两个:
LE Limited Discoverable Mode
LE General Discoverable Mode
如果设备设置了这些 bit,扫描方就可以根据它判断设备是否处于可发现模式。
所以 Non-discoverable mode 的设备不能设置这两个 bit。
七、推荐配置 1:设置 Advertising Filter Policy
原文说,如果设备发送广播,建议 Host 配置 Controller:
advertising filter policy for all advertising sets to either
process scan and connection requests only from devices in the Filter Accept List
or process scan and connection requests from all devices.
意思是:
如果不可发现模式下仍然发送广播,Host 应该为所有 advertising sets 设置广播过滤策略,选择以下之一:
只处理 Filter Accept List 中设备的扫描请求和连接请求
或者:
处理所有设备的扫描请求和连接请求
这里说的是 Advertising Filter Policy。
它决定广播方如何处理别人发来的:
Scan Request
Connect Request
第一种:只处理 Filter Accept List 中的设备
这种适合比较受控的场景。
比如设备不希望被所有人交互,只允许已知设备:
扫描它
连接它
获取扫描响应
这里的 Filter Accept List 可以理解为控制器维护的一份允许名单。
以前很多资料里会叫 whitelist,现在规范中更推荐叫:
Filter Accept List
第二种:处理所有设备
这种比较开放。
只要有设备扫描或连接,就可以处理。
不过注意:
即使处理所有设备的请求,也不代表它就是 discoverable mode。
因为只要它没有设置 General / Limited Discoverable Flag,它在 GAP 语义上仍然是 Non-discoverable mode。
八、推荐配置 2:设置 Advertising Interval
原文说:
The Host should set the advertising intervals as defined in Section 9.3.11.
意思是:
Host 应该按照 9.3.11 中定义的要求设置广播间隔。
这里是在提醒:
即使处于不可发现模式,如果设备仍然要发送广播,也不能完全随意设置广播间隔,而应该符合 GAP 对广播间隔的建议或要求。
广播间隔会影响:
被扫描到的概率
功耗
空口占用
连接建立速度
系统兼容性
虽然你截图里没有展开 9.3.11,但这里可以先知道:
不同 GAP 模式下,规范通常会对 Advertising Interval 给出推荐范围。
后面看到 9.3.11 时,需要把它和具体模式关联起来看。
九、这部分和 HCI Command 的关系
这部分是 GAP 语义,但实际配置会落到 HCI Advertising 相关命令。
如果是 Legacy Advertising,常见会涉及:
LE Set Advertising Parameters
LE Set Advertising Data
LE Set Advertising Enable
其中:
Advertising_Filter_Policy
Advertising_Interval_Min
Advertising_Interval_Max
Advertising_Type
都和这里有关。
如果是 Extended Advertising,常见会涉及:
LE Set Extended Advertising Parameters
LE Set Extended Advertising Data
LE Set Extended Advertising Enable
其中每个 Advertising Set 都可以有自己的:
Advertising_Handle
Advertising_Event_Properties
Primary_Advertising_Interval_Min
Primary_Advertising_Interval_Max
Advertising_Filter_Policy
所以 GAP 讲的是"应该处于什么模式、应该表达什么语义";HCI Command 负责把这些语义配置到 Controller 里。
十、这部分最容易误解的地方
1. Non-discoverable 不是不广播
这是这一节最重要的点。
Non-discoverable mode may send advertising events.
说明不可发现模式下仍然可以发广播。
真正不能做的是:
不能设置 LE General Discoverable Mode flag
不能设置 LE Limited Discoverable Mode flag
2. 可扫描 / 可连接 不完全等于可发现
一个设备可能允许某些扫描请求或连接请求,但如果它没有设置 discoverable flags,从 GAP Discovery 角度看,它仍然不是 discoverable device。
所以要区分:
广播事件类型是否 scannable / connectable
和:
GAP 语义上是否 discoverable
这两个不是完全等价的概念。
3. Discoverable 是 GAP 语义,不只是扫描结果
App 扫描到一个广播包,不代表这个设备一定是 discoverable mode。
如果 App 是 BLE 调试工具,可能会把所有收到的广播都列出来。
但从 GAP Discovery 规范角度,只有符合 discoverable 条件的设备,才是发现过程的目标。
十一、结合实际 App 开发理解
假设一个 BLE 设备有三种状态:
状态一:配网模式
设备希望 App 搜索并添加它。
它应该进入:
Limited Discoverable Mode
或者:
General Discoverable Mode
并且在 Flags AD Type 中设置对应 discoverable flag。
状态二:正常工作模式
设备已经绑定用户,不希望陌生 App 把它作为"可添加设备"发现。
它可以进入:
Non-discoverable mode
但仍然发送广播,例如:
广播设备状态
广播厂商数据
广播电量
广播传感器数据
此时不能设置 General / Limited Discoverable Flag。
状态三:仅允许已绑定手机交互
设备可以处于 Non-discoverable mode,同时设置 Advertising Filter Policy,让 Controller 只处理 Filter Accept List 中设备的扫描请求或连接请求。
这样可以做到:
不对所有人开放发现
但允许已知设备继续交互
十二、这一节总结
这部分可以总结为:
表 9.2 定义了不同 GAP 角色对 Discovery modes 和 procedures 的支持要求。
Peripheral 必须支持 Non-discoverable mode。
Peripheral 至少应该支持一种可发现模式:Limited 或 General。
Central 必须支持 General Discovery procedure,可选支持 Limited Discovery procedure。
Non-discoverable mode 表示设备不会被 General Discovery 或 Limited Discovery 过程发现。
但 Non-discoverable mode 下设备仍然可以发送 advertising events。
如果不可发现模式下仍然发送广播,就不能设置 LE General Discoverable Mode 或 LE Limited Discoverable Mode flag。
Host 还应合理配置 advertising filter policy 和 advertising interval。
这一节最重要的一句话是:
不可发现模式不是"不发广播",而是"不声明自己可被发现"。

这部分讲的是 Limited Discoverable Mode:有限可发现模式。
它是 Discovery 章节里非常重要的一种模式,核心意思是:
设备在有限时间内,让其他设备可以发现自己。通常是用户执行了某个动作后,设备临时进入"可被发现"的状态。
比如:
用户长按设备按键 3 秒
设备进入配网模式
设备在 30 秒或 60 秒内可以被手机 App 扫描发现
超时后退出可发现状态
这就是 Limited Discoverable Mode 的典型场景。
一、这部分整体想表达什么?
这部分主要说明:
Limited Discoverable Mode 是一种临时性的可发现模式。
处于这个模式的设备,可以被下面两类发现过程找到:
Limited Discovery Procedure
General Discovery Procedure
也就是说:
执行有限发现过程的设备可以找到它;执行普通发现过程的设备也可以找到它。
但是它不是长期可发现,而是:
只在有限时间内可发现
通常由用户动作触发
例如:
按键进入添加设备模式
开机后短时间可发现
恢复出厂设置后进入配网模式
App 引导用户操作设备后,设备短时间开放发现
二、Limited Discoverable Mode 的核心定位
Limited Discoverable Mode 可以理解为:
我现在临时开放给别人发现,因为用户正在和我交互。
它和 General Discoverable Mode 的区别是:
| 模式 | 含义 | 典型场景 |
|---|---|---|
| Limited Discoverable Mode | 短时间、临时可发现 | 添加设备、配网、按键触发 |
| General Discoverable Mode | 普通常规可发现 | 长期广播、普通设备列表展示 |
| Non-discoverable Mode | 不可发现 | 已绑定后隐藏、低功耗、非开放状态 |
所以 Limited Discoverable Mode 的重点不是"永远被扫到",而是:
我现在处于一个特殊窗口期,应该被优先发现或筛选出来。
三、为什么要使用 Limited Discoverable Mode?
规范中给了两个常见原因。
1. 让 General Discovery Procedure 可以优先展示这些设备
原文第一点大意是:
Limited Discoverable Mode 可以让执行 General Discovery Procedure 的远端设备,在展示扫描结果时,优先展示或识别处于 Limited Discoverable Mode 的设备。
这句话很贴近 App 开发。
假设手机 App 正在扫描周围所有 BLE 设备。
周围可能有很多设备:
普通蓝牙模块
手环
耳机
Beacon
传感器
正在配网的设备
如果某个设备设置了:
LE Limited Discoverable Mode flag = 1
那么 App 或系统就可以知道:
这个设备正在一个临时可发现窗口里
用户大概率正在操作它
它更可能是当前要添加的设备
所以在设备列表中,可以:
优先展示它
标记它为"可添加设备"
把它排在前面
减少用户选择错误设备的概率
这就是 Limited Discoverable Mode 的第一个用途。
2. 让 Limited Discovery Procedure 可以过滤掉普通可发现设备
原文第二点大意是:
Limited Discoverable Mode 也可以让执行 Limited Discovery Procedure 的远端设备,过滤掉处于 General Discoverable Mode 的设备。
也就是说,如果手机 App 只想找"临时开放发现窗口的设备",它可以执行 Limited Discovery Procedure。
这样它就不会把普通长期可发现设备都列出来。
例如:
App 做"添加新设备"功能时,可能只想显示:
用户刚刚按键进入配网模式的设备
刚刚恢复出厂设置的设备
正在等待绑定的设备
而不想显示:
周围所有普通 BLE 广播设备
已经绑定别人的设备
其他无关模块
这时候 Limited Discovery Procedure 就很有意义。
它可以根据广播中的 Flags,筛选出:
LE Limited Discoverable Mode flag = 1
的设备。
四、Limited Discoverable Mode 的关键条件
下面是这一节最重要的条件。
1. 必须发送包含 Flags AD Type 的广播数据
原文说:
处于 Limited Discoverable Mode 的设备,应发送 advertising event types,并且 advertising data 中要包含 Flags AD Type。
也就是说,设备不能只是随便发广播数据。
它需要在广播数据中放入:
Flags AD Type
因为扫描方要通过 Flags 判断设备当前的 GAP 发现模式。
BLE 广播数据一般由 AD Structure 组成:
Length | AD Type | AD Data
其中:
AD Type = 0x01
表示 Flags。
2. LE Limited Discoverable Mode flag 必须设置为 1
这是最关键的标志。
原文要求:
The LE Limited Discoverable Mode flag set to one.
意思是:
LE Limited Discoverable Mode flag 必须设置为 1。
这表示设备明确声明:
我当前处于 Limited Discoverable Mode
扫描方看到这个 flag,就可以知道这个设备是"有限可发现"的。
3. LE General Discoverable Mode flag 必须设置为 0
原文要求:
The LE General Discoverable Mode flag set to zero.
意思是:
LE General Discoverable Mode flag 必须设置为 0。
因为 Limited Discoverable Mode 和 General Discoverable Mode 是两个不同模式。
设备不能同时说:
我是 Limited Discoverable
又说:
我是 General Discoverable
所以在 Limited Discoverable Mode 下:
LE Limited Discoverable Mode = 1
LE General Discoverable Mode = 0
这两个 flag 是学习这一节最应该记住的内容。
4. 对于 LE-only 设备,还要设置 BR/EDR 相关 flags
原文说,对于 LE-only implementation,还要满足:
BR/EDR Not Supported flag = 1
Simultaneous LE and BR/EDR to Same Device Capable (Controller) flag = 0
意思是,如果设备是 只支持 BLE,不支持经典蓝牙 BR/EDR 的设备,那么 Flags 里还要表达这个事实。
BR/EDR Not Supported flag = 1
表示:
这个设备不支持经典蓝牙 BR/EDR
也就是我们平时说的:
这是一个 LE-only 设备
很多 BLE 模块广播中的 Flags 常见值是:
0x06
它通常表示:
LE General Discoverable Mode = 1
BR/EDR Not Supported = 1
而如果是 Limited Discoverable Mode,常见组合可能是:
LE Limited Discoverable Mode = 1
BR/EDR Not Supported = 1
也就是 Flags 里的对应 bit 要正确设置。
Simultaneous LE and BR/EDR to Same Device Capable flag = 0
表示:
不支持同时对同一设备进行 LE 和 BR/EDR 通信能力
对于 LE-only 设备来说,这个自然应为 0。
五、建议广播数据中包含哪些 AD Type?
规范说,为了更快的连接体验,广播数据中也应该包含下面这些 AD Type。
注意这里是 should ,不是 shall。
也就是推荐,不是绝对强制。
1. TX Power Level AD Type
TX Power Level
表示广播发送功率。
它可以帮助扫描方粗略评估信号情况。
但是要注意:
不要只用 RSSI 判断距离。
更合理的方式是结合:
RSSI
TX Power
环境衰减
广播间隔
手机型号差异
天线方向
TX Power Level 可以提供参考,但不能精确测距。
2. Local Name AD Type
Local Name
表示设备名称。
这对 App 展示设备列表非常重要。
比如:
FSC-BT976
MySensor
BLE_UART
如果广播数据空间不够,完整名称经常放在 Scan Response Data 中。
也就是说:
Advertising Data 放 Flags / UUID / 厂商数据
Scan Response Data 放 Complete Local Name
但前提是广播事件必须是 scannable,扫描方也要使用 active scanning。
3. Service or Service Class UUIDs AD Type
Service UUIDs
表示设备提供哪些服务。
比如:
0x180D:Heart Rate
0x180F:Battery Service
0xFFF0:厂商自定义服务
App 可以通过 Service UUID 判断这个设备是不是自己要找的设备。
例如你做蓝牙模块 App,经常会用 Service UUID 来过滤设备列表。
4. Peripheral Connection Interval Range AD Type
Peripheral Connection Interval Range
表示 Peripheral 希望使用的连接间隔范围。
这可以帮助 Central 在连接后选择更合适的连接参数。
比如设备希望:
最小连接间隔:20 ms
最大连接间隔:50 ms
这样 Central 可以更快进入合适的通信状态。
不过实际连接参数最终是否采用,还要看 Central 的策略和平台限制。
例如 iOS 对连接参数有自己的约束,不是 Peripheral 想要什么就一定能给什么。
六、Limited Discoverable Mode 有时间限制
原文说:
Devices shall remain in the limited discoverable mode no longer than T_GAP(lim_adv_timeout).
意思是:
设备处于 Limited Discoverable Mode 的时间不能超过 T_GAP(lim_adv_timeout)。
也就是说,这个模式不是长期模式。
它应该有一个超时时间。
比如:
进入 Limited Discoverable Mode
开始广播
等待手机发现或连接
如果超时还没有连接,就退出 Limited Discoverable Mode
这和它的名字 "Limited" 是一致的。
七、Host 在 Limited Discoverable Mode 下应该如何配置 Controller?
规范提到两个配置点。
1. Advertising Filter Policy 应处理所有设备的扫描和连接请求
原文说:
Host 应为所有使用相同 Identity Address 或相同 IRK 的 advertising sets 设置 advertising filter policy,使其处理来自所有设备的 scan 和 connection requests。
也就是说,处于 Limited Discoverable Mode 时,设备应该开放给所有设备发现和连接请求。
原因很简单:
Limited Discoverable Mode 通常表示:
用户正在尝试添加设备
设备处于临时开放窗口
如果这时候还只允许白名单设备扫描或连接,新的手机 App 可能就发现不了或连接不了它。
所以这里要求:
process scan and connection requests from all devices
从 HCI 角度看,就是 Advertising Filter Policy 不能设置成只允许 Filter Accept List。
2. Advertising Interval 应按照 9.3.11 设置
原文说:
The Host should set the advertising intervals as defined in Section 9.3.11.
意思是:
Host 应该按照 9.3.11 的规定设置广播间隔。
这一点和用户体验很相关。
广播间隔越短:
越容易被快速发现
连接建立可能更快
功耗更高
空口占用更多
广播间隔越长:
功耗更低
但发现时间变长
用户可能觉得搜索很慢
所以规范注释说:
The choice of advertising interval is a trade-off between power consumption and device discovery time.
意思是:
广播间隔的选择,是功耗和设备发现时间之间的权衡。
这句话在实际产品中非常重要。
比如:
配网模式下,可以使用较短广播间隔,让 App 快速发现;
正常工作模式下,可以使用较长广播间隔,降低功耗。
八、什么时候退出 Limited Discoverable Mode?
原文说:
The device shall remain in limited discoverable mode until a connection is established or the Host terminates the mode.
意思是:
设备应保持在 Limited Discoverable Mode,直到建立连接,或者 Host 终止该模式。
也就是说,退出条件通常有两个:
连接成功
Host 主动终止
再结合前面的时间限制,也可以理解为:
连接成功后退出
用户取消后退出
超时后退出
业务逻辑主动退出
例如:
用户按键进入配网模式
设备开始 Limited Discoverable 广播
手机 App 连接成功
设备退出 Limited Discoverable Mode
或者:
用户按键进入配网模式
60 秒内没有手机连接
Host 停止该模式
设备退出 Limited Discoverable Mode
九、设备可以配置多个 Advertising Sets
最后一句说:
The device may configure and enable multiple independent advertising sets.
意思是:
设备可以配置并启用多个独立的 Advertising Sets。
这主要对应 Extended Advertising 的能力。
例如设备可以:
Advertising Set 1:用于 Limited Discoverable,方便 App 添加设备
Advertising Set 2:用于广播厂商自定义数据
Advertising Set 3:用于周期广播或其他用途
但是注意前面讲过:
如果多个 Advertising Sets 使用相同 Identity Address 或相同 IRK,并且处于 Discoverable Mode,它们的 Advertising Filter Policy 要保持一致。
十、结合 HCI Command 怎么理解?
这一节是 GAP 层语义,真正配置时会落到 HCI 命令。
Legacy Advertising 常见相关命令:
LE Set Advertising Parameters
LE Set Advertising Data
LE Set Scan Response Data
LE Set Advertising Enable
其中要重点关注:
Advertising_Type
Advertising_Interval_Min
Advertising_Interval_Max
Advertising_Filter_Policy
Advertising_Data 中的 Flags AD Type
Advertising_Data / Scan_Response_Data 中的 Local Name、UUID、TX Power 等
如果是 Extended Advertising,则对应:
LE Set Extended Advertising Parameters
LE Set Extended Advertising Data
LE Set Extended Scan Response Data
LE Set Extended Advertising Enable
其中会涉及多个 Advertising Set。
十一、这部分最重要的理解点
1. Limited Discoverable Mode 是"临时可发现"
它不是长期广播模式。
它适合:
配网
添加设备
按键触发发现
用户正在操作设备
2. Limited Discoverable 设备可以被 Limited 和 General Discovery 找到
也就是说:
执行 Limited Discovery Procedure 的设备可以找到它
执行 General Discovery Procedure 的设备也可以找到它
但 Limited Discovery Procedure 通常只关心 Limited Discoverable 设备。
3. Flags 设置必须正确
Limited Discoverable Mode 下:
LE Limited Discoverable Mode flag = 1
LE General Discoverable Mode flag = 0
如果是 LE-only 设备:
BR/EDR Not Supported flag = 1
Simultaneous LE and BR/EDR to Same Device Capable = 0
这几个 flag 是广播数据解析时非常重要的判断依据。
4. 应该开放处理所有设备的扫描和连接请求
Limited Discoverable Mode 通常用于让新设备发现和连接。
所以 Advertising Filter Policy 应该允许:
process scan and connection requests from all devices
否则可能出现:
用户已经按键进入配网模式
但手机 App 还是扫不到或连接不上
5. 广播间隔是功耗和发现速度之间的权衡
短间隔:
发现快
连接快
耗电高
长间隔:
省电
发现慢
用户体验差
所以在"添加设备/配网模式"下,通常会使用较短的广播间隔。
十二、实际 BLE 产品中的例子
假设你做一个 BLE 温湿度传感器。
设备有一个按键。
用户长按按键 5 秒后,设备进入添加模式。
此时设备应该:
进入 Limited Discoverable Mode
广播数据中设置 LE Limited Discoverable Mode flag = 1
LE General Discoverable Mode flag = 0
如果是 LE-only,BR/EDR Not Supported flag = 1
广播中包含设备名、Service UUID、TX Power 等信息
Advertising Filter Policy 允许所有设备扫描和连接
广播间隔设置得较短,方便 App 快速发现
连接成功或超时后退出 Limited Discoverable Mode
手机 App 点击"添加设备"后执行 Limited Discovery Procedure。
App 只筛选出 Limited Discoverable 的设备,避免把附近所有普通 BLE 设备都列出来。
这样用户体验会更清晰:
我按了设备按键
App 只显示正在添加状态的设备
点击连接
完成绑定或配置
十三、总结
这部分的核心可以总结为:
Limited Discoverable Mode 是一种有限时间内的可发现模式,通常由用户动作触发。
处于该模式的设备可以被 Limited Discovery Procedure 或 General Discovery Procedure 发现。
它常用于添加设备、配网、临时绑定等场景。
Limited Discoverable Mode 下,广播数据必须包含 Flags AD Type,并且 LE Limited Discoverable Mode flag 要设置为 1,LE General Discoverable Mode flag 要设置为 0。
对于 LE-only 设备,还应设置 BR/EDR Not Supported flag,并清除 Simultaneous LE and BR/EDR to Same Device Capable flag。
为了更快连接体验,广播数据建议包含 TX Power Level、Local Name、Service UUID、Peripheral Connection Interval Range。
设备不能一直处于 Limited Discoverable Mode,时间不能超过 T_GAP(lim_adv_timeout)。
该模式下应允许所有设备的扫描和连接请求。
广播间隔需要在功耗和发现速度之间做权衡。
最重要的一句话是:
Limited Discoverable Mode 表示设备正在一个临时开放窗口中,适合被优先发现、筛选和连接。

这部分讲的是 General Discoverable Mode:普通可发现模式。
它和上一节 Limited Discoverable Mode 很像,都是"设备允许被发现",但核心区别是:
General Discoverable Mode 是普通、常规、可持续的可发现模式;Limited Discoverable Mode 是短时间、临时性的可发现模式。
一句话概括:
General Discoverable Mode 表示设备可以在不限定时间的情况下,被执行 General Discovery Procedure 的设备发现。
一、这部分整体想表达什么?
这部分主要说明:
处于 General Discoverable Mode 的设备,可以被执行 General Discovery Procedure 的设备发现。
但是它有一个限制:
General Discoverable Mode 的设备不会被 Limited Discovery Procedure 发现。
也就是说:
General Discoverable Mode
只能被 General Discovery Procedure 发现
不能被 Limited Discovery Procedure 发现
这和 Limited Discoverable Mode 不同。
上一节讲过:
Limited Discoverable Mode
可以被 Limited Discovery Procedure 发现
也可以被 General Discovery Procedure 发现
所以两者关系可以这样理解:
| 被发现方模式 | General Discovery Procedure 能发现吗 | Limited Discovery Procedure 能发现吗 |
|---|---|---|
| Limited Discoverable Mode | 能 | 能 |
| General Discoverable Mode | 能 | 不能 |
| Non-discoverable Mode | 不能 | 不能 |
这是理解 Discovery 章节非常关键的一张逻辑表。
二、General Discoverable Mode 的定位
General Discoverable Mode 可以理解为:
我现在是普通可发现状态,其他设备可以通过普通发现流程找到我。
它通常不是由用户短时间动作触发,而是设备自主进入的一种常规状态。
比如:
BLE 模块开机后一直广播,等待 App 发现和连接
普通蓝牙外设长期处于可发现状态
传感器设备周期性广播,允许中心设备发现
调试模块一直允许 nRF Connect / LightBlue 扫描发现
原文也说:
Devices typically enter general discoverable mode autonomously.
意思是:
设备通常会自动进入 General Discoverable Mode。
例如设备开机后,固件自动开始普通可发现广播,而不是必须等用户按键。
三、General Discoverable Mode 和 Limited Discoverable Mode 的区别
这部分最应该抓住的就是这个区别。
1. 时间上的区别
Limited Discoverable Mode:
有限时间
临时开放
通常由用户动作触发
General Discoverable Mode:
不限定时间
普通开放
通常由设备自动进入
原文说:
discoverable for an indefinite period of time
意思是:
可以在不确定、未限定的时间内被发现。
这里的 indefinite 不是说"永远不能退出",而是说:
规范没有要求它像 Limited Discoverable Mode 那样必须在某个超时时间内退出。
设备仍然可以在连接建立后退出,或者由 Host 主动终止。
2. 被发现方式的区别
Limited Discoverable Mode:
能被 Limited Discovery Procedure 发现
也能被 General Discovery Procedure 发现
General Discoverable Mode:
只能被 General Discovery Procedure 发现
不能被 Limited Discovery Procedure 发现
所以如果 App 执行的是 Limited Discovery Procedure,那么它的目标就是找"临时可发现"的设备,不会找 General Discoverable Mode 的设备。
3. 使用场景的区别
Limited Discoverable Mode 更适合:
添加设备
配网模式
按键触发
临时绑定
用户正在操作设备
General Discoverable Mode 更适合:
普通设备扫描
常规可发现
长期广播
调试工具扫描
普通 BLE 模块等待连接
所以如果一个产品明确知道对方 App 使用的是 Limited Discovery Procedure,就不应该只使用 General Discoverable Mode。
原文也说:
General discoverable mode should not be used if it is known that the device performing discovery will be using the limited discovery procedure.
意思是:
如果你知道扫描方会使用 Limited Discovery Procedure,就不应该使用 General Discoverable Mode。
因为对方发现不了你。
四、General Discoverable Mode 的 Conditions
这一节的条件和 Limited Discoverable Mode 很相似,但 Flags 的设置相反。
1. 广播数据必须包含 Flags AD Type
处于 General Discoverable Mode 的设备,需要发送 advertising events,并且 advertising data 中要包含:
Flags AD Type
Flags AD Type 是广播数据中的一种 AD Structure,用来表达设备的 GAP 状态。
广播数据格式一般是:
Length | AD Type | AD Data
其中:
AD Type = 0x01
表示 Flags。
扫描方可以通过 Flags 判断这个设备是:
Limited Discoverable
General Discoverable
Non-discoverable
LE-only
是否支持 BR/EDR
2. LE Limited Discoverable Mode flag 必须为 0
原文要求:
The LE Limited Discoverable Mode flag set to zero.
意思是:
LE Limited Discoverable Mode flag 必须设置为 0。
因为设备现在不是 Limited Discoverable Mode。
3. LE General Discoverable Mode flag 必须为 1
原文要求:
The LE General Discoverable Mode flag set to one.
意思是:
LE General Discoverable Mode flag 必须设置为 1。
这表示设备明确告诉扫描方:
我当前处于 General Discoverable Mode
所以 General Discoverable Mode 下,两个关键 flag 是:
LE Limited Discoverable Mode = 0
LE General Discoverable Mode = 1
这和 Limited Discoverable Mode 正好相反:
Limited Discoverable Mode:
LE Limited Discoverable Mode = 1
LE General Discoverable Mode = 0
五、LE-only 设备的 Flags 设置
原文说,对于 LE-only implementation,还需要设置:
BR/EDR Not Supported flag = 1
Simultaneous LE and BR/EDR to Same Device Capable (Controller) flag = 0
意思是:
如果设备只支持 BLE,不支持经典蓝牙 BR/EDR,那么 Flags 里也要表达出来。
1. BR/EDR Not Supported flag = 1
表示:
设备不支持经典蓝牙 BR/EDR
也就是:
这是一个 LE-only 设备
在很多 BLE 模块中,广播 Flags 常见值是:
02 01 06
拆开看:
02:后面还有 2 个字节
01:AD Type = Flags
06:Flags value
0x06 二进制是:
0000 0110
通常表示:
LE General Discoverable Mode = 1
BR/EDR Not Supported = 1
也就是说,很多 BLE-only 模块默认发的 Flags 0x06,就符合 General Discoverable Mode 的典型组合。
2. Simultaneous LE and BR/EDR to Same Device Capable flag = 0
表示:
不支持同时对同一设备进行 LE 和 BR/EDR 通信
对于 LE-only 设备来说,因为它本来就不支持 BR/EDR,所以这个 flag 应该为 0。
六、建议包含的 AD Type
原文说,为了更快的连接体验,广播数据中也应该包含以下 AD Types。
这里是 should,也就是建议,不是绝对强制。
1. TX Power Level AD Type
表示广播发送功率。
它可以帮助扫描方结合 RSSI 做粗略判断。
但要注意:
TX Power Level 不是距离,RSSI 也不是距离。
更合理的理解是:
TX Power Level:发射端声明的发送功率参考
RSSI:接收端测到的信号强度
二者可以作为信号质量或粗略距离判断的参考,但不能精确表示真实距离。
2. Local Name AD Type
表示设备名称。
例如:
FSC-BT976
BLE_UART
MySensor
它用于 App 展示设备列表。
如果广播数据空间不够,完整设备名经常放到 Scan Response Data 里。
3. Service or Service Class UUIDs AD Type
表示设备支持的 Service UUID。
例如:
180F:Battery Service
180D:Heart Rate
FFF0:厂商自定义服务
App 经常会通过 Service UUID 过滤目标设备。
比如一个 BLE 串口 App 可能只展示包含指定 Service UUID 的设备。
4. Peripheral Connection Interval Range AD Type
表示 Peripheral 希望使用的连接间隔范围。
它可以帮助 Central 在连接后选择更合适的连接参数。
不过最终是否采用这个范围,取决于 Central 和系统蓝牙栈。
例如 iOS、Android 都会有自己的连接参数策略,Peripheral 不能完全决定连接间隔。
七、General Discoverable Mode 下的 Controller 配置
原文说,在 General Discoverable Mode 下,Host 应该这样配置 Controller。
1. Advertising Filter Policy 应处理所有设备的扫描和连接请求
原文要求:
process scan and connection requests from all devices
意思是:
Host 应该把 advertising filter policy 设置为处理来自所有设备的扫描请求和连接请求。
原因是:
General Discoverable Mode 的语义是:
我现在普通可发现,允许其他设备发现我
如果这时候只允许 Filter Accept List 中的设备扫描或连接,就会影响普通发现过程。
所以对于使用相同 Identity Address 或相同 IRK 的 advertising sets,过滤策略应该一致,并且应该开放处理所有设备的请求。
2. Advertising Interval 应按照 Section 9.3.11 设置
原文说:
The Host should set the advertising intervals as defined in Section 9.3.11.
意思是:
Host 应该按照 9.3.11 中定义的要求设置广播间隔。
广播间隔会影响两个关键因素:
发现速度
功耗
广播间隔短:
更容易被快速发现
连接建立更快
功耗更高
广播间隔长:
更省电
但被发现时间更长
用户可能觉得搜索慢
所以原文 Note 也特别提醒:
The choice of advertising interval is a trade-off between power consumption and device discovery time.
意思是:
广播间隔的选择,是功耗和设备发现时间之间的权衡。
八、什么时候退出 General Discoverable Mode?
原文说:
The device shall remain in general discoverable mode until a connection is established or the Host terminates the mode.
意思是:
设备应保持在 General Discoverable Mode,直到连接建立,或者 Host 终止该模式。
也就是说,退出条件通常是:
连接成功
Host 主动终止
业务逻辑要求退出
例如:
BLE 模块开机后进入 General Discoverable Mode
手机 App 扫描到它
手机 App 发起连接
连接建立后,设备退出 General Discoverable Mode
或者:
设备长时间无人连接
Host 根据业务逻辑停止广播
退出 General Discoverable Mode
注意:
General Discoverable Mode 没有像 Limited Discoverable Mode 那样强调不能超过 T_GAP(lim_adv_timeout)。
因为它本身就是"不限定时间"的普通可发现模式。
九、Legacy Advertising 中动态数据和静态数据的放置建议
原文有一个 Note:
Host data used in legacy advertising events that change frequently should be placed in the advertising data and static data should be placed in the scan response data.
意思是:
在 Legacy Advertising 中,经常变化的数据应该放在 Advertising Data 中,静态数据应该放在 Scan Response Data 中。
这个建议很重要,也很实用。
1. 为什么动态数据放 Advertising Data?
Advertising Data 是广播方主动周期性发出的数据。
扫描方只要扫描到广播包,就能拿到 Advertising Data。
如果数据变化频繁,比如:
电量
温度
状态
计数值
传感器数据
实时广播字段
把它放在 Advertising Data 中,扫描方更容易及时收到变化。
2. 为什么静态数据放 Scan Response Data?
Scan Response Data 只有在主动扫描时才会返回。
它不一定每次都被所有扫描方拿到。
适合放一些变化不频繁的数据,比如:
完整设备名
厂商固定信息
较长的静态描述
部分固定 UUID 信息
这样可以节省 Advertising Data 空间,把更重要、更动态的数据放在主广播包里。
3. 这和 BLE App 扫描结果很相关
如果 App 使用 Passive Scanning,只能拿到 Advertising Data,拿不到 Scan Response Data。
如果 App 使用 Active Scanning,才可能拿到 Scan Response Data。
所以如果一个字段很重要,并且希望所有扫描方都尽量看到,就不要只放在 Scan Response Data 里。
十、General Discoverable Mode 和 HCI Command 的关系
这一节是 GAP 语义,最终会落到 HCI 广播配置。
Legacy Advertising 常见相关命令:
LE Set Advertising Parameters
LE Set Advertising Data
LE Set Scan Response Data
LE Set Advertising Enable
关键配置包括:
Advertising_Type
Advertising_Interval_Min
Advertising_Interval_Max
Advertising_Filter_Policy
Advertising_Data 中的 Flags AD Type
Scan_Response_Data 中的 Local Name 等静态数据
如果是 General Discoverable Mode,Flags 里通常要体现:
LE General Discoverable Mode = 1
LE Limited Discoverable Mode = 0
BR/EDR Not Supported = 1 // 对 LE-only 设备
如果是常见 BLE-only 普通可发现广播,Flags value 经常是:
0x06
即:
LE General Discoverable Mode
BR/EDR Not Supported
十一、和前面几个模式放在一起理解
可以把目前学到的几个模式放在一起看。
1. Non-discoverable Mode
不声明自己可被发现
可以发广播
不能设置 General / Limited Discoverable Flag
不会被 General / Limited Discovery Procedure 发现
2. Limited Discoverable Mode
临时可发现
通常由用户动作触发
Limited flag = 1
General flag = 0
能被 Limited Discovery Procedure 发现
也能被 General Discovery Procedure 发现
有时间限制
3. General Discoverable Mode
普通可发现
通常自动进入
Limited flag = 0
General flag = 1
能被 General Discovery Procedure 发现
不能被 Limited Discovery Procedure 发现
没有 limited discoverable 那种超时限制
十二、实际 BLE 产品中的例子
假设你有一个 BLE 串口模块。
它开机后默认等待手机 App 连接。
这时候它可以进入:
General Discoverable Mode
广播数据可以包含:
Flags:LE General Discoverable Mode + BR/EDR Not Supported
Service UUID:例如 FFF0
Local Name:例如 FSC-BT976
TX Power Level:可选
Peripheral Connection Interval Range:可选
手机 App 执行:
General Discovery Procedure
然后可以发现这个模块,并显示在设备列表中。
如果 App 执行的是 Limited Discovery Procedure,那么这个模块不会被当作目标设备发现,因为它不是 Limited Discoverable Mode。
十三、这一节最容易误解的地方
1. General Discoverable 不是 Limited Discoverable 的增强版
不是说 General 更强,所以 Limited 能发现的它也能被发现。
实际上:
Limited Discovery Procedure 只找 Limited Discoverable 设备
General Discoverable 设备不会被 Limited Discovery Procedure 发现
2. General Discoverable 不等于一定永远广播
General Discoverable Mode 是"不限定时间可发现",但设备仍然可以因为连接建立、Host 终止、业务逻辑等原因退出。
3. Scan Response Data 不是所有扫描都能拿到
如果把 Local Name 放在 Scan Response Data 中,只有主动扫描并且交互成功时才会拿到。
所以关键动态数据不要只放 Scan Response Data。
十四、总结
这部分可以总结为:
General Discoverable Mode 是普通可发现模式,设备可以在不限定时间内被执行 General Discovery Procedure 的设备发现。
设备通常会自动进入 General Discoverable Mode,而不是必须由用户动作触发。
General Discoverable Mode 的设备不会被 Limited Discovery Procedure 发现。
如果已知扫描方使用 Limited Discovery Procedure,就不应该使用 General Discoverable Mode。
General Discoverable Mode 下,Flags AD Type 中应设置:LE Limited Discoverable Mode = 0,LE General Discoverable Mode = 1。
对于 LE-only 设备,还应设置 BR/EDR Not Supported = 1,并将 Simultaneous LE and BR/EDR to Same Device Capable 设置为 0。
为了更快连接体验,建议广播中包含 TX Power Level、Local Name、Service UUID、Peripheral Connection Interval Range。
Advertising Filter Policy 应处理所有设备的扫描和连接请求。
设备保持 General Discoverable Mode,直到连接建立或 Host 终止该模式。
Legacy Advertising 中,经常变化的数据建议放 Advertising Data,静态数据建议放 Scan Response Data。
最重要的一句话是:
General Discoverable Mode 是普通可发现模式,它服务于 General Discovery Procedure;如果对方执行的是 Limited Discovery Procedure,它不会发现你。


这部分讲的是 Limited Discovery Procedure:有限发现过程。
它是 Central 侧 / 扫描方 的一个发现过程,目标非常明确:
只发现处于 Limited Discoverable Mode 的 Peripheral 设备。
也就是说,前面 9.2.3 讲的是 Peripheral 如何进入 Limited Discoverable Mode ;这一节 9.2.5 讲的是 Central 如何执行 Limited Discovery Procedure 去发现这些设备。
一、这部分整体想表达什么?
这部分主要说明:
当一个 Central 执行 Limited Discovery Procedure 时,它只应该把"处于 Limited Discoverable Mode 的设备"当作发现结果。
它会接收设备的:
Device Address
Advertising Data
Scan Response Data
但不是所有扫到的设备都算"发现成功"。
Central 必须检查广播数据里的 Flags AD Type:
如果 LE Limited Discoverable Mode flag = 1
认为这是发现到的目标设备
否则
忽略这个广播数据
所以这节的关键点是:
Limited Discovery Procedure 不是普通扫描所有 BLE 设备,而是带筛选条件的发现流程。
二、Limited Discovery Procedure 和 General Discovery Procedure 的区别
这部分最重要的区别是:
| 过程 | 目标 |
|---|---|
| Limited Discovery Procedure | 只发现 Limited Discoverable Mode 的设备 |
| General Discovery Procedure | 发现 Limited Discoverable Mode 和 General Discoverable Mode 的设备 |
原文说:
The limited discovery procedure should only be used when it is known that the devices to be discovered are using limited discoverable mode.
意思是:
只有当你知道目标设备正在使用 Limited Discoverable Mode 时,才应该使用 Limited Discovery Procedure。
如果你的目标是"扫描附近所有可发现设备",就应该用:
General Discovery Procedure
而不是 Limited Discovery Procedure。
这在 App 开发里很重要。
比如:
适合 Limited Discovery Procedure 的场景
添加新设备
配网模式
用户按了设备按键后,设备短时间开放发现
只想找正在等待绑定的设备
不适合 Limited Discovery Procedure 的场景
普通 BLE 调试工具扫描
类似 nRF Connect 扫描附近所有设备
App 首页展示附近所有可连接设备
扫描长期广播的普通 BLE 模块
如果目标设备只是 General Discoverable Mode,而 App 却执行 Limited Discovery Procedure,那么 App 可能会把它过滤掉。
三、图 9.1 想表达什么?
图 9.1 是一个时序图,表达的是:
Central 执行 Limited Discovery Procedure 时,只会把 Limited Discoverable 的 Peripheral 加入发现列表,不会把 General Discoverable 的 Peripheral 加入列表。
图中有三个角色:
Central
Peripheral 1
Peripheral 2
其中:
Peripheral 1 进入 limited discoverable
Peripheral 2 进入 general discoverable
Central 开始扫描
Central 收到两个设备的 advertising event
Central 停止扫描
最终列表中只保留 limited discoverable mode devices
也就是说:
虽然 Central 可能在空口上收到了两个设备的广播:
advertising event ('limited')
advertising event ('general')
但是 Limited Discovery Procedure 的结果列表只包含:
limited discoverable mode devices only
这就是图的核心含义。
四、关键信息 1:建议扫描设备支持的所有 PHY
原文说:
It is recommended that the device scan on all the PHYs it supports.
意思是:
建议执行 Limited Discovery Procedure 的设备,在自己支持的所有 PHY 上进行扫描。
BLE 中常见的 LE PHY 包括:
LE 1M PHY
LE Coded PHY
LE 2M PHY
但注意:
广播主信道扫描主要涉及:
LE 1M PHY
LE Coded PHY
LE 2M PHY 通常不用于 primary advertising channels。
这句话的实际意思是:
如果 Central 支持多种扫描 PHY,就不要只扫一种。否则可能漏掉一些只在特定 PHY 上广播的设备。
例如:
某个设备使用 LE Coded PHY 做长距离广播;
如果 Central 只扫描 LE 1M PHY,就可能发现不了它。
五、关键信息 2:Scanning Filter Policy 要设置为 unfiltered scanning policy
原文说:
The Host shall set the scanning filter policy to an unfiltered scanning policy.
意思是:
Host 必须把扫描过滤策略设置为不过滤扫描策略。
也就是:
不要只扫描白名单 / Filter Accept List 中的设备
而是接收所有设备的广播
为什么?
因为 Limited Discovery Procedure 的目标通常是发现"临时开放发现窗口"的设备。
这类设备可能是一个新设备,还没有被绑定,也不在本机的 Filter Accept List 里。
如果 Central 扫描时只接受白名单设备,就可能发现不了新设备。
所以 Limited Discovery Procedure 要求使用:
unfiltered scanning policy
这和 Limited Discoverable Mode 那边的要求是配套的:
Peripheral 侧:处理来自所有设备的扫描和连接请求
Central 侧:扫描时不要只限制白名单
这样新设备才能被发现。
六、关键信息 3:Scan Interval 和 Scan Window 应按 9.3.11 设置
原文说:
The Host should set the scan interval and scan window as defined in Section 9.3.11.
意思是:
Host 应该按照 9.3.11 的规定设置扫描间隔和扫描窗口。
这里涉及两个参数:
Scan Interval
Scan Window
Scan Interval 是什么?
Scan Interval 表示扫描周期。
可以理解为:
多久启动一次扫描窗口
Scan Window 是什么?
Scan Window 表示每个扫描周期中真正打开接收机监听广播的时间。
可以理解为:
每次扫描持续多久
例如:
Scan Interval = 100 ms
Scan Window = 50 ms
表示大概每 100 ms 一个周期,其中 50 ms 在扫描,另外 50 ms 不扫描。
如果:
Scan Interval = Scan Window
那就是连续扫描,发现速度更快,但功耗更高。
所以 Scan Interval / Scan Window 的选择,本质上也是:
发现速度
功耗
系统负载
之间的权衡。
七、关键信息 4:建议使用 Active Scanning
原文说:
The Host should configure the Controller to use active scanning.
意思是:
Host 应该配置 Controller 使用主动扫描。
主动扫描的作用是:
不仅接收 Advertising Data
还可以通过 Scan Request 获取 Scan Response Data
过程大致是:
Peripheral 发 Advertising Packet
Central 收到后发送 Scan Request
Peripheral 返回 Scan Response
Central 得到 Scan Response Data
为什么 Limited Discovery Procedure 推荐 active scanning?
因为目标设备可能把一些有助于识别和连接的信息放在 Scan Response Data 中,比如:
完整设备名
更多 Service UUID
厂商自定义数据
TX Power
其他补充信息
如果只用 passive scanning,Central 只能拿到 Advertising Data,可能信息不够。
八、关键信息 5:扫描至少要持续一段最小时间
原文说:
The Host shall begin scanning for advertising packets and should continue for a minimum of T_GAP(lim_disc_scan_min) when scanning on the LE 1M PHY and T_GAP(lim_disc_scan_min_coded) when scanning on the LE Coded PHY...
意思是:
Host 开始扫描后,应该至少持续一个最小扫描时间。
不同 PHY 下有不同的最小时间:
LE 1M PHY:
T_GAP(lim_disc_scan_min)
LE Coded PHY:
T_GAP(lim_disc_scan_min_coded)
除非 Host 主动结束 Limited Discovery Procedure。
为什么要规定最小扫描时间?
因为广播和扫描是异步的。
Peripheral 并不是一直发广播,而是按 advertising interval 间隔发送。
Central 也不一定一直扫描,而是按 scan interval / scan window 扫描。
如果扫描时间太短,就可能刚好错过目标设备的广播。
所以规范建议至少扫一段时间,以提高发现概率。
九、关键信息 6:必须检查 Flags AD Type
这是这一节最关键的条件。
原文说:
The Host shall check for the Flags AD type in the advertising data.
意思是:
Host 必须检查 Advertising Data 中的 Flags AD Type。
然后:
If the Flags AD type is present and the LE Limited Discoverable Flag is set to one then the Host shall consider the device as a discovered device, otherwise the advertising data shall be ignored.
意思是:
如果 Flags AD Type 存在,并且 LE Limited Discoverable Flag = 1,那么 Host 才把这个设备认为是已发现设备;否则忽略该广播数据。
这个逻辑非常重要。
可以写成伪代码:
收到广播包
检查 Advertising Data 中是否有 Flags AD Type
如果没有 Flags AD Type:
忽略
如果有 Flags AD Type:
检查 LE Limited Discoverable Mode flag
如果 LE Limited Discoverable Mode flag == 1:
加入 Limited Discovery 结果列表
否则:
忽略
所以 Limited Discovery Procedure 的本质就是:
扫描 + 检查 Flags + 只保留 Limited Discoverable 设备
十、为什么 General Discoverable 设备会被忽略?
因为 General Discoverable Mode 的 Flags 是:
LE Limited Discoverable Mode flag = 0
LE General Discoverable Mode flag = 1
而 Limited Discovery Procedure 只认:
LE Limited Discoverable Mode flag = 1
所以 General Discoverable 设备即使被 Central 收到了广播,也会被忽略。
这正是图 9.1 想表达的内容。
十一、发现到设备后,可以使用哪些数据?
原文说,发现设备的 advertising data 可能包含其他 AD Types,例如:
Service or Service Class UUIDs
TX Power Level
Local Name
Peripheral Connection Interval Range
Host 可以在后续连接建立过程中使用这些数据。
这些数据的作用大致是:
1. Service UUID
用于判断设备是不是目标设备。
例如 App 只连接包含指定 Service UUID 的模块。
是否包含 FFF0?
是否包含 180D?
是否包含 180F?
2. TX Power Level
用于提供发射功率参考。
可以和 RSSI 一起辅助判断信号强弱,但不能精确代表距离。
3. Local Name
用于显示设备名,方便用户识别。
例如:
FSC-BT976
BLE_UART
MySensor
4. Peripheral Connection Interval Range
用于告诉 Central,Peripheral 希望的连接间隔范围。
Central 可以在连接建立或连接参数更新时参考它。
十二、Host 要忽略一个 BR/EDR 相关 bit
原文最后说:
The Host shall ignore the 'Simultaneous LE and BR/EDR to Same Device Capable (Controller)' bit in the Flags AD type.
意思是:
Host 应该忽略 Flags AD Type 中的 "Simultaneous LE and BR/EDR to Same Device Capable (Controller)" 这个 bit。
也就是说,在 Limited Discovery Procedure 里,判断设备是否被发现,核心看的是:
LE Limited Discoverable Mode flag
而不是这个 BR/EDR 相关能力位。
这个 bit 主要描述控制器是否支持同时对同一设备进行 LE 和 BR/EDR 通信能力。
对于 Limited Discovery Procedure 来说,它不是判断目标设备是否属于 limited discoverable 的依据。
十三、这部分和 App 开发怎么对应?
假设你做一个"添加设备"页面。
你的产品设计是:
用户长按设备按键
设备进入配网/添加模式
设备 60 秒内广播 Limited Discoverable flag
App 点击"搜索新设备"
只显示正在添加模式的设备
那么 App 侧逻辑就接近 Limited Discovery Procedure:
1. 开始扫描
2. 使用不过滤扫描策略
3. 最好使用主动扫描
4. 扫描足够长时间
5. 收到广播后解析 Flags AD Type
6. 只保留 LE Limited Discoverable Mode flag = 1 的设备
7. 忽略 General Discoverable 设备
8. 使用设备名、Service UUID、TX Power 等信息辅助展示和连接
这样做的好处是:
用户不会看到一堆无关 BLE 设备
只看到正在等待添加的设备
添加流程更清晰
误连接概率更低
十四、这部分和 HCI Command 的关系
这节是 GAP 层语义,实际落到 HCI 扫描命令时,主要涉及:
Legacy Scanning
LE Set Scan Parameters
LE Set Scan Enable
重点参数包括:
LE_Scan_Type:Passive / Active
LE_Scan_Interval
LE_Scan_Window
Own_Address_Type
Scanning_Filter_Policy
Filter_Duplicates
对于 Limited Discovery Procedure:
Scanning_Filter_Policy 应该是 unfiltered
LE_Scan_Type 建议是 Active Scanning
Scan Interval / Scan Window 按规范建议设置
Extended Scanning
LE Set Extended Scan Parameters
LE Set Extended Scan Enable
重点参数包括:
Scanning_PHYs
Scan_Type
Scan_Interval
Scan_Window
Filter_Policy
如果设备支持 LE Coded PHY,就还要考虑在 LE Coded PHY 上扫描。
十五、这部分最容易误解的地方
1. Limited Discovery Procedure 不是"扫描时间有限"
看到 Limited 这个词,容易误以为:
Limited Discovery Procedure = 扫描一小会儿
这不准确。
它真正的含义是:
只发现 Limited Discoverable Mode 的设备
当然,它确实有最小扫描时间要求,但 Limited 的核心不是扫描时间,而是发现目标的类型。
2. 扫到了广播,不代表这个设备会进入发现结果
Central 可能收到很多广播包。
但在 Limited Discovery Procedure 中,只有满足:
Flags AD Type 存在
LE Limited Discoverable Mode flag = 1
的设备,才算被发现。
其他都要忽略。
3. General Discoverable 设备不会被 Limited Discovery Procedure 发现
这是这一节最重要的区别之一。
General Discoverable Mode:
LE General Discoverable Mode flag = 1
LE Limited Discoverable Mode flag = 0
因为 Limited Discovery Procedure 只认 Limited flag,所以 General 设备会被过滤掉。
4. 主动扫描不是一定能拿到 Scan Response
规范建议使用 active scanning,但实际能不能拿到 Scan Response,还要看:
对方广播是否 scannable
对方 filter policy 是否允许你的 scan request
扫描请求和响应是否成功
系统蓝牙栈是否真的执行主动扫描
所以在 App 开发中,不能假设每个设备都有 Scan Response Data。
十六、和前面几节连起来理解
目前 Discovery 相关逻辑可以整理成这样:
Peripheral 侧:
Non-discoverable Mode
不可被发现
可以发广播
不设置 Limited / General Discoverable flag
Limited Discoverable Mode
临时可发现
Limited flag = 1
General flag = 0
可被 Limited Discovery 和 General Discovery 发现
General Discoverable Mode
普通可发现
Limited flag = 0
General flag = 1
只能被 General Discovery 发现
Central 侧:
Limited Discovery Procedure
扫描广播
只保留 Limited flag = 1 的设备
General Discovery Procedure
扫描广播
可发现 Limited 或 General discoverable 设备
这一节 9.2.5 就是在讲 Central 侧的第一种:
Limited Discovery Procedure
十七、总结
这部分可以总结为:
Limited Discovery Procedure 是 Central 用来发现 Limited Discoverable Mode 设备的过程。
它只应该在明确目标设备使用 Limited Discoverable Mode 时使用。
如果要发现所有可发现设备,应使用 General Discovery Procedure。
执行该过程时,建议在设备支持的所有 PHY 上扫描。
Host 必须使用 unfiltered scanning policy。
Host 应设置合适的 scan interval 和 scan window。
Host 应配置 Controller 使用 active scanning,以便获取 scan response data。
Host 开始扫描后,应至少持续规定的最小扫描时间。
Host 必须检查 Advertising Data 中的 Flags AD Type。
只有 Flags 中 LE Limited Discoverable Mode flag = 1 的设备,才算被发现;否则忽略。
Host 可以使用 Service UUID、TX Power、Local Name、Peripheral Connection Interval Range 等 AD Type 辅助后续连接建立。
最重要的一句话是:
Limited Discovery Procedure = 扫描广播 + 检查 Flags + 只发现 Limited Discoverable Mode 设备。


这部分讲的是 General Discovery Procedure:普通发现过程。
它是 Central 侧 / 扫描方 用来发现周围"所有可发现 Peripheral"的过程。
一句话概括:
General Discovery Procedure = 扫描广播 + 检查 Flags + 发现 Limited Discoverable 或 General Discoverable 设备。
它和上一节 Limited Discovery Procedure 最大区别是:
Limited Discovery Procedure 只发现 Limited Discoverable 设备;General Discovery Procedure 会发现 Limited Discoverable 和 General Discoverable 两类设备。
一、这部分整体想表达什么?
这部分主要说明:
当一个设备执行 General Discovery Procedure 时,它会接收来自以下设备的信息:
Limited Discoverable Mode 的设备
General Discoverable Mode 的设备
接收到的信息包括:
Device Address
Advertising Data
Scan Response Data
也就是说,General Discovery Procedure 是一个更通用的发现流程。
如果你的目的只是:
扫描周围所有可发现 BLE 设备
展示设备列表
让用户选择目标设备
那就应该使用 General Discovery Procedure。
二、General Discovery Procedure 的定位
General Discovery Procedure 可以理解为:
我想发现附近所有"声明自己可被发现"的设备。
它不是只找"临时添加模式"的设备,而是把下面两类都找出来:
Limited Discoverable Mode
General Discoverable Mode
所以它适合普通扫描场景。
比如:
BLE 调试工具扫描附近设备
nRF Connect / LightBlue 展示周围设备列表
普通 App 扫描附近可连接设备
手机 App 搜索周围 BLE 模块
网关扫描附近传感器设备
三、它和 Limited Discovery Procedure 的区别
这部分最重要的对比是:
| 发现过程 | 会发现 Limited Discoverable 设备 | 会发现 General Discoverable 设备 |
|---|---|---|
| Limited Discovery Procedure | 会 | 不会 |
| General Discovery Procedure | 会 | 会 |
所以可以这样理解:
Limited Discovery Procedure:
只找 Limited Discoverable Mode 的设备
General Discovery Procedure:
找所有可发现设备,包括 Limited 和 General
如果你不确定目标设备到底是 Limited Discoverable 还是 General Discoverable,通常应该使用:
General Discovery Procedure
而不是 Limited Discovery Procedure。
四、为什么 General Discovery 也要区分 Limited 设备?
原文说,如果发现设备后要展示给用户,应该把 Limited Discoverable Mode 的设备和 General Discoverable Mode 的设备区分开。
例如:
把 Limited Discoverable 设备排到列表顶部
或者用某种方式高亮显示
为什么?
因为 Limited Discoverable Mode 通常是用户明确操作后进入的。
比如:
用户长按设备按键
设备进入添加模式
设备进入配网模式
设备短时间内开放发现
这说明用户当前很可能就是想发现并操作这个设备。
所以在 App 设备列表中,如果一个设备是 Limited Discoverable Mode,可以优先展示。
例如:
正在添加的设备
正在配网的设备
附近新设备
用户刚刚操作过的设备
这样可以减少用户在一堆 BLE 设备中找错目标的概率。
五、图 9.2 想表达什么?
图 9.2 是一个时序图,表达的是:
Central 执行 General Discovery Procedure 时,会同时发现 Limited Discoverable 和 General Discoverable 两类 Peripheral。
图中有三个角色:
Central
Peripheral 1
Peripheral 2
其中:
Peripheral 1 进入 Limited Discoverable Mode
Peripheral 2 进入 General Discoverable Mode
Central 开始扫描
Central 收到 limited advertising event
Central 收到 general advertising event
Central 停止扫描
最终列表包含 limited 和 general discoverable mode devices
所以这张图和上一节图 9.1 正好形成对比。
上一节 Limited Discovery Procedure 的结果列表是:
list of limited discoverable mode devices only
这一节 General Discovery Procedure 的结果列表是:
list of all limited and general discoverable mode devices
也就是:
Limited Discovery:只收 Limited
General Discovery:Limited + General 都收
六、关键信息 1:建议扫描设备支持的所有 PHY
原文说:
It is recommended that the device scan on all the PHYs it supports.
意思是:
建议设备在自己支持的所有 PHY 上进行扫描。
这和上一节 Limited Discovery Procedure 的要求一样。
如果 Central 支持多个 PHY,就尽量都扫,避免漏掉某些设备。
常见相关 PHY 有:
LE 1M PHY
LE Coded PHY
例如:
如果某个 Peripheral 使用 LE Coded PHY 进行长距离广播,而 Central 只扫描 LE 1M PHY,就可能发现不了它。
所以 General Discovery Procedure 作为普通发现流程,应该尽量覆盖设备支持的扫描 PHY。
七、关键信息 2:Scanning Filter Policy 必须是 unfiltered
原文说:
The Host shall set the scanning filter policy to an unfiltered scanning policy.
意思是:
Host 必须把扫描过滤策略设置为不过滤扫描策略。
也就是说:
不要只接收 Filter Accept List 中设备的广播
而应该接收所有设备的广播
为什么?
因为 General Discovery Procedure 的目标是发现所有可发现设备。
如果扫描时只接收 Filter Accept List 中的设备,那就不是"普通发现所有可发现设备"了。
从 App 开发角度看:
如果你做一个普通"搜索设备"页面,用户希望看到附近所有可添加或可连接的 BLE 设备,那么扫描过滤策略就不应该限制在白名单里。
八、关键信息 3:Scan Interval 和 Scan Window 应按规范设置
原文说:
The Host should set the scan interval and scan window as defined in Section 9.3.11.
意思是:
Host 应该按照 9.3.11 中定义的要求设置扫描间隔和扫描窗口。
这两个参数非常重要。
1. Scan Interval
表示扫描周期。
可以理解为:
每隔多久启动一次扫描窗口
2. Scan Window
表示每个扫描周期中真正扫描的时间。
可以理解为:
每次真正打开接收机扫描多久
例如:
Scan Interval = 100 ms
Scan Window = 50 ms
表示每 100 ms 一个扫描周期,其中 50 ms 处于扫描状态。
如果:
Scan Interval = Scan Window
通常表示接近连续扫描,发现速度快,但功耗更高。
所以扫描参数的选择,本质上也是:
发现速度
功耗
系统负载
之间的权衡。
九、关键信息 4:建议使用 Active Scanning
原文说:
The Host should configure the Controller to use active scanning.
意思是:
Host 应该配置 Controller 使用主动扫描。
主动扫描的好处是:
不仅可以接收 Advertising Data
还可以获取 Scan Response Data
流程大致是:
Peripheral 发送 Advertising Packet
Central 接收 Advertising Packet
Central 发送 Scan Request
Peripheral 返回 Scan Response
Central 获得 Scan Response Data
为什么 General Discovery Procedure 推荐 active scanning?
因为很多设备会把一些重要但不一定放得下的数据放在 Scan Response Data 中,比如:
完整设备名
更多 Service UUID
厂商自定义数据
额外的设备信息
如果只使用 Passive Scanning,Central 可能只能看到 Advertising Data,看不到 Scan Response Data。
不过要注意:
主动扫描不是一定能拿到 Scan Response Data。
还要满足:
对方广播事件是 scannable
对方 filter policy 允许你的 scan request
空口交互成功
系统蓝牙栈实际执行主动扫描
十、关键信息 5:扫描至少要持续规定的最小时间
原文说:
The Host shall begin scanning for advertising packets and should continue for a minimum of T_GAP(gen_disc_scan_min)
when scanning on the LE 1M PHY and T_GAP(gen_disc_scan_min_coded)
when scanning on the LE Coded PHY.
意思是:
Host 开始扫描后,应该至少持续一个最小扫描时间。
不同 PHY 下有不同的最小扫描时间:
LE 1M PHY:
T_GAP(gen_disc_scan_min)
LE Coded PHY:
T_GAP(gen_disc_scan_min_coded)
不过过程可以被 Host 提前终止。
为什么要有最小扫描时间?
因为 BLE 广播和扫描不是严格同步的。
Peripheral 按自己的 advertising interval 发广播;
Central 按自己的 scan interval / scan window 扫描;
如果扫描时间太短,可能刚好错过目标设备的广播。
所以为了提高发现概率,规范建议至少扫描一段时间。
十一、关键信息 6:必须检查 Flags AD Type
这是这一节最关键的判断逻辑。
原文说:
The Host shall check for the Flags AD type in the advertising data.
意思是:
Host 必须检查 Advertising Data 中的 Flags AD Type。
然后:
如果 Flags AD Type 存在,并且满足下面任一条件:
LE General Discoverable Mode flag = 1
或者:
LE Limited Discoverable Mode flag = 1
那么 Host 应该认为这个设备是一个 discovered device。
否则:
忽略该 advertising data
也就是说,General Discovery Procedure 的判断逻辑是:
收到广播包
检查 Advertising Data 中是否有 Flags AD Type
如果没有 Flags AD Type:
忽略
如果有 Flags AD Type:
如果 LE General Discoverable Mode flag == 1:
认为发现到设备
或者 LE Limited Discoverable Mode flag == 1:
认为发现到设备
否则:
忽略
所以 General Discovery Procedure 的核心是:
只要设备声明自己是 General Discoverable 或 Limited Discoverable,就可以被发现。
十二、General Discovery Procedure 会忽略哪些设备?
General Discovery Procedure 会忽略:
没有 Flags AD Type 的广播
Flags 中没有设置 General Discoverable flag 的设备
Flags 中没有设置 Limited Discoverable flag 的设备
Non-discoverable Mode 的设备
纯 Broadcast mode 但没有 discoverable flag 的设备
这点非常重要。
如果一个设备在发广播,但没有设置:
LE General Discoverable Mode flag
LE Limited Discoverable Mode flag
那么从 GAP Discovery 的角度,它不应该被 General Discovery Procedure 当作 discovered device。
这也再次说明:
扫描到广播包 ≠ 发现到 GAP discoverable device
BLE 调试工具可能会把所有扫描到的广播都显示出来,但 GAP 规范中的 discovery procedure 是有筛选语义的。
十三、发现到设备后,可以使用哪些数据?
原文说,发现设备的 advertising data 可能包含其他 AD Types,例如:
Service or Service Class UUIDs AD type
TX Power Level AD type
Local Name AD type
Peripheral Connection Interval Range AD type
Host 可以在执行后续 connection establishment procedure 时使用这些数据。
这些字段分别有什么用?
1. Service UUID
用于判断设备提供什么服务。
例如:
180F:Battery Service
180D:Heart Rate
FFF0:厂商自定义服务
App 可以根据 Service UUID 过滤目标设备。
例如蓝牙串口 App 可以只展示包含指定 Service UUID 的设备。
2. TX Power Level
表示广播发送功率参考值。
可以配合 RSSI 粗略判断信号情况。
但不能简单理解为:
RSSI 越强,距离一定越近
更合理的理解是:
TX Power Level 是发射侧参考
RSSI 是接收侧测量
距离判断还受环境、遮挡、天线方向、手机型号影响
3. Local Name
表示设备名称。
例如:
FSC-BT976
BLE_UART
MySensor
App 设备列表通常会展示 Local Name,方便用户识别设备。
完整名称如果放不下,可能会放在 Scan Response Data 中。
4. Peripheral Connection Interval Range
表示 Peripheral 希望使用的连接间隔范围。
Central 可以在连接建立或连接参数更新时参考它。
不过最终连接间隔是否采用,还取决于 Central 和系统蓝牙栈策略。
十四、Host 要忽略一个 BR/EDR 相关 bit
原文最后说:
The Host shall ignore the 'Simultaneous LE and BR/EDR to Same Device Capable (Controller)' bit in the Flags AD type.
意思是:
Host 应该忽略 Flags AD Type 中的 "Simultaneous LE and BR/EDR to Same Device Capable (Controller)" 这个 bit。
也就是说,在 General Discovery Procedure 里,判断设备是否被发现,核心看的是:
LE General Discoverable Mode flag
LE Limited Discoverable Mode flag
而不是这个 BR/EDR 相关能力位。
这个 bit 主要用于描述控制器是否支持同时对同一设备进行 LE 和 BR/EDR 通信能力。
它不应该影响 General Discovery Procedure 对设备是否 discoverable 的判断。
十五、和 App 开发怎么对应?
假设你做一个普通 BLE 扫描页面,类似:
附近设备
搜索蓝牙设备
选择要连接的设备
那么这个页面的逻辑更接近 General Discovery Procedure。
App 侧大致逻辑是:
1. 开始扫描
2. 使用不过滤扫描策略
3. 最好使用主动扫描
4. 扫描持续足够时间
5. 收到广播后解析 Flags AD Type
6. 如果 LE Limited Discoverable Mode = 1,加入结果列表,并优先展示
7. 如果 LE General Discoverable Mode = 1,也加入结果列表
8. 如果两者都不是,按 GAP Discovery 语义应忽略
9. 使用 Local Name、Service UUID、TX Power、RSSI 等信息辅助展示和后续连接
如果你做的是调试工具,比如类似 nRF Connect,那么你可能会显示所有扫描到的广播设备。
但这已经不完全等同于严格的 GAP General Discovery Procedure,而是更偏向"通用广播扫描展示"。
十六、和 HCI Command 的关系
这节是 GAP 语义,实际配置会落到 HCI 扫描命令。
Legacy Scanning 常见相关命令:
LE Set Scan Parameters
LE Set Scan Enable
关键参数包括:
LE_Scan_Type:Passive / Active
LE_Scan_Interval
LE_Scan_Window
Own_Address_Type
Scanning_Filter_Policy
Filter_Duplicates
对于 General Discovery Procedure:
Scanning_Filter_Policy 应该是 unfiltered
LE_Scan_Type 建议是 Active Scanning
Scan Interval / Scan Window 按规范建议设置
Extended Scanning 常见相关命令:
LE Set Extended Scan Parameters
LE Set Extended Scan Enable
关键参数包括:
Scanning_PHYs
Scan_Type
Scan_Interval
Scan_Window
Filter_Policy
如果支持 LE Coded PHY,就要考虑同时在 LE Coded PHY 上扫描。
十七、这部分最容易误解的地方
1. General Discovery Procedure 不是"所有广播都显示"
它发现的是:
所有可发现设备
不是:
所有发广播的设备
如果设备只是发广播,但没有设置 General / Limited Discoverable flag,它不应该被 General Discovery Procedure 当作 discovered device。
2. General Discovery 会发现 Limited 设备
这点很重要。
Limited Discoverable Mode 不是只能被 Limited Discovery Procedure 发现。
它也可以被 General Discovery Procedure 发现。
所以:
Limited Discoverable 设备:
可以被 Limited Discovery Procedure 发现
也可以被 General Discovery Procedure 发现
3. Limited Discovery 不会发现 General 设备
反过来不成立。
General Discoverable 设备:
可以被 General Discovery Procedure 发现
不会被 Limited Discovery Procedure 发现
所以两个过程不是完全对称的。
4. Active scanning 不一定拿得到 Scan Response
即使 Host 配置主动扫描,也要看广播方是否使用 scannable advertising event,以及过滤策略是否允许扫描请求。
十八、和前面几节连起来理解
可以把 Discovery 相关内容整理成一套完整逻辑:
Peripheral 侧:
Non-discoverable Mode
不可被发现
可以发广播
不设置 Limited / General Discoverable flag
Limited Discoverable Mode
临时可发现
Limited flag = 1
General flag = 0
可被 Limited Discovery 和 General Discovery 发现
General Discoverable Mode
普通可发现
Limited flag = 0
General flag = 1
可被 General Discovery 发现
不会被 Limited Discovery 发现
Central 侧:
Limited Discovery Procedure
只发现 Limited flag = 1 的设备
General Discovery Procedure
发现 Limited flag = 1 或 General flag = 1 的设备
这一节 9.2.6 讲的就是 Central 侧最常用的普通发现过程。
十九、实际例子
假设周围有三个 BLE 设备:
设备 A:正在配网
LE Limited Discoverable Mode flag = 1
LE General Discoverable Mode flag = 0
设备 B:普通可发现模块
LE Limited Discoverable Mode flag = 0
LE General Discoverable Mode flag = 1
设备 C:只广播数据,不声明可发现
LE Limited Discoverable Mode flag = 0
LE General Discoverable Mode flag = 0
如果手机执行 Limited Discovery Procedure:
发现 A
忽略 B
忽略 C
如果手机执行 General Discovery Procedure:
发现 A
发现 B
忽略 C
如果手机做的是 BLE 调试工具式的"原始扫描展示":
可能 A、B、C 都显示
但这已经不完全是 GAP Discovery Procedure 的严格语义。
二十、总结
这部分可以总结为:
General Discovery Procedure 是 Central 用于发现所有可发现 Peripheral 的普通发现过程。
它会发现 Limited Discoverable Mode 和 General Discoverable Mode 的设备。
它适合普通设备扫描、设备列表展示、一般目的发现。
如果发现结果要展示给用户,应该区分 Limited 和 General 设备;Limited 设备通常表示用户刚刚操作过,应该优先展示或高亮。
执行该过程时,建议在设备支持的所有 PHY 上扫描。
Host 必须使用 unfiltered scanning policy。
Host 应设置合适的 scan interval 和 scan window。
Host 应配置 Controller 使用 active scanning,以便获取 scan response data。
Host 应至少扫描规定的最小时间。
Host 必须检查 Flags AD Type。
只要 LE General Discoverable Mode flag = 1 或 LE Limited Discoverable Mode flag = 1,就可以认为设备被发现;否则忽略。
Host 可以使用 Service UUID、TX Power、Local Name、Peripheral Connection Interval Range 等数据辅助后续连接建立。
最重要的一句话是:
General Discovery Procedure = 发现所有 GAP 语义上的可发现设备,也就是 Limited Discoverable + General Discoverable,而不是发现所有发广播的设备。