前言
蓝牙设备发现机制分为普通搜索和受限搜索两种模式。普通搜索使用GIAC码,可发现所有可发现设备,耗时约10.24秒,适用于初始配对等场景;受限搜索使用LIAC码,仅发现特定设备,耗时约2.56秒,适用于快速重连等场景。查询过程涉及IDPacket(查询请求)、FHSPacket(基础响应)和可选的EIRPacket(扩展信息响应)。IDPacket包含查询访问码,FHSPacket提供设备地址等关键信息,EIRPacket则提供更详细的设备信息。查询参数包括访问码类型、持续时间和响应数量等设置。
背景
表 4.1 规定了响应设备(设备 B)的行为要求。

表 6.1 规定了搜索和发现步骤的设备(设备 A)的要求。

1. Inquiry mode
在传统蓝牙(BR/EDR)中,受限搜索模式(Limited Inquiry)和普通搜索模式(General Inquiry)是两种设备发现机制,主要区别如下:
1.1 普通搜索模式(General Inquiry)
-
目的:发现周围所有可发现的蓝牙设备,无论它们处于普通可发现模式还是受限可发现模式。
-
查询访问码 :使用 GIAC(General Inquiry Access Code,通用查询访问码)。
-
响应设备 :所有处于可发现模式(如"可被发现"或"通用可发现")的设备都会响应。
-
应用场景:
-
初始配对、搜索未知设备(如搜索新耳机、手机等)。
-
用户主动搜索周围所有蓝牙设备。
-
-
搜索时间:通常较长(默认约10.24秒),以确保发现更多设备。
-
**条件:**为了使设备 A 能够接收查询响应,范围内的远程设备必须设置为可发现状态(受限发现或普通发现模式)
1.2 受限搜索模式(Limited Inquiry)
-
目的 :仅发现特定类型 或受限可发现的设备。
-
查询访问码 :使用 LIAC(Limited Inquiry Access Code,受限查询访问码)。
-
响应设备 :仅处于受限可发现模式的设备会响应(例如,设备仅临时开放发现)。
-
应用场景:
-
快速连接已知设备或特定服务(如之前配对过的设备)。
-
隐私保护场景,避免被广泛搜索。
-
省电或减少搜索流量。
-
-
搜索时间:通常较短(默认约2.56秒),以提高效率。
-
**条件:**为了使设备 A 能够接收搜索响应,必须将范围内的远程设备设置为有限可发现模式。
1.3 两者核心区别总结
| 特性 | 普通搜索模式 | 受限搜索模式 |
|---|---|---|
| 查询访问码 | GIAC | LIAC |
| 目标设备 | 所有可发现设备 | 仅限受限可发现设备 |
| 搜索范围 | 广泛 | 窄 |
| 典型耗时 | 较长(约10.24秒) | 较短(约2.56秒) |
| 使用场景 | 初始配对、广泛搜索 | 快速重连、隐私保护、省电 |
1.4 技术细节
-
设备可同时支持两种模式,但需分别响应对应的查询访问码。
-
受限搜索模式在蓝牙规范中设计为临时状态,设备通常不会长期处于此模式。
-
实际应用中,普通搜索更常见(如手机搜索蓝牙设备),而受限搜索多用于特定协议或优化场景。
1.5 示例
-
普通搜索:打开手机蓝牙,点击"搜索设备",会列出周围所有可发现的蓝牙耳机、音箱等。
-
受限搜索:蓝牙耳机在配对模式下仅短时间(如30秒)进入受限可发现状态,此时手机可通过受限搜索快速找到它。
2. Inquiry报文格式
在蓝牙核心规范中,查询(Inquiry) 过程是实现设备发现的关键。这个过程主要涉及三种核心报文:ID Packet 、FHS Packet 和可选的 EIR Packet。下表汇总了它们的主要区别:
| 报文类型 | 发送方 | 主要功能 | 核心内容 | 长度/特点 |
|---|---|---|---|---|
| ID Packet (查询请求) | 主查询设备 | 广播查询请求,宣布"我正在找设备" | 查询访问码 (GIAC/LIAC) | 68/72位,无包头和有效载荷 |
| FHS Packet (查询响应) | 从响应设备 | 回应查询,告知"我在这里,这是我的信息" | 蓝牙地址、时钟、设备类、页面扫描模式等 | 较完整的蓝牙数据包 |
| EIR Packet (扩展查询响应) | 从响应设备 | 提供更丰富的设备信息 | 本地名称、支持的UUID、发射功率等 | 数据结构为 LTV格式,可选 |
**2.**1. ID Packet格式与生成
ID Packet本质上是反复发送的查询访问码,其生成与结构如下:
组成核心 : 查询访问码(LAP)
-
GIAC :
0x9E8B33 -
LIAC :
0x9E8B00
生成过程 :以LAP(如0x9E8B33)为种子,通过一组预定义的72位同步字序列生成。该序列由两部分组成:
-
前置码 :
1010或0101交替的4位模式,用于直流平衡和同步。 -
同步字 :根据LAP计算出的64位独特序列,具备强自相关特性,便于接收端在嘈杂环境中可靠识别。
关键特性 :ID Packet没有传统数据包的包头、有效载荷或CRC。它是一个"简化到极致"的信号,唯一目的就是让扫描设备知道"正在进行一次查询"。
**2.**2. FHS Packet格式详解
FHS Packet是一个完整的、包含了连接所需全部基础信息的蓝牙数据包。
FHS Packet整体结构(240位 = 30字节)
| 字段 | 长度(位) | 说明 |
|---|---|---|
| LAP (Lower Address Part) | 24 | 从设备蓝牙地址的低24位部分。 |
| SR (Scan Repetition) | 2 | 页面扫描重复模式。00 = R0, 01 = R1, 10 = R2。 |
| SP (Scan Period) | 1 | 保留位。 |
| UAP (Upper Address Part) | 8 | 从设备蓝牙地址的中间8位部分。 |
| NAP (Non-significant Address Part) | 16 | 从设备蓝牙地址的高16位部分。 |
| Device Class | 24 | 设备类,编码了主要设备类型、主要服务和次要服务。 |
| AM_ADDR (暂时未用) | 3 | 在查询响应中设为000。 |
| Clock Offset | 13 | 本地时钟偏移,主设备用于预测从设备时钟。 |
| Page Scan Mode | 1 | 0 = 标准扫描模式, 1 = 强制扫描模式。 |
| Reserved | 2 | 保留位。 |
| 3-bit Parity | 3 | 对前面34位(LAP+UAP+SR等)的奇偶校验。 |
关键字段深度解析:
-
蓝牙地址(BD_ADDR) :由NAP 、UAP 、LAP拼接成48位唯一地址。查询响应中,LAP部分可能与原始ID Packet的查询LAP不同。
-
设备类(Class of Device):
-
格式:一个24位的字段,划分为三个部分:
-
Bit 23-13 :次要设备类,描述设备在主要类别中的子类型。
-
Bit 12-8 :主要服务类,描述设备提供的核心服务(如渲染、音频、电话等)。
-
Bit 7-2 :主要设备类,描述设备的大类(如电话、音频、外设、成像等)。
-
Bit 1-0 :格式类型 ,通常为
00。
-
-
-
时钟偏移(Clock Offset):
-
这是查询设备本地时钟与响应设备本地时钟之间采样时刻的差值 ,计算公式为:
clock_offset = (CLKN_{slave} - CLKN_{master}) mod 32768 -
主设备在后续的寻呼(Page)过程中使用此偏移量,可以大幅缩短连接建立时间。
-
-
扫描模式(SR & Page Scan Mode):
- 这些字段告诉查询设备,应该以何种方式、多快的速度来发起后续的寻呼连接。
**2.**3 EIR Packet格式详解
EIR Packet紧随FHS之后发送,采用TLV(类型-长度-值) 结构(也称为LTV,即长度-类型-值),提供丰富的扩展信息。
EIR数据段整体结构
整个EIR Packet的有效载荷由一个或多个EIR数据结构顺序连接而成。
单个EIR数据结构格式
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| Length | 1 | 本数据结构中 "Type"和"Data"部分的总字节数。 |
| Type (EIR Data Type) | 1 | 定义后续"Data"字段的含义。 |
| Data | (Length - 1) | 与Type对应的具体数据内容。 |
常用EIR数据类型(Type)示例
| 类型值 (Hex) | 名称 | 数据内容说明 |
|---|---|---|
0x01 |
Flags | 比特掩码,如:Bit 0 = LE受限发现模式, Bit 1 = LE普通发现模式, Bit 2 = BR/EDR不支持, Bit 3 = 同时支持BR/EDR和LE。 |
0x08 |
Shortened Local Name | 设备名称的简称(如果完整名称太长)。 |
0x09 |
Complete Local Name | 设备的完整名称。 |
0x0A |
Tx Power Level | 1字节有符号整数,表示发射功率(单位:dBm)。 |
0x0D |
Class of Device | 3字节,与FHS中的设备类相同,提供冗余信息。 |
0x16 |
16-bit Service UUIDs | 一系列16位的服务UUID(如0x110A = 音频输出服务)。 |
0xFF |
Manufacturer Specific Data | 厂商自定义数据。前2字节为公司识别码,其余为自定义数据。 |
2.4解析示例
假设收到一个EIR数据片段:02 01 06 05 09 48 65 6C 6C 6F
-
02 01 06:第一个数据结构。长度=2(01和06共2字节),类型=0x01(标志位),数据=0x06(二进制00000110,表示支持LE普通发现模式且同时支持BR/EDR)。 -
05 09 48 65 6C 6C 6F:第二个数据结构。长度=5,类型=0x09(完整名称),数据=48 65 6C 6C 6F(ASCII码对应"Hello")。
2.5总结
查询/响应流程中的报文交互:
-
主查询设备在多个频率上重复发送ID Packet(只有访问码)。
-
从设备在扫描时捕获ID Packet,计算时机,在特定时隙用FHS Packet 回复,其中包含连接必需的地址、时钟和类别信息。
-
(可选)从设备紧接着发送EIR Packet ,提供名称、服务、功率等丰富元数据。

