GAP规范【1. Foreword】
第 C 部分通用访问规范 / 通用访问配置文件 / GAP这个 Profile 定义了与发现 Bluetooth 设备相关的通用流程也就是空闲模式流程idle mode procedures同时也定义了与连接 Bluetooth 设备时的链路管理相关的流程也就是连接模式流程connecting mode procedures。它还定义了在不同安全等级下使用 Bluetooth 设备时的相关流程。另外这个 Profile 还包含了一些通用的格式要求这些要求主要用于用户界面层面可访问的参数。不得不说GAP层面开始上概念了。定义了很多的概念后面将围绕这些概念进行理论。先把蓝牙 LE 协议栈的架构图看一遍用更容易理解的话说GAP 主要不是讲“数据怎么收发”而是讲一个蓝牙设备如何被发现、如何去发现别人、如何建立连接、连接过程中如何管理角色和安全以及设备名称、外观、地址、广播行为等这些用户能感知到的通用规则。建议重点注意这几件事1. GAP 不是 GATT不要混在一起很多刚开始学 BLE 的人会把 GAP 和 GATT 混在一起。可以先这样区分GAP解决“设备怎么被发现、怎么连接、谁连接谁、安全等级怎么处理”等问题。GATT解决“连接之后数据怎么组织、怎么读写、怎么通知”等问题。比如设备广播出来叫什么名字、是否可连接、是否可扫描、使用什么地址、中心设备怎么扫描、怎么发起连接这些更偏 GAP。连接成功后App 去发现 Service、Characteristic然后 Read、Write、Notify这些更偏 GATT。2. 重点理解两个模式Idle Mode 和 Connecting Mode截图里提到了两个关键词idle mode procedures空闲模式流程可以理解为设备还没有建立连接时的一系列行为。例如设备如何广播、如何被发现、中心设备如何扫描、如何发现周围设备。connecting mode procedures连接模式流程可以理解为设备准备建立连接或者已经进入连接相关管理阶段时的行为。例如谁作为 Central谁作为 Peripheral如何发起连接连接参数怎么管理断开连接后状态如何变化。所以学习 GAP 时不要只盯着“广播”一个点而是要把它放进完整流程里看广播 → 扫描 → 发现设备 → 发起连接 → 建立连接 → 连接管理 → 安全处理这段话是 GAP 规范开头的 Foreword / 前言它主要想表达的是蓝牙 Profile 的目的是让不同厂商做出来的蓝牙设备在同一个使用场景下能够互相兼容、正常协作。逐段翻译如下1. Foreword1. 前言如果来自不同制造商的设备都遵循 Bluetooth SIG 定义的某个 Profile 规范那么这些设备就可以在某个特定服务和使用场景下实现互操作。一个 Profile 会从 Bluetooth SIG 的规范中选择一组消息和流程这些通常被称为capabilities能力集合。然后 Profile 会描述在指定的服务和使用场景下蓝牙空中接口应该如何工作。某个功能到底是必须支持还是可选支持会分别针对蓝牙空中接口两端的设备单独说明。换成更容易理解的话Profile 不是从零定义一套蓝牙协议而是从蓝牙核心规范里挑选出某些功能、消息、流程然后规定在某个具体场景下应该怎么用。比如两个不同厂商的蓝牙设备一个是 A 厂商的蓝牙模块一个是 B 厂商的手机 App只要它们都按照同一个 Profile 的要求实现那么它们就应该能够互相发现、连接、通信达到兼容的目的。这里有几个重点1. Interoperability互操作性 / 兼容性这句话的核心是Profile 的价值就是保证不同厂商设备之间可以配合工作。否则每个厂商都按自己的理解实现蓝牙功能就会出现A 手机能连B 手机不能连A 模块能被扫描到B 模块扫描不到某个功能在一个平台可用另一个平台不可用。Profile 就是为了减少这种混乱。2. Profile 是面向“具体场景”的文中说for a specific service and use case意思是Profile 通常不是泛泛地描述所有蓝牙行为而是面向某个具体服务或使用场景。比如GAP设备发现、连接、访问、安全等通用流程。GATT基于 Attribute 的数据组织和访问。HID over GATT蓝牙键盘、鼠标这类 HID 设备。Heart Rate Profile心率设备。Battery Service电池电量服务。所以 Profile 更像是为了某个应用场景把蓝牙核心规范里的能力组合起来并规定怎么使用。3. capabilities能力集合这里的 capabilities 可以理解为Profile 规定设备需要具备哪些蓝牙能力。这些能力可能包括广播能力扫描能力连接能力发现服务的能力读写特征值的能力加密、认证、绑定能力某些固定格式的数据结构。不是所有蓝牙设备都要支持所有能力而是看它属于哪个 Profile、扮演什么角色、用于什么场景。4. mandatory 和 optional 要分两端看最后一句很重要某个功能是强制的还是可选的会分别针对蓝牙空中接口的两端来说明。也就是说同一个功能对于不同角色可能要求不一样。比如在一个 Profile 里Peripheral 端必须支持某个服务Central 端必须能够发现这个服务Peripheral 端必须支持 NotifyCentral 端可能只是可选支持某个配置流程。所以学习 Profile 时不能只看“这个功能是不是 mandatory”还要看是对哪一端 mandatory是 Central 端Peripheral 端Client 端Server 端这点非常关键。这部分是1.1 Scope / 范围它在说明GAP 这份规范到底管什么、不管什么以及它适用于哪些蓝牙实现类型。可以把它理解为 GAP 规范的“学习边界说明”。一、这部分整体想表达什么这一节主要表达 4 件事1. GAP 要定义一些通用概念、建议和要求原文意思是GAP 的目的之一是引入一些定义、建议和通用要求这些内容和蓝牙设备的模式 mode、访问流程 access procedure有关并且这些内容会被传输层 Profile 和应用层 Profile 使用。换句话说GAP 是很多其他 Profile 的基础。比如后面你学 GATT、HID over GATT、Heart Rate Profile、Battery Service 等它们都会依赖 GAP 里定义的一些通用概念。例如设备什么时候可以被发现设备什么时候可以被连接Central 和 Peripheral 如何建立连接设备名称怎么暴露安全等级怎么要求用户界面上显示的参数如何命名。这些不是某一个具体业务 Profile 独有的而是通用规则。2. GAP 要描述设备在 standby 和 connecting 状态下应该怎么表现原文说GAP 会描述设备在standby和connecting状态下应该如何行为以避免蓝牙设备之间无法建立 link/channel或者影响多 Profile 同时工作的情况。这句话很关键。可以理解为GAP 不是只讲广播也不是只讲连接而是讲设备在“还没连接”和“正在建立连接/连接相关过程”中应该怎么做。这里提到两个状态standby state待机状态 / 空闲状态设备还没有建立连接可能正在等待被发现或者什么都没做。在 BLE 里你可以近似理解为Peripheral 可能准备广播Central 可能准备扫描设备可能还没有进入连接流程设备处于未连接的基础状态。connecting state连接相关状态设备正在参与连接建立或者执行连接相关过程。例如Central 发起连接Peripheral 处于可连接广播状态链路正在建立连接参数、安全流程等开始介入。所以 GAP 关注的是设备在未连接状态下如何被发现以及在连接建立过程中应该遵守什么规则。3. GAP 特别关注 discovery、link establishment、security原文明确说Special focus is put on discovery, link establishment and security procedures.也就是 GAP 特别关注三类流程discovery发现流程也就是设备怎么被发现、怎么去发现别人。在 BLE 中对应你熟悉的内容就是广播 Advertising扫描 Scanning扫描响应 Scan Response可发现模式 Discoverable Mode观察流程 Observation Procedure发现流程 Discovery Procedure。比如一个 Peripheral 广播出来Central 扫描到它这就属于 discovery 相关内容。link establishment链路建立也就是设备之间如何建立连接。在 BLE 中大致对应Peripheral 进入可连接广播Central 扫描到目标设备Central 发起连接Controller 在 Link Layer 建立连接连接成功后进入连接态。之前文章中的 HCI Command比如LE Set Advertising ParametersLE Set Advertising EnableLE Set Scan ParametersLE Set Scan EnableLE Create Connection这些命令在具体实现上和 GAP 的 discovery、link establishment 是能对应起来的。可以这样理解GAP 讲“什么时候该被发现、什么时候可以连接、连接流程应该怎么定义”HCI Command 是 Controller 层具体执行这些行为的接口。security procedures安全流程也就是安全等级、认证、加密、配对、绑定等相关流程。不过刚开始学习 GAP 时不建议马上深挖安全部分。可以先知道GAP 会规定在不同场景下对安全等级有什么要求。后面再结合 SMP、Pairing、Bonding、Privacy、Resolving List、IRK 去深入理解。4. GAP 还规定用户界面层面的参数命名和编码方式原文说GAP 会说明一些用户界面方面的要求主要是 procedure 和 parameter 的编码方案、名称等以提供满意的用户体验。这句话容易被忽略但其实很重要。它说明 GAP 不只是底层链路规则也包含一些用户能感知到的信息格式。比如设备名称 Device Name设备外观 Appearance可发现状态连接状态配对/绑定相关提示用户可看到的参数名称。所以 GAP 某些内容和 App 层也有关。例如你的 App 扫描设备时看到的设备名称设备地址广播数据是否可连接设备类型外观类型这些都可能和 GAP 的用户可见参数有关。二、表格想表达什么表格标题是Implementation transport types意思是实现传输类型。这一节说 GAP 规范根据 Core Configuration 支持情况把蓝牙实现分成三类1. BR/EDR-only意思是只支持传统蓝牙 BR/EDR 的实现。BR/EDR 是经典蓝牙也就是常说的 Classic Bluetooth。典型场景包括蓝牙音频蓝牙耳机传统音频链路SPP 串口传统 HID文件传输等经典蓝牙场景。这里不重点涉及 BLE。2. LE only意思是只支持低功耗蓝牙 LE 的实现。也就是 BLE-only 设备。现在主要理解 BLE 广播、扫描、连接、GATT 通信大部分都属于这个方向。典型设备包括BLE 模块传感器智能手环蓝牙温湿度计BLE BeaconBLE 透传模块低功耗 IoT 设备。3. BR/EDR/LE意思是同时支持经典蓝牙和低功耗蓝牙的双模设备。比如手机通常就是这种类型既支持经典蓝牙音频也支持 BLE 扫描、连接、GATT 通信。很多蓝牙芯片也可能是双模芯片。这类设备既能处理 Classic Bluetooth也能处理 BLE。三、这一节的关键信息你学习 GAP 时最需要抓住这些重点关键点 1GAP 是基础 ProfileGAP 不是一个具体业务功能而是蓝牙设备访问、发现、连接、安全等通用行为的基础规范。它会被其他 Profile 使用。所以学习 BLE 时GAP 是很值得优先理解的。关键点 2GAP 重点不是“怎么传业务数据”GAP 重点不是告诉你怎么 Read、Write、Notify。那些更偏 GATT。GAP 重点是设备如何被发现设备如何发起发现设备如何进入可连接状态设备如何建立连接设备如何处理安全等级设备名称、外观等用户可见信息如何表达。关键点 3GAP 特别关注三个流程这三个词可以作你学习 GAP 的主线Discovery发现对应 BLE 广播和扫描。Link Establishment链路建立对应 BLE 连接建立过程。Security安全对应配对、绑定、加密、安全等级等。可以先按这个顺序学发现流程 → 连接建立流程 → 安全流程关键点 4要区分 BR/EDR 和 LE这份 GAP 规范不是只服务 BLE它同时覆盖三类实现BR/EDR-onlyLE onlyBR/EDR/LE。现在如果主要研究 BLE那么阅读时要特别关注和LE相关的部分。看到 BR/EDR-only 的内容可以先不用深挖。否则很容易被经典蓝牙的概念带偏。关键点 5GAP 会和 HCI Command 对应但不是一回事GAP 是规则和流程。HCI Command 是具体控制命令。比如 GAP 里讲设备进入可发现模式设备进入可连接模式Central 执行发现流程Central 执行连接建立流程。落到 HCI 层可能就会对应LE Set Advertising ParametersLE Set Advertising DataLE Set Scan Response DataLE Set Advertising EnableLE Set Scan ParametersLE Set Scan EnableLE Create Connection。所以后面学习时可以不断问GAP 这里讲的是哪种行为这个行为在 HCI 层可能对应哪些 Command在 Link Layer 空口上又会表现成什么包这样学习会非常清晰。这部分内容其实不是在讲 GAP 的核心业务流程而是在讲阅读 GAP 规范时要遵守的“符号说明、图示约定、命名规则以及哪些章节适用于哪些蓝牙配置”。可以把它理解为这几节是在告诉你后面看到流程图、定时器、UUID、章节适用范围时应该怎么读。一、1.2 Symbols and conventions 想表达什么1.2 Symbols and conventions1.2 符号和约定这一节是规范的“阅读说明”。它主要说明后面 GAP 规范中会出现一些流程图、箭头、定时器、UUID 表示法。为了避免误解规范先统一说明这些符号分别是什么意思。这部分不是 GAP 的技术重点但它会影响你后面读流程图时是否读得懂。二、1.2.1 This section is no longer used这一节写的是This section is no longer used意思是这一节已经不再使用。你学习时可以直接跳过不需要纠结。这通常是规范版本演进过程中保留下来的占位说明。也就是说旧版本可能这里有内容新版本里已经废弃了但章节编号为了兼容历史结构仍然保留。三、1.2.2 Signaling diagram conventions 想表达什么这一节最重要。它是在说明后面 GAP 规范中的流程图箭头应该怎么理解。图中有两个实体A B | | | |A 和 B 可以理解为蓝牙空中接口的两端设备。在不同场景下A/B 可能代表Central 和 PeripheralObserver 和 BroadcasterInitiator 和 AdvertiserClient 和 Server或者其他参与流程的两端。关键不是 A/B 的名字而是看箭头方向和线型。四、流程图中的 PROC 和 MSG 有什么区别图中出现了两类标识PROC1 / PROC2 / PROC3 / PROC4 / PROC5 MSG1 / MSG2 / MSG3它们不是一回事。1. PROC 表示 procedure流程 / 子流程PROC 不是单个数据包也不一定是单条消息。它表示一个procedure也就是一个流程或子流程。一个 procedure 里面可能包含多个动作比如开始广播开始扫描发起连接执行发现流程执行配对流程建立安全连接更新参数。所以你看到 PROC 时不要把它简单理解成“发了一包数据”。它更像是某一方启动了一个流程。2. MSG 表示 message消息MSG 更偏向“单条消息”。比如A 向 B 发送一条消息B 向 A 发送一条消息某条消息是可选的。在协议流程图中MSG 通常比 PROC 更具体。可以这样理解PROC 一个流程 MSG 流程中的一条消息五、图中的各种箭头具体是什么意思1. PROC1B 发起的子流程图中 PROC1 的箭头是从 B 指向 A。意思是PROC1 是由 B 发起的一个子流程。也就是说流程的发起方是 B影响对象是 A。例如在 BLE 中某些场景下可以类比为Central 发起扫描请求Central 发起连接请求Client 发起某个访问流程。当然具体要看后文上下文不能固定认为 B 一定是 Central。2. PROC2A 发起的子流程PROC2 的箭头是从 A 指向 B。意思是PROC2 是由 A 发起的一个子流程。比如可以类比为Peripheral 进入广播流程某一端发起安全请求某一端发起连接参数更新相关流程。重点是看箭头方向A ----PROC2---- B表示 A 是主动发起方。3. PROC3发起方未定义的子流程PROC3 是双向实线箭头。原文说PROC3 is a sub-procedure where the initiating side is undefined, may be both A or B.意思是PROC3 是一个发起方未定义的子流程可能由 A 发起也可能由 B 发起。这类流程表示规范不限定一定由哪一端开始。比如有些流程可能双方都可以触发安全流程某些连接管理流程某些状态变化流程。你看到这种双向箭头时要理解为这个流程不是固定由某一边发起A 和 B 都有可能是发起方。4. 虚线箭头表示 optional可选步骤原文说Dashed arrows denote optional steps.也就是虚线箭头表示可选步骤。这点非常重要。在规范里实线和虚线的含义不同实线通常表示必需流程或标准流程 虚线表示可选流程或可选消息如果你后面看 GAP 流程图时看到虚线不要以为它一定会发生。它只是说在某些条件下可以发生但不是所有实现都必须执行。5. PROC4A 发起的可选子流程PROC4 是从 A 指向 B 的虚线箭头。意思是PROC4 表示由 A 发起的可选子流程。也就是A - - - PROC4 - - - B含义是A 可以发起这个流程但不是强制必须发起。6. PROC5B 发起的可选子流程PROC5 是从 B 指向 A 的虚线箭头。意思是PROC5 表示由 B 发起的可选子流程。也就是A - - - PROC5 - - - B含义是B 可以发起这个流程但这个流程是可选的。7. MSG1B 发给 A 的消息MSG1 的箭头方向是从 B 到 A。意思是MSG1 是 B 发送给 A 的消息。注意这里是 message不是 procedure。所以它更强调一次具体的消息传递。8. MSG2A 发给 B 的消息MSG2 的箭头方向是从 A 到 B。意思是MSG2 是 A 发送给 B 的消息。9. MSG3A 发给 B 的可选消息MSG3 是从 A 到 B 的虚线消息箭头。意思是MSG3 表示 A 发给 B 的可选消息。也就是说这条消息不一定出现。这一节最重要的学习点是不要把流程图里的箭头都理解成“空口包”这是你学习 BLE 时特别要注意的一点。因为你之前一直在看 HCI Command、Advertising PDU、Scan Request、Connect Indication 这些内容很容易看到箭头就下意识理解为“发了一个包”。但在 GAP 规范里PROC 箭头不一定是一个具体空口包。它可能只是表示某一方启动了某个流程某个过程由谁发起某个过程是否可选某个过程涉及两端交互。只有 MSG 才更接近“消息”的概念但也不一定等价于你在 Link Layer 里看到的某一个 PDU。具体还要结合上下文。你可以这样记GAP 流程图中的箭头 规范层面的流程/消息方向 Link Layer PDU 空口上的具体包 HCI Command Host 控制 Controller 的具体命令这三者不能直接画等号。七、1.2.3 Notation for timers and counters 想表达什么这一节是在说 GAP 里定时器的命名规则。原文意思是GAP 这个 Profile 会引入一些专属于 GAP 的定时器。为了把这些定时器和 Bluetooth 协议规范、其他 Profile 中的定时器区分开GAP 中的定时器会使用下面这种命名格式T_GAP(nnn)其中nnn表示具体编号或名称。你可以理解为凡是看到 T_GAP(...)就知道这是 GAP 规范里定义的定时器。例如后面如果看到类似T_GAP(100) T_GAP(conn) T_GAP(...)你就知道它不是 Link Layer 定时器也不是 HCI 的超时参数而是 GAP 这个 Profile 层定义的一个计时要求。学习时注意GAP 定时器更多是 Profile 层面的行为约束不要直接等同于 Controller 内部的硬件定时器。八、1.2.4 Notation for UUIDs 想表达什么这一节是在说 UUID 的表示规则。原文说The use of « »例如 «Device Name»表示 Bluetooth SIG 定义的 UUID。也就是说当你在规范中看到这种格式«Device Name» «Appearance» «Peripheral Preferred Connection Parameters»它表示的是这是 Bluetooth SIG 已经定义好的 UUID 对应的名称。例如«Device Name»不是普通文字而是指 GAP Service 里面的 Device Name Characteristic。在 BLE GATT 里很多标准服务和特征都是 Bluetooth SIG 定义的 UUID。比如Generic Access Service Device Name Appearance Peripheral Preferred Connection Parameters Central Address Resolution这些都有 SIG 分配的 UUID。所以你看到«Device Name»应该理解为这是一个标准蓝牙 UUID 对应的规范名称不是厂商自定义字段。九、1.3 GAP requirements 想表达什么这一节是在说明不同 Core Configuration需要阅读和遵守 GAP 的不同章节。表格是关键。它把蓝牙核心配置分成三类BR/EDR LE BR/EDR/LE然后说明每类配置适用哪些 GAP 章节。十、表 1.2 的核心含义1. BR/EDR 设备适用哪些章节表格中写的是BR/EDR1 to 8, 12, 15 to 17, Appendices A and B意思是如果设备只实现经典蓝牙 BR/EDR那么 GAP 中适用于它的章节是第 1 到第 8 章第 12 章第 15 到第 17 章附录 A 和 B。如果现在主要学 BLE这一行不是重点。2. LE 设备适用哪些章节表格中写的是LE1 to 3, 9 to 12, 15 to 17, Appendices A and B这最重要。意思是如果设备是 LE-only也就是只支持 BLE那么 GAP 中适用于它的章节是第 1 到第 3 章第 9 到第 12 章第 15 到第 17 章附录 A 和 B。后面读 GAP 时如果主要研究 BLE可以重点看这些章节。尤其是1 到 3基础说明、术语、通用要求 9 到 12LE 相关的 GAP 内容 15 到 17后续通用要求 Appendix A/B附录也就是说对于 BLE 学习来说第 9 到第 12 章通常会比第 4 到第 8 章更重要。因为第 4 到第 8 章更偏 BR/EDR。3. BR/EDR/LE 双模设备适用哪些章节表格中写的是BR/EDR/LEAll意思是如果设备同时支持经典蓝牙和低功耗蓝牙那么 GAP 的所有章节都适用。例如手机通常就是双模设备。手机既支持经典蓝牙音频、SPP、传统 HID也支持BLE 广播、扫描、连接、GATT 通信。所以双模设备需要同时考虑 BR/EDR 和 LE 的 GAP 要求。十一、这里最关键的信息总结这部分最关键的信息有 4 个。关键点 1流程图箭头不是随便画的后面看到 GAP 的流程图时要看清楚箭头方向谁发起、谁发送给谁 实线/虚线必选还是可选 PROC/MSG流程还是消息 单向/双向是否限定发起方这是读懂 GAP 流程图的基础。关键点 2虚线表示 optional虚线表示可选步骤或可选消息。这意味着看到虚线不要认为所有设备都会实现看到虚线不要认为每次流程都会出现要结合角色、功能支持情况、安全等级、设备配置来判断。关键点 3«xxx»表示 Bluetooth SIG 定义的 UUID比如«Device Name»不是普通字符串而是标准 UUID 名称。这对后面理解 GAP Service、Device Name、Appearance 很重要。关键点 4主要学 BLE应重点看 LE 对应章节从表 1.2 来看如果现在主要研究 BLE那么应该重点关注1 to 3 9 to 12 15 to 17 Appendices A and B其中第 9 到第 12 章是后面最应该投入精力的部分。第 4 到第 8 章如果主要是 BR/EDR 内容可以暂时不用深挖。由于我优先把蓝牙 LE 先掌握清楚所以后面只拆解1 to 39 to 1215 to 17Appendices A and B