
前言
有些蓝牙温湿度计,打开配套应用就能看到温度,却不需要先到手机设置里配对。换到系统的蓝牙设备列表,又可能找不到它。
温度是怎样传到手机里的?既然手机已经收到数据,为什么列表里还没有这台设备?
这类产品可以把温度放进低功耗蓝牙的广播里。就像商场里的广播,消息发出来,附近正在听的人就有机会听到,不必先给每个人打通一通电话。手机接收蓝牙广播的过程叫扫描;收到以后是否显示设备、怎样解释数据,则还要看系统和应用。
广播与扫描让蓝牙设备在建立连接之前就能交换一部分信息。有时,这些信息已经足够完成任务;有时,它们只是后续连接的起点。
一、广播与扫描分别是什么
广播(Advertising)是 Bluetooth LE 用来发布信息、让其他设备发现自己或发起连接的一套通信过程。 设备发送广播包,附近的接收设备不需要先与它建立连接,就有机会收到其中的信息。
这里讨论的是低功耗蓝牙,也就是 Bluetooth LE。广播并不只是在反复喊"我在这里",它还可以携带名称、服务线索,或者按约定编码的传感器数据。不过,不是每种广播都会携带应用数据,能做什么取决于广播的类型。
扫描(Scanning)是设备监听蓝牙广播,并按相应规则接收、处理这些信息的过程。 发广播的一方通常叫广播者,正在扫描的一方叫扫描者。这些称呼描述当前在做的事情,不是给手机、手环永久划定的身份。同一台设备在能力和调度允许时,可以承担不同的通信工作。
例如,一个温湿度计定时发送包含测量值的广播,手机开启扫描,收到后按产品的数据格式还原出"24.6 ℃"。此时,手机已经取得温度,但双方仍可能没有建立连接,更没有进行配对。
如果只需要让附近的手机知道最新温度,广播就可能够用。如果还要修改温湿度计的设置、读取历史记录,产品则可能另外提供连接后的数据服务。
广播也有一个直接的限制:普通广播不会逐一确认每个接收者是否收到。 商场里播了一次通知,不代表所有顾客都听清了;蓝牙广播发出一次,也可能遇到干扰,或者正好赶上手机没有监听。重复广播是在增加收到的机会,不是在保证每次送达。Bluetooth LE 的广播与扫描机制
二、被动扫描与主动扫描
2.1 被动扫描:接收广播,不请求补充信息
被动扫描(Passive Scanning)只接收广播,不在这个扫描过程中发送请求包。
如果设备把所需数据直接放在广播数据里,手机收到后就可以使用。比如,仓库里的一个标签周期性广播自身编号,扫描设备只需要记录"附近出现了这个编号",就不必请求更多内容。
被动扫描不是"由人手动扫描",主动扫描也不是"自动扫描"。这里的主动、被动,区分的是扫描者是否发送扫描请求。
2.2 主动扫描:收到合适的广播后,请求扫描响应
主动扫描(Active Scanning)先接收广播。如果广播允许扫描请求,扫描者还可以按协议请求补充信息,广播者再返回扫描响应(Scan Response) 。
以传统的可扫描广播为例,空中的交互分为三步:
- 广播者发送广播包,扫描者收到。
- 扫描者发送扫描请求,包名为 SCAN_REQ。
- 广播者在满足处理条件时返回扫描响应,包名为 SCAN_RSP。

假设设备把产品标识放在广播里,把较长的名称放在扫描响应里。被动扫描可能只拿到标识;主动扫描在成功取得响应后,才有机会拿到名称。这就能解释一种现象:同一个设备,有的工具只显示一串标识,有的工具还能显示名字。
但主动扫描不是任意提问的通道。扫描请求不是"告诉我电量"或"把历史温度发给我"这样的业务命令,扫描响应返回的是广播者事先准备的补充数据。读取其他内容,需要设备另行提供相应机制。
取得扫描响应,仍然不等于建立连接,也不要求先配对。 扫描请求与连接请求是不同的协议消息。
主动扫描也不保证每次都能得到响应。广播必须允许这种交互,双方的过滤条件需要满足,收发还可能受到碰撞和调度影响。多个扫描者同时请求时,协议还会通过退避机制减少反复碰撞,因此不能把主动扫描理解成"每个广播包后面必有一个响应"。
三、设备在什么地方、什么时间相遇
3.1 主广播信道是共同的寻找入口
LE 把无线频率划分为不同信道。其中,编号为 37、38、39 的三个信道叫主广播信道 ,用于初始广播和传统广播活动。它们的中心频率分别是 2402 MHz、2426 MHz、2480 MHz,并不是挤在一起的三个相邻频点。
传统广播使用这些主广播信道,并采用 LE 1M 物理层,也就是空中比特率为 1 Mb/s 的无线传输方式。一次广播事件,可以在配置使用的一个或多个主广播信道上依次发送相应的广播包;常见配置会使用全部三个,但不能认为每次都必定发满三个。
广播事件可以理解为"一轮广播发送活动"。它可能包含不止一个包,因此"广播事件的间隔"和"两个包之间的间隔"不是一回事。
扫描者也要在相应信道监听。常见的单无线电实现,在某个时刻只能监听一个信道,随后再切换,不是同时把三个信道上的所有广播都接下来。只在时间上碰巧重合,还不够;还要对上信道和所用的无线传输方式。
3.2 广播间隔与扫描窗口,共同影响发现速度
广播间隔(Advertising Interval)描述广播事件的基本发送节奏。 对普通非定向广播,相邻事件的开始时间之间,还会加上 0~10 ms 的随机延迟。
为什么要有一点随机变化?如果两台设备每次都恰好同时发送,又都严格按相同间隔重复,就可能一轮接一轮地撞在一起。随机延迟让发送时刻稍微错开,减少持续碰撞的机会。它不能消除所有干扰。
扫描一侧有两个容易混淆的参数:
| 参数 | 含义 | 假设设置 |
|---|---|---|
| 扫描间隔(Scan Interval) | 相邻两个扫描窗口开始时刻之间的时间 | 100 ms |
| 扫描窗口(Scan Window) | 每个窗口里计划用于监听的持续时间 | 40 ms |
这个设置表示:从一个窗口开始算起,每隔 100 ms 开始下一个窗口,每次计划监听 40 ms。它不是"先听 40 ms,再休息 100 ms";在这个简化安排中,两次窗口之间剩下的是 60 ms。

图中只画出时间关系,假设广播包与扫描者使用相同信道、传输方式且没有干扰。现实里,即使广播落入窗口,也不保证成功收到。
扫描窗口不能大于扫描间隔。二者相等时,配置意图是连续扫描;实际无线电仍可能因为其他通信任务发生调度冲突。所以,连续扫描也不等于零丢包。
调小广播间隔,通常会增加发送次数,也增加广播设备的耗电和空中占用。增大扫描窗口,通常会增加接收机会,也增加扫描设备的耗电。需要更快发现时,可以让发送更频繁、监听更充分;需要长时间靠电池工作时,则要接受一定的发现等待。手机应用还不一定能直接控制底层的全部参数。LE 链路层的广播与扫描时序
四、能听见、能请求补充、能连接,要分别判断
4.1 "可扫描"不是"能否收到广播"
可连接(Connectable),表示这种广播允许符合条件的设备发起连接。
可扫描(Scannable),表示这种广播允许符合条件的扫描者发送扫描请求,取得扫描响应。
不可扫描的广播,仍然可以被扫描者接收;"不可扫描"限制的是扫描请求与扫描响应。 一个只向外播报编号的标签,可以不接受扫描请求,也不接受连接,附近的扫描设备照样可能收到编号。
传统广播常见的四种类型,正好能把这些区别说明白:
| 广播包类型 | 可连接 | 可扫描 | 面向谁 | 可携带应用广播数据 |
|---|---|---|---|---|
| ADV_IND | 是 | 是 | 非定向 | 是 |
| ADV_SCAN_IND | 否 | 是 | 非定向 | 是 |
| ADV_NONCONN_IND | 否 | 否 | 非定向 | 是 |
| ADV_DIRECT_IND | 是 | 否 | 指定目标 | 否 |
这张表用于识别传统广播,不是要求记住全部包名。关键是看出:收到广播后,能否再请求补充信息、能否发起连接,由广播类型决定,不能只看设备有没有出现在列表中。
表中的"是"表示协议允许相应操作,并不保证任意手机都能成功操作;过滤策略、设备当前状态等条件仍然有效。扩展广播有自己的组合限制:同一个扩展广播事件不能同时既可连接又可扫描。 传统 ADV_IND 的组合不能直接套过去。
4.2 定向与可发现,也不是同一件事
非定向广播没有指定某个目标设备;定向广播则包含目标信息,只有符合目标条件的一方才能按规则作出相应响应。比如,设备已经知道要联系谁,可以使用定向广播帮助重新建立联系。
定向不代表无线信号只朝那个目标传播,也不代表内容自动加密。附近其他接收设备仍可能听到空中的包,只是不能把自己当作被指定的目标来响应。
GAP,也就是通用访问规范,还定义了可发现模式:有限可发现通常用于按键触发等临时情形,一般可发现用于不限定这样一个短暂时段的发现;对应的发现过程会检查广播中的标志。
这带来一个容易忽略的区别:设备可以仍在发广播,却没有声明处于可发现模式。按相应 GAP 发现规则工作的设备会忽略它,专门用于接收广播数据的观察程序则仍可能收到它。因此,"空中能收到包"和"被某种设备发现过程列出来"不能画等号。GAP 的广播、发现与连接模式
五、广播数据里放的是什么
5.1 每一项数据都带着类型与长度
广告牌上可以同时写店名、营业时间和联系电话,读到一行文字时,需要知道这一行在说什么。广播数据也要区分"这段是名字""这段是服务编号""这段是厂商自己的数据"。
蓝牙用 AD Structure,也就是广播数据结构,来组织这些条目。每个条目有三部分:
| 部分 | 作用 |
|---|---|
| Length,长度 | 说明后面这一条包含多少字节,不包含长度字节自身 |
| AD Type,数据类型 | 说明这一条是什么数据 |
| AD Data,数据内容 | 按该类型解释的具体值 |
长度和类型各占一个字节。字节是这里计算数据大小的单位,不等于一个汉字或一个显示出来的字符。
例如,完整设备名称使用类型 0x09。0x 是十六进制数的前缀;下面用两位十六进制数表示一个字节,其中使用 0~9 和 A~F 表示数值。把名称 Room 编码为 UTF-8 后,四个英文字母各占一个字节,对应的完整条目是:
text
05 09 52 6F 6F 6D

第一个字节是 05,因为后面有一个类型字节和四个名称字节,共五个。整个条目则占六个字节。Length 不计算自己,但计算数据类型。 如果这一点弄反,解析下一条时就会从错误的位置开始。
多个条目依次排列,就构成广播数据。同样使用 UTF-8 的中文名称通常比相同字数的英文名称占更多字节,所以"名称才十个字"不能说明它一定放得下。
常见的数据类型各有用途:
| 数据 | 传递的信息 | 使用时要注意 |
|---|---|---|
| Flags,标志 | 部分发现状态及能力标志 | 不是"是否可连接"的通用替代判断 |
| Local Name,本地名称 | 完整名称或缩短名称 | 可以不广播;名字也不保证唯一 |
| Service UUID,服务标识列表 | 设备对外声明的服务线索 | 不等于已经拿到完整服务结构或服务里的数据 |
| Service Data,服务数据 | 某个服务 UUID 及其相关数据 | 具体内容仍按对应服务或应用约定解释 |
| Manufacturer Specific Data,厂商自定义数据 | 公司标识及其约定的数据 | 公司标识之后的字节含义由对应厂商规定 |
UUID 是用来区分服务等对象的标识。例如,扫描应用可以先按某个服务 UUID 找到候选设备;但广播没有列出某项服务,并不能一概推出设备没有这项服务,因为广播可能只提供部分线索。连接后查询服务,是另一个过程。
温度也不是放进广播后就自动有了统一含义。同样两个字节,可能表示温度,也可能表示电量、计数。收发双方必须知道字段位置、数值单位、字节顺序,以及是否允许负数,才能把原始数据还原成正确的值。广播数据类型定义
5.2 传统广播的 31 字节,算的是数据区
传统非定向广播的数据区最多 31 字节,不是整个空中数据包总共只有 31 字节。名称、服务标识、厂商数据等条目,都要在这个空间里安排;每个条目的长度和类型,也会占空间。
前面的 Room 名称条目就用了六字节,而不是只占四字节。把设备名称设得很长,可能挤掉其他内容,也可能导致配置失败或由具体接口处理,不能指望系统总能自动完整塞进去。
如果使用可扫描的传统广播,扫描响应还可以提供最多 31 字节的数据。比如把必要的识别信息放在广播里,把名称放进响应里。
但这不是一份所有接收者都能直接拿到的"62 字节大广播"。它是两份通过不同收发步骤取得的数据 :只进行被动扫描,或者没有成功收到扫描响应,就拿不到后面那一份。有些应用接口会把两份信息整理到同一个扫描结果对象中,也不意味着空中只传了一个包。
六、扩展广播与周期广播解决什么问题
6.1 扩展广播把数据移到辅助广播包
扩展广播(Extended Advertising)扩展了传统广播的数据组织与发送方式。它可以先在主广播信道发送指引,再让扫描者到指定的次广播信道、指定时间接收辅助广播包。
次广播信道使用 LE 的另外 37 个通用信道,编号为 0~36。这些信道也用于其他 LE 通信,并不是扩展广播另占了一个新频段。
这个过程有点像门口的指示牌写着"完整展品介绍在二楼展厅":入口保留必要指引,大部分内容放到后面的地方。
对应到协议,辅助指针 AuxPtr 就是包里记录后续包位置的信息。它告诉接收方去哪个信道、从当前包算起等待多久,以及采用哪种物理层。物理层(PHY)规定数据怎样转换为无线信号、又怎样从信号还原为数据;双方采用的方式要匹配,才能听懂。接收方根据这些信息安排下一次接收,而不是在所有信道上盲目寻找。

一份数据装不进一个包时,可以按规则拆成几部分,每部分叫一个分片。前面的包继续指向后面的包,就形成了链式发送;接收方要取得所需的分片,才能还原完整数据。
规范给出的主机广播数据总长度上限可达 1650 字节。这里的"主机广播数据",指主机软件交给控制器、准备通过广播发送的数据,还没有算上无线包所需的全部协议字段。这不是说一个空中包能装 1650 字节,也不是所有设备和广播类型都能用满。 具体广播类型可能有更小限制,控制器支持的容量、操作系统接口以及接收方的重组能力,也会限制实际可用长度。
扩展广播还支持广播集(Advertising Set)。一个广播集是一组放在一起管理的广播数据与发送参数 ,例如发什么内容、采用哪种广播类型、间隔多久发送。它不是把扫描到的多台设备归成一个集合。
同一设备可以有多个广播集。例如,一组较频繁地发布状态,另一组采用允许连接的广播类型。主机软件分别配置好以后,由控制器安排各组的发送时机,不必让应用每发一轮就手动切换配置。这里的多组工作也不代表一颗无线电在同一时刻发出多个包;能支持几组、怎样交错发送,要看设备能力与调度。
使用时还有两点不能照搬传统广播:
- 主广播信道上的扩展广播可使用 LE 1M 或支持的 LE Coded;LE 2M 可以用于辅助包,不能用于这里的主信道广播入口。LE 2M 的空中比特率为 2 Mb/s;LE Coded 则加入有助于接收方纠正部分传输错误的编码,代价是更多传输开销,有效数据速率更低。它们解决的问题不同,使用哪一种仍要双方支持。
- 对可扫描的扩展广播,应用广播数据放在扫描响应里,不能照着传统广播的思路,在初始广播数据和响应数据两边各放一份。也就是说,扫描者跟随指引收到辅助广播包后,还需要完成扫描请求与响应交互,才能取得这部分应用数据。
因此,支持某个较新的蓝牙版本,并不等于当前手机接口一定能收发所有扩展广播。只会接收传统广播的扫描者,也无法完整跟随这条辅助包链。产品需要兼容这些接收者时,可能另外保留传统广播。
6.2 周期广播让接收方知道下一次何时到来
普通广播发送时刻带有随机变化,扫描者需要开窗碰上它。周期广播(Periodic Advertising)则按固定间隔发送,并提供同步信息,让接收方可以推算后续广播的时间和信道。按这个安排连续发送的一串周期广播,称为周期广播列(Periodic Advertising Train)。
可以把它理解成按时发车的班车:第一次需要拿到时刻表,之后就能按时间等车,不必一直守在站台。蓝牙接收方通过相应的同步信息安排接收,也有机会减少盲目监听的时间;实际仍需考虑时钟误差和丢包。
同步信息相当于接收所需的"时刻表",包含广播间隔,以及用于确定后续接收时刻、信道等内容。扫描者可以先找到携带 SyncInfo 同步信息的辅助广播包,再据此寻找并跟踪相应的周期广播。同步是让接收方跟上发送方的安排,不是要求它们修改成相同的系统时间。
同步信息也可以由其他设备传过来。这个过程叫周期广播同步信息转移(Periodic Advertising Sync Transfer,PAST):一台设备已经掌握相应的同步参数,再通过已有的 LE 连接把它们交给另一台设备。
例如,设备 A 已经取得某组周期广播的同步信息,而设备 B 也需要接收这一组广播。在双方支持 PAST、并已有连接的情况下,A 可以把同步信息交给 B。B 据此安排接收,就不必自己从寻找广播入口开始重复搜索。A 传递的是接收安排,不是代替广播者持续转发每一份业务数据。
同步到周期广播,不等于与广播者建立了点对点连接。 PAST 使用连接来传递参数,但这是取得参数的一种方式;B 后续接收周期广播,仍然是接收广播。多个接收方可以各自同步到同一组周期广播。
6.3 PAwR 让接收设备按安排回复
不带响应的周期广播不会因为接收者听到了,就自动让对方回复。带响应的周期广播(Periodic Advertising with Responses,PAwR)则在周期性的发送安排中预留回复机会,让设备可以不为每一次数据交换单独建立点对点连接。
其中有三个时间概念:
- 事件:按固定间隔开始的一整轮 PAwR 通信安排。
- 子事件:一轮中的一个通信单元。广播者先发送一个包,再按配置留出接收回复的时间;一轮可以包含多个这样的单元。
- 响应时隙:子事件里预留给接收设备发送响应的一小段时间。接收设备需要知道自己使用哪个时隙,才能在对应位置回复。
例如,超市的一组电子价签需要更新价格。系统可以利用 PAwR,在某个子事件中发送给这一组价签的数据,再让相关价签使用各自约定的响应时隙报告结果。其他组可以使用别的子事件,不必每一轮都让所有价签同时回复。
这也解释了为什么"收到时间安排"还不够:价签还得知道自己该听哪一个子事件、使用哪一个响应时隙。这些选择需要应用或相应配置文件作出约定,不是扫描到 PAwR 广播后,所有设备就能随意挑一个位置发送。安排回复时间可以减少冲突,但仍不能保证没有丢包;怎样确认价格已更新,也要由产品的数据与业务规则决定。
PAwR 的响应与主动扫描的扫描响应也不同。主动扫描是扫描者收到合适广播后发送扫描请求,广播者返回补充数据;PAwR 则是接收设备在安排好的时隙中,把响应发回广播者。两者的触发方式、回复方向和消息类型都不相同。
扩展广播主要改变数据怎样组织、在哪里发送;周期广播主要让后续发送安排可以被同步;PAwR 再提供按时隙响应的能力。三者有联系,但不能当成同一个功能,也不是设备都会支持。
七、怎样理解实际拿到的扫描结果
7.1 收到无线包,不等于应用一定显示
手机上的结果,经过了不止一步处理:无线电接收,控制器和系统按规则处理,应用再筛选并显示。任意一步的条件不满足,都可能看不到预期设备。
例如,应用只显示带指定服务 UUID 的设备。目标虽然在广播,但这一项没有放进当前收到的数据里,就可能被过滤掉。筛选条件改变的是哪些结果被保留,不会让附近设备停止发广播。
系统蓝牙设置页也不是一个承诺列出所有 LE 广播的抓包工具。它会根据系统支持的功能和交互方式展示设备;应用可以使用自己的扫描规则。这解释了为什么配套应用里能看到的温湿度计,系统列表里却未必出现。
手机权限、应用前后台状态、扫描模式、系统节流,以及是否支持对应的广播形式和物理层,也会影响结果。这些是具体平台与设备的条件,不能写成所有蓝牙扫描都遵守同一条手机规则。
还有一种情况:设备仍在重复广播,但重复过滤让相同结果不再不断上报。没有新的回调,不足以证明设备已经离开;反过来,界面上还保留着旧结果,也不足以证明设备此刻仍在附近。需要判断在线状态时,应结合时间戳、实际收到的新数据和系统接口行为。
7.2 名称、地址和信号强度,各能说明多少
名称是便于人辨认的标签,不保证唯一,也可能缺失、缩短或来自缓存。两台同名设备并不罕见,不能只凭名称认定"这是我的那台"。
蓝牙地址也不总是终身不变。设备可能使用会变化的私有地址,减少长期被跟踪的风险;持有相应身份解析密钥(IRK)等信息的一方,可以按规则识别可解析私有地址。因此,用一次扫描显示的地址当作永久设备编号,可能在以后失效。手机接口暴露的标识形式也未必就是原始无线地址。
RSSI 是接收信号强度指示。比如在同样条件下,−50 dBm 比 −80 dBm 表示收到的信号更强。但人体遮挡、墙体、天线方向、发射功率和多径反射都会影响它,不能看到一个数值就断言"离我正好两米"。
最后,收到一个名称、UUID 或厂商标识,并不能证明发送者身份真实。普通明文广播通常可被附近兼容设备读取;定向、过滤和改名都不是内容保密措施。如果需要保护广播内容,要采用相应的安全设计,例如双方支持并正确配置的加密广播数据机制,不能把"没有配对入口"当成安全保证。
八、总结
广播负责把信息发到空中,扫描负责在合适的信道和时间接收。设备被看到,是这些条件配合的结果,而不是手机开启蓝牙后就必然发生的事情。
被动扫描只接收,主动扫描还可能请求扫描响应;可扫描决定能否请求补充信息,可连接决定能否按规则发起连接。取得广播或响应,都不代表已经连接、配对。
广播数据由带长度和类型的条目组成。传统广播的数据区最多 31 字节,扫描响应是另一份需要额外交互才能取得的数据。扩展广播可以借助辅助包和分片承载更多内容,周期广播让接收方按同步信息安排接收,PAwR 则进一步安排响应。
理解了这些关系,再看扫描列表中的名称、地址、信号强度,或者排查"搜不到",就能分别检查发送、接收、数据和显示条件,而不会把所有问题都归结为蓝牙没有打开。
九、测试题
- 手机没有与温湿度计连接,也没有配对,却能显示最新温度。这可能是怎样实现的?要正确显示温度,除了收到字节,还需要知道什么?
- 扫描工具标出某广播"不可扫描",另一个工具却收到了它。两种结果是否矛盾?这里的"可扫描"具体允许什么?
- 一个传统广播把编号放在广播数据里,把完整名称放在扫描响应里。被动扫描能保证取得名称吗?改成主动扫描后,为什么仍不能保证每次都取得?
- 扫描间隔为 100 ms,扫描窗口为 40 ms。从窗口开始算起,下一窗口何时开始?中间计划不监听的时间是多少?广播恰好落入窗口,是否就一定收到?
- 收到传统 ADV_NONCONN_IND 中的编号后,能否立刻向这个广播发送连接请求或扫描请求?如果只是记录附近编号,还需要先建立连接吗?
- 名称条目是"05 09 52 6F 6F 6D"。第一个 05 计算了哪些内容?整条占几字节?传统广播与扫描响应各有 31 字节,为什么不能把它们当成一次必达的 62 字节广播?
- 扩展广播允许的主机广播数据总长度上限可达 1650 字节,是否表示任意手机都能收到一个 1650 字节的广播包?主广播信道上的指引在其中起什么作用?
- 同步到周期广播与建立连接有什么不同?PAwR 的回复与主动扫描的扫描响应,是不是同一种交互?
- 应用已经显示过设备,后来不再产生新扫描回调。为什么不能仅凭这一点断定设备已关机?如果设备名称相同、地址变化或 RSSI 波动,又分别该怎样理解?