GAP 规范【9.1. Broadcast mode and Observation procedure】
这部分是GAP 规范中关于 LE 物理传输层上的“工作模式和过程”总览。它不是在讲某一个具体 HCI Command也不是在讲 Link Layer 空口包细节而是在告诉你在 BLE 的 LE physical transport 上设备可以进入哪些 GAP 层面的模式执行哪些 GAP 层面的过程。可以把它理解成一句话BLE 设备在 LE 物理传输上不只是“广播、扫描、连接”这么简单而是围绕广播、发现、连接、配对绑定、周期广播、等时广播、Channel Sounding 等能力定义了一系列相互独立但又经常组合使用的模式和过程。一、这段内容整体想表达什么原文核心意思是在一个 LE physical transport 上可以同时执行多种模式和过程。下面列出的这些模式和过程都是为 LE physical transport 定义的Broadcast mode and Observation procedure广播模式与观察过程Discovery modes and procedures发现模式与发现过程Connection modes and procedures连接模式与连接过程Bonding modes and procedures绑定模式与绑定过程Periodic advertising modes and procedure周期广播模式与过程Isochronous broadcast modes and procedures等时广播模式与过程Channel Sounding proceduresChannel Sounding 过程这些模式和过程彼此独立但实际设备通信时经常需要组合使用。设备可以因为用户操作进入某个模式也可以由设备自动进入某个模式。比如用户点击 App 上的“搜索设备”按钮手机开始扫描这是用户触发。蓝牙耳机开机后自动进入广播状态这是设备自动触发。手机扫描到目标设备后自动发起连接这是设备策略自动触发。二、关键信息 1这里讲的是 GAP 层的“模式”和“过程”这部分内容属于 GAP 的视角。GAP 关注的问题不是底层比特如何发送也不是连接事件里具体发几个 PDU而是关注设备现在处于什么角色设备是否可被发现设备是否可连接设备如何发现别人设备如何建立连接设备是否允许绑定设备是否使用周期广播、等时广播等高级能力所以这里的 “modes and procedures” 可以理解为Mode设备对外表现出来的一种状态或能力配置。Procedure为了完成某个目标而执行的一组动作。例如Peripheral 设备进入 General Discoverable Mode表示它愿意被中心设备发现。Central 设备执行 General Discovery Procedure表示它正在主动发现周围设备。Peripheral 设备进入 Undirected Connectable Mode表示它允许别人连接。Central 设备执行 General Connection Establishment Procedure表示它准备发起连接。三、关键信息 2这些模式和过程可以同时存在原文第一句说Several different modes and procedures may be performed simultaneously over an LE physical transport.意思是同一个 LE physical transport 上多个模式和过程可以同时进行。这点很重要因为 BLE 设备不是只能处于一个单一状态。举个例子一个外设可以同时处于可发现模式处于可连接模式正在广播允许后续绑定使用某种广播类型。从 App 开发角度看一个 BLE 模块正在发广播时它可能既是在“让别人发现我”也是在“让别人连接我”。比如常见的 BLE 串口模块广播广播包里包含设备名、Service UUID手机 App 扫描后能看到它手机 App 可以连接它连接后还能进行配对或绑定。这背后就可能同时涉及Discovery modeConnection modeBonding modeAdvertising typeSecurity requirement。四、关键信息 3这些模式和过程相互独立但实际通信时又密切相关原文说Each of the above modes and procedures are independent from each other but are closely related...意思是这些模式和过程在规范定义上是相互独立的但在实际使用中又经常组合在一起。例如“发现”和“连接”是两个不同过程。扫描到设备不代表一定能连接。设备可被发现不代表一定可连接。设备可连接不代表一定允许绑定。设备已连接不代表一定完成了配对或绑定。所以学习 GAP 时要注意不要把这些概念混在一起。比如Discovery 解决的是“我能不能被别人发现 / 我能不能发现别人”。Connection 解决的是“我能不能被别人连接 / 我能不能连接别人”。Bonding 解决的是“连接后是否保存长期安全关系”。它们是不同维度。五、关键信息 4Host 在执行这些过程前需要先配置 Controller 的本地 Link Layer 特性信息原文说The Host shall configure the Controller with its local Link Layer feature information...这句话很关键。意思是Host 在执行这些 GAP 模式和过程之前需要先根据本地 Link Layer 支持的能力配置 Controller。在 BLE 架构里大致可以这样理解Host负责 GAP、GATT、SM、ATT、L2CAP 等上层逻辑。Controller负责 Link Layer、PHY、射频收发等底层逻辑。HCIHost 和 Controller 之间的接口。也就是说GAP 层虽然在 Host 里定义策略但真正执行广播、扫描、连接等底层动作的是 Controller。所以 Host 在使用某些 GAP 模式或过程前要知道 Controller 支持什么能力。例如 Controller 是否支持LE 2M PHYLE Coded PHY扩展广播周期广播等时广播Channel Sounding隐私地址解析连接参数更新数据长度扩展等。如果 Controller 不支持某个 Link Layer Feature那么 Host 就不能随便让它执行相关过程。比如不支持 Extended Advertising就不能使用扩展广播相关过程。不支持 Periodic Advertising就不能使用周期广播。不支持 LE Isochronous Channels就不能使用 LE Audio 相关的等时通信能力。六、关键信息 5最后一句提到“广告类型”和 GAP 角色有关原文最后一句说The types of advertising used in these modes and procedures for each of the associated GAP roles are defined in Section 2.2.2 Table 2.1.意思是不同 GAP 角色在不同模式和过程中使用哪些广播类型会在 2.2.2 节的表 2.1 中定义。这句话对你后面学习很重要。因为 BLE 的很多行为最终都会落到“广播类型”上。比如 Legacy Advertising 中常见的广播类型有ADV_IND可连接、可扫描的非定向广播。ADV_DIRECT_IND可连接的定向广播。ADV_NONCONN_IND不可连接、不可扫描的非定向广播。ADV_SCAN_IND可扫描、不可连接的非定向广播。这些广播类型和 GAP 角色、GAP 模式之间有对应关系。比如想让别人既能发现又能连接通常会用 ADV_IND。只想广播数据不允许连接可能用 ADV_NONCONN_IND。只允许被特定设备快速连接可能涉及 ADV_DIRECT_IND。所以后面看到 GAP 表格时要重点看某个模式允许使用哪些 Advertising Event Type某个 GAP 角色对应哪些广播行为这个模式是否可发现、可扫描、可连接这个过程由 Observer、Broadcaster、Central、Peripheral 中哪个角色执行。七、这部分学习时最应该抓住的主线这段内容可以作为 GAP 学习的目录入口。重点不是死记每个名词而是建立下面这条主线Broadcaster / Peripheral 发广播。Observer / Central 扫描广播。Discovery 解决发现问题。Connection 解决连接建立问题。Bonding 解决长期安全关系问题。Periodic Advertising、Isochronous Broadcast、Channel Sounding 是 BLE 后续版本引入或增强的高级能力。你现在如果主要目标是理解普通 BLE App 开发尤其是扫描、连接、GATT 通讯那么最优先关注的是Discovery modes and proceduresConnection modes and proceduresBonding modes and proceduresBroadcast mode and Observation procedure至于Periodic advertisingIsochronous broadcastChannel Sounding可以先知道它们存在暂时不用深入。它们更多对应扩展广播、LE Audio、定位/测距等较高级场景。八、结合 App 开发的理解以一个常见 BLE 模块和手机 App 的过程为例BLE 模块开始广播它可能处于 Broadcast Mode如果广播是可发现的它也处于某种 Discoverable Mode如果广播是可连接的它也处于 Connectable Mode。手机 App 开始扫描手机执行 Observation Procedure 或 Discovery Procedure如果只是被动看广播数据可以理解为观察如果目的是找到可连接设备则更接近发现过程。手机 App 点击连接手机执行 Connection Establishment Procedure模块接受连接双方进入连接状态。连接后进行配对双方进入 Pairing / Bonding 相关流程如果保存密钥后续重新连接可以使用 Bonding 信息。所以 GAP 的这些模式和过程本质上是在描述设备在 BLE 通信生命周期中的不同阶段和行为规则。九、这段内容的总结这部分内容的核心不是讲具体实现细节而是告诉你LE physical transport 上定义了一组 GAP 模式和过程包括广播、观察、发现、连接、绑定、周期广播、等时广播和 Channel Sounding。这些模式和过程相互独立但实际设备通信时经常组合使用。设备进入某个模式或执行某个过程可以由用户操作触发也可以由设备自动触发。Host 在使用这些模式和过程前需要了解并配置 Controller 的本地 Link Layer 能力。不同 GAP 角色在这些模式和过程中具体使用哪些广播类型需要看 Section 2.2.2 Table 2.1。你接下来学习 GAP 时可以先把注意力放在发现、广播、扫描、连接、绑定这几块。这几块和日常 BLE App 开发最直接相关。这部分内容讲的是BLE GAP 中最基础的一组“单向、无连接通信”机制Broadcast mode广播模式Observation procedure观察过程简单说Broadcast mode 负责“发广播数据”Observation procedure 负责“收广播数据”。它们组合起来就是 BLE 中最基础的广播通信模型一个设备不建立连接只通过 Advertising Events 向外发送数据另一个设备不连接它只通过扫描接收这些广播数据。一、这部分内容整体想表达什么这部分主要说明在 BLE 中设备可以通过Advertising Events进行一种单向、无连接的通信。也就是广播方只负责发数据不关心有没有人收到。观察方只负责扫描接收不需要和广播方建立连接。这和我们平时理解的“连接后 GATT 通信”完全不同。GATT 通信是Central 连接 Peripheral 然后通过 Read / Write / Notify / Indicate 交换数据而 Broadcast / Observation 是Broadcaster 发广播 Observer 扫描广播 双方不建立连接所以它更像是我只是在空中喊一声谁听到了算谁的。二、表 9.1 想表达什么表 9.1 说明的是不同 GAP 角色是否必须支持 Broadcast mode 和 Observation procedure。表里的字母含义通常可以这样理解M Mandatory必须支持 E Excluded不适用 / 不要求支持表格内容大致是项目PeripheralCentralBroadcasterObserverBroadcast modeEEMEObservation procedureEEEM也就是说Broadcaster 角色必须支持 Broadcast mode。Observer 角色必须支持 Observation procedure。Peripheral 和 Central 角色在这个表里不要求支持这两个能力。这里要注意一个容易混淆的点Peripheral 和 Broadcaster 都可能“发广播”但它们的 GAP 角色语义不同。Peripheral 通常是为了让 Central 发现并连接自己所以它更关心可发现 可连接 建立连接Broadcaster 则是纯广播角色重点是只发广播数据 不建立连接Observer 则是纯观察角色重点是只扫描接收广播 不建立连接所以这一节不是在讲普通 Peripheral 的“可连接广播”而是在讲不建立连接的广播通信模型。三、Broadcast mode 是什么1. 定义原文说The Broadcast mode provides a method for a device to send connectionless data in advertising events.意思是Broadcast mode 提供了一种方法让设备通过 advertising events 发送无连接数据。关键词是send connectionless data advertising events也就是通过广播事件发送数据而且不需要连接。例如BLE Beacon温湿度传感器周期性广播数据设备通过广播包上报状态一个设备广播厂商自定义数据资产标签定期广播自己的 ID。这些都可以理解为 Broadcast mode 的典型使用场景。四、Broadcast mode 的关键条件1. 必须使用不可连接广播事件原文说A device in the Broadcast mode shall send data using non-connectable advertising events.意思是处于 Broadcast mode 的设备应当使用不可连接的 advertising events 发送数据。这是非常关键的一句话。也就是说Broadcast mode 的核心不是“只要发广播就算 Broadcast mode”而是它发的是 non-connectable advertising events也就是不可连接广播事件。这意味着接收方可以扫描到它但是不能通过这个广播事件直接发起连接。所以 Broadcast mode 更偏向广播数据分发 状态上报 Beacon 无需连接的公开信息发送而不是我发广播是为了让 App 连接我如果一个 BLE 模块发的是可连接广播让手机 App 扫描后连接它这更接近 Peripheral 的连接相关模式而不是这里强调的 Broadcast mode。2. 可以使用不可连接、不可扫描的非定向广播或定向广播原文说A device in the Broadcast mode may send non-connectable and non-scannable undirected or non-connectable and non-scannable directed advertising events anonymously by excluding the Broadcaster’s address.意思是Broadcast mode 中的设备可以发送non-connectable and non-scannable undirected advertising events或者non-connectable and non-scannable directed advertising events并且可以通过不包含 Broadcaster 地址的方式匿名发送。这里信息比较密集拆开看。non-connectable不可连接。接收方不能基于这个广播直接发起连接。non-scannable不可扫描。也就是说对方不能通过 Scan Request 获取 Scan Response Data。这和 Legacy Advertising 中的ADV_SCAN_IND不一样。ADV_SCAN_IND是不可连接但可扫描而这里说的 non-scannable 是不可连接也不可扫描undirected非定向广播。也就是不是专门发给某一个目标设备。类似谁扫描到都可以看到directed定向广播。也就是广播事件中可能带有目标设备相关信息面向特定接收方。不过这里强调的是non-connectable and non-scannable directed advertising events所以它不是经典理解中为了快速连接而使用的可连接定向广播而是不可连接、不可扫描的定向广播事件。anonymously by excluding the Broadcaster’s address可以通过不包含广播者地址的方式匿名发送。这个点和隐私有关。也就是说广播方可以不暴露自己的设备地址让接收方更难直接通过地址追踪它。3. 广播数据必须使用 AD Type 格式原文说The advertising data shall be formatted using the Advertising Data (AD) type format...意思是广播数据必须按照 Advertising Data也就是 AD Type 格式组织。这对 BLE App 开发非常重要。我们平时看到的广播原始数据通常就是一段 AD Structure 组成的数据。格式大致是Length | AD Type | AD Data例如02 01 06可以解析为Length 0x02 AD Type 0x01 AD Data 0x06表示 Flags。再比如09 09 46 53 43 2D 42 54 39 37 36可以理解为Length 0x09 AD Type 0x09 AD Data Complete Local Name对应设备名。所以 Broadcast mode 发送的数据不是随便塞一串字节就完了而是要符合 AD Type 格式。4. Broadcast mode 不能设置某些 Flags原文说A device in the Broadcast mode shall not set the ‘LE General Discoverable Mode’ flag or the ‘LE Limited Discoverable Mode’ flag in the Flags AD Type...意思是处于 Broadcast mode 的设备不应该在 Flags AD Type 中设置LE General Discoverable Mode LE Limited Discoverable Mode这点非常关键。因为 Broadcast mode 的重点是广播无连接数据而 General Discoverable / Limited Discoverable 这两个标志更偏向我可以被发现通常用于后续连接相关的发现流程所以如果一个设备只是 Broadcaster不希望被当成“可发现并可连接的 Peripheral”就不应该设置这两个 Discoverable Flag。这也是 GAP 语义上的区分Broadcast mode ≠ Discoverable mode发广播不等于处于可发现模式。这是学习 GAP 时非常容易混淆的地方。5. Broadcast mode 发送的数据是不可靠的原文 Note 说All data sent by a device in the Broadcast mode is considered unreliable since there is no acknowledgment from any device that may have received the data.意思是Broadcast mode 发送的所有数据都认为是不可靠的因为没有任何接收方会对收到的数据进行确认。这句话非常重要。因为广播通信没有 ACK。广播方不知道有没有设备收到 有几个设备收到 收到的数据是否完整 是否某一次广播被丢失 接收方是否正在扫描 接收方扫描窗口是否刚好错过所以 Broadcast mode 适合发可以重复发送的数据 允许丢包的数据 状态类数据 标识类数据 广播通知类数据不适合发必须可靠送达的数据 必须按顺序接收的数据 必须确认接收的数据 大文件传输 关键控制命令如果需要可靠通信通常应该建立连接然后使用 GATT Write / Notify / Indicate 等机制。其中 Indicate 还有确认机制比 Notify 更可靠。6. 可以配置多个独立 Advertising Set原文说The device may configure and enable multiple independent advertising sets. Each advertising set may have an independent advertising filter policy.意思是设备可以配置并启用多个独立的 advertising sets。每个 advertising set 可以有独立的广播过滤策略。这个主要对应扩展广播时代的能力。在 Legacy Advertising 中一个设备通常更像是配置一组广播参数、广播数据、扫描响应数据。但在 Extended Advertising 中可以有多个 Advertising Set。每个 Advertising Set 可以有自己的Advertising Handle Advertising Parameters Advertising Data Advertising Interval Advertising PHY Advertising Filter Policy这样一个设备就可以同时做不同类型的广播。例如Advertising Set 1广播设备基本信息 Advertising Set 2广播传感器数据 Advertising Set 3广播厂商自定义数据而且每组广播可以使用不同的过滤策略。五、Observation procedure 是什么1. 定义原文说The Observation procedure provides a method for a device to receive connectionless data from a device that is sending advertising events.意思是Observation procedure 提供了一种方法让设备从正在发送 advertising events 的设备那里接收无连接数据。关键词是receive connectionless data advertising events也就是通过扫描接收广播数据不建立连接。从 App 开发角度看手机 App 扫描周围 BLE 广播就很接近这个过程。不过严格说手机扫描设备可能有不同目的只看广播数据不连接Observation 为了发现可连接设备Discovery 为了后续连接Connection establishment 的前置动作所以要看扫描目的。如果只是做 Beacon 扫描、广播数据监听、传感器广播读取那么更接近 Observation procedure。六、Observation procedure 的关键条件1. 可以使用 Passive Scanning 或 Active Scanning原文说A device performing the Observation procedure may use passive scanning or active scanning to receive advertising events.意思是执行 Observation procedure 的设备可以用passive scanning也可以用active scanning来接收 advertising events。Passive Scanning被动扫描只接收广播包不主动发送 Scan Request。流程大致是Broadcaster 发送 Advertising Packet Observer 接收 Advertising Packet特点是更省电 不打扰广播方 不能获取 Scan Response DataActive Scanning主动扫描接收到可扫描广播后扫描方会发送 Scan Request广播方再返回 Scan Response。流程大致是Advertiser 发送 Advertising Packet Scanner 发送 Scan Request Advertiser 返回 Scan Response特点是可以获取更多数据 例如完整设备名、更多 Service UUID、厂商数据等 但扫描方会主动发包 功耗更高 广播方也需要支持 scannable advertising2. Active Scanning 可以接收 Scan Response Data原文说A device performing the Observation procedure may use active scanning to also receive scan response data sent by any device in the Broadcast mode that advertises using scannable advertising events.意思是执行 Observation procedure 的设备可以通过主动扫描接收 Scan Response Data但前提是对方使用的是可扫描广播事件。这个点和 BLE App 开发非常相关。很多 BLE 模块会把数据分开放Advertising Data放 Flags、Service UUID、部分厂商数据 Scan Response Data放完整设备名、额外厂商数据所以如果手机只是被动扫描可能只能看到 Advertising Data看不到 Scan Response Data。如果手机执行主动扫描才可能拿到 Scan Response Data。但是也要注意不是你主动扫描就一定能拿到 Scan Response。还需要对方广播类型是 scannable 扫描请求没有被过滤策略拦掉 扫描时机刚好匹配 系统蓝牙栈允许主动扫描3. 可以解析 Resolvable Private Address原文说When a device performing the Observation procedure receives a resolvable private address in the advertising event, the device may resolve the private address by using the resolvable private address resolution procedure...意思是当执行 Observation procedure 的设备在广播事件中收到一个Resolvable Private AddressRPA可解析私有地址它可以使用resolvable private address resolution procedure来解析这个私有地址。这里和 BLE 隐私机制有关。RPA 是会变化的地址目的是防止设备长期被同一个地址追踪。但是如果接收方持有对方的 IRK也就是 Identity Resolving Key就可以解析这个 RPA知道它对应的是哪个已知设备。所以这里表达的是Observer 在扫描广播时如果遇到可解析私有地址并且具备解析条件可以通过地址解析流程识别对方身份。这在已绑定设备、隐私地址、白名单/Filter Accept List 场景中比较重要。4. 如果广播方发送动态数据接收方应该关闭重复过滤原文 Note 说In use cases where a device in the Broadcast mode sends dynamic data, the receiving device should disable duplicate filtering capability in the Controller so that the Host receives all advertising packets received by the Controller.意思是如果 Broadcaster 发送的是动态变化的数据那么接收方应该关闭 Controller 的 duplicate filtering这样 Host 才能收到 Controller 接收到的所有广播包。这个点非常重要也非常贴近 App 开发。什么是 duplicate filtering扫描时Controller 可能会帮 Host 过滤重复广播。也就是说同一个设备连续发很多广播Controller 可能只上报第一次后面的重复广播就不上报给 Host。这样做的好处是减少 Host 处理压力 降低功耗 减少重复回调但是问题是如果广播数据是动态变化的过滤重复包可能会导致 App 收不到后续变化。例如 Broadcaster 每次广播的数据都不同第 1 次广播温度 25.1℃ 第 2 次广播温度 25.2℃ 第 3 次广播温度 25.3℃如果 Controller 开了 duplicate filteringHost 可能只收到第一包后面的动态数据可能被过滤掉。所以规范建议如果要接收动态广播数据应该关闭 duplicate filtering这样 Host 才能尽可能收到每一次广播上报。七、这部分和 HCI Command 的关系虽然这段是 GAP 规范但它最终会落到 HCI 扫描和广播相关命令上。例如 Broadcast mode 可能涉及LE Set Advertising Parameters LE Set Advertising Data LE Set Advertising Enable或者扩展广播中LE Set Extended Advertising Parameters LE Set Extended Advertising Data LE Set Extended Advertising EnableObservation procedure 可能涉及LE Set Scan Parameters LE Set Scan Enable或者扩展扫描中LE Set Extended Scan Parameters LE Set Extended Scan Enable其中 duplicate filtering 就和扫描使能命令中的过滤重复能力有关。比如 Legacy Scanning 中LE Set Scan Enable command里有Filter_Duplicates它就用于控制是否过滤重复广播上报。所以这段 GAP 内容不是孤立的它在讲上层语义HCI Command 是底层配置入口。八、这部分最容易混淆的地方1. 发广播不一定等于可连接很多人一看到“广播”就以为设备发广播 手机可以连接它这是不准确的。广播可以分为可连接广播 不可连接广播 可扫描广播 不可扫描广播 定向广播 非定向广播Broadcast mode 这里强调的是non-connectable advertising events所以它不是为了建立连接而是为了发送无连接数据。2. 扫描不一定是为了连接手机扫描 BLE 设备也不一定是为了连接。扫描可能有三个目的只观察广播数据Observation 发现周围设备Discovery 为了后续连接目标设备Connection Establishment 前置过程所以看到扫描行为时要看它的目的是什么。3. Scan Response Data 不是广播方一定会发出来的Scan Response Data 只有在特定情况下才会出现广播方使用 scannable advertising event 扫描方使用 active scanning 扫描请求没有被过滤 广播方收到 Scan Request 并返回 Scan Response所以模块端设置了 Scan Response Data不代表手机一定能看到。4. 广播数据是不可靠的Broadcast mode 没有 ACK。所以不能把广播当成可靠数据通道。如果业务要求可靠比如控制命令必须送达 文件必须完整传输 状态必须确认就应该建立连接而不是只靠广播。九、结合实际 BLE App 开发理解假设有一个温湿度传感器它不希望和手机建立连接只想每秒广播一次数据温度25.3℃ 湿度60% 电量88%这个传感器就是 Broadcaster。它使用 Broadcast mode。手机 App 打开扫描不连接设备只解析广播包中的温湿度数据。手机 App 就是在执行 Observation procedure。流程可以理解为Broadcaster ↓ Advertising Event Observer没有连接没有 GATT没有 ATT没有 Notify没有 Write也没有 ACK。如果传感器每秒数据都变化那么手机端最好关闭 duplicate filtering否则可能收不到每一次变化。十、这部分内容总结这部分的核心可以总结为Broadcast mode 是广播方通过 Advertising Events 发送无连接数据的方法。Observation procedure 是观察方通过扫描接收无连接广播数据的方法。Broadcast mode 使用的是不可连接广播事件因此它不是为了建立连接。广播数据必须使用 AD Type 格式。Broadcast mode 不能设置 LE General Discoverable Mode 或 LE Limited Discoverable Mode 标志因为它不是 Discoverable mode。Broadcast mode 发送的数据是不可靠的因为没有接收确认。Observation procedure 可以使用被动扫描或主动扫描。主动扫描可以接收 Scan Response Data但前提是广播方使用可扫描广播事件。如果广播数据是动态变化的接收方应关闭 duplicate filtering让 Host 能收到更多广播包。学习这一节时最应该抓住两个角色Broadcaster只发广播不连接 Observer只收广播不连接它们构成 BLE 中最基础的无连接单向通信模型。