HCI 功能规范【4.8. Versioned events】

📅 2026/7/5 13:36:18
HCI 功能规范【4.8. Versioned events】
这部分是4.8 Versioned events讲的是如果同一个 HCI Event 存在多个版本那么 Controller 在生成这个事件时应该使用“自己支持并且当前已启用”的最新版本。这一节很短但它解释了一个很重要的兼容规则同一个事件可能随着蓝牙规范版本演进而出现 v1、v2、v3 等不同版本Controller 不一定总是使用最老版本也不一定使用绝对最新版本而是使用“支持 已启用”的最新版本。1. 这部分整体表述了哪些知识这部分主要表达 3 个知识点1. 有些 HCI Event 不只有一个版本。 2. 当 Controller 需要生成这个事件时应选择最新的可用版本。 3. 这个“最新版本”必须同时满足两个条件 - Controller 支持这个版本 - 这个版本对应的 event mask 已经启用也就是 unmasked。核心逻辑是事件有多个版本 ↓ Controller 不能随便选 ↓ 要选自己支持且 Host 已启用的最新版本2. 什么是 Versioned eventsVersioned events可以理解为带版本的 HCI Event也就是说同一个事件随着蓝牙规范发展可能出现多个版本。例如早期版本的事件参数较少后续版本为了支持新特性可能增加字段或调整表达能力。可以理解为某事件 v1早期格式参数较少 某事件 v2后续格式参数更多能表达更多信息 某事件 v3更新格式支持更新特性注意这里不是说事件名字一定完全一样有些事件可能是同类事件的增强版本或扩展版本。3. 为什么 HCI Event 会有多个版本蓝牙规范一直在演进新的蓝牙版本会增加新能力例如扩展广播 周期广播 LE 2M PHY LE Coded PHY 更丰富的连接信息 ISO / LE Audio 更多同步信息老版本事件的参数可能不够表达新能力所以需要新的事件版本。例如早期 BLE 连接完成事件可能只需要表达基本连接信息后来如果需要表达更多 PHY、地址、增强连接参数等信息就可能需要增强版事件。这类设计的目的不是推翻旧事件而是为了兼容老 Host、老 Controller同时让新 Host、新 Controller 能使用更丰富的信息。4. Controller 应该使用哪个版本原文说the Controller shall use the latest version that is both supported and enabled意思是Controller 应该使用“同时被支持并且已启用”的最新版本。这里有两个条件supported enabled两个都满足才行。4.1 supportedController 支持该事件版本supported表示 Controller 自己具备生成这个事件版本的能力。例如Controller 只支持事件 v1 Controller 支持事件 v1 和 v2 Controller 支持事件 v1、v2、v3如果 Controller 根本不支持 v3那么即使 Host 希望使用 v3Controller 也不能生成 v3。4.2 enabled / unmaskedHost 已经通过 event mask 启用该事件enabled的意思是这个事件没有被 mask 掉也就是处于unmasked状态。HCI 中有一些 event mask用来控制 Controller 哪些事件可以上报给 Host。如果某个事件被 mask 掉Controller 即使支持它也不应该上报。可以理解为event mask 事件开关表 unmasked 这个事件允许上报 masked 这个事件被屏蔽不允许上报所以 Controller 选择事件版本时不仅要看自己支不支持还要看 Host 是否启用了对应事件。5. “latest version that is both supported and enabled” 怎么理解假设某个事件有 3 个版本Event v1 Event v2 Event v3Controller 支持v1、v2、v3但 Host 只启用了v1、v2那么 Controller 应该生成v2因为 v3 虽然 Controller 支持但没有被 Host 启用。再举一个例子Controller 只支持v1、v2Host 启用了v1、v2、v3那么 Controller 也只能生成v2因为 v3 虽然 Host 启用了但 Controller 不支持。再举一个例子Controller 支持v1、v2、v3Host 启用了v1、v3如果规范允许这种独立 mask 情况那么 Controller 应该选择v3因为它是同时 supported 和 enabled 的最新版本。6. event mask 在这里为什么重要HCI Event 不是 Controller 想上报什么就一定上报什么。Host 可以通过 event mask 控制事件上报范围。这样做有几个目的减少 Host 不关心的事件 避免 Host 收到自己不能解析的事件 兼容旧 Host 让 Host 明确选择使用哪个事件版本比如一个旧 Host 只能解析旧版本事件如果 Controller 直接上报新版本事件Host 可能解析失败。所以 Host 通过 event mask 告诉 Controller哪些事件我允许你上报 哪些事件你不要上报这就是为什么 versioned events 需要同时看Controller 支持能力 Host event mask 设置7. masked 和 unmasked 是什么意思在 HCI 语境里masked 被屏蔽 unmasked 没有被屏蔽也就是已启用如果某个 event 被 maskedController 不应把这个 event 上报给 Host如果某个 event 被 unmaskedController 可以把这个 event 上报给 Host所以原文中的enabled (“unmasked”) in the relevant event mask意思是在相关 event mask 中这个事件已经被启用也就是没有被屏蔽。8. 为什么要用最新版本如果 Host 和 Controller 都支持并启用了较新的事件版本Controller 应该使用最新版本因为新版本通常包含更多信息能更好表达新特性。例如旧事件只能表达基本结果 新事件能表达更多地址信息、PHY 信息、同步信息、扩展参数这样 Host 就能获得更完整的数据。但是不能无条件使用最新版本因为要防止 Host 不支持或未启用该版本。所以规则不是永远用最新版本而是用 supported enabled 范围内的最新版本9. 这部分和蓝牙版本兼容有什么关系这一节本质上是一个兼容性规则。蓝牙产品中常见组合是新 Controller 旧 Host 旧 Controller 新 Host Host 和 Controller 支持版本不同如果没有 versioned events 规则就可能出现Controller 上报了 Host 不能解析的新事件 Host 启用了新事件但 Controller 不支持 同一个事件新旧版本同时出现造成混乱所以规范要求 Controller 根据“支持 启用”来选择事件版本。这可以保证Host 不会收到自己没有启用的事件版本 Controller 不会生成自己不支持的事件版本 在可用范围内尽量使用信息最完整的新版本10. 对 BLE 学习的实际意义对 BLE 学习来说这部分主要影响 HCI log 分析。当你看到某个事件时要意识到同类事件可能有老版本和新版本 Controller 实际上报哪个版本取决于 Controller 支持什么 Host 通过 event mask 启用了什么所以不同手机、不同蓝牙芯片、不同系统版本上HCI log 里看到的事件可能不完全一样。例如某些设备可能上报旧事件LE Connection Complete而另一些设备可能上报增强版事件LE Enhanced Connection Complete这并不一定代表业务流程不同可能只是 Host/Controller 支持能力和 event mask 配置不同。11. 学习时要注意什么看 HCI 事件时不要只记一个事件名要注意它可能有版本或增强形式。建议形成这样的查阅习惯1. 先看这个事件有没有多个版本。 2. 再看 Controller 是否支持对应版本。 3. 再看 Host 是否通过 event mask 启用了对应事件。 4. 最后看实际 HCI log 中 Controller 上报的是哪个版本。如果分析 HCI log 时发现“规范里还有一个更新事件但日志里没有出现”可能原因是Controller 不支持 Host 没有启用 当前场景不触发 相关 event mask 没打开 系统蓝牙栈选择了兼容旧事件12. 这部分关键信息总结12.1 有些 HCI Event 有多个版本这些事件随着蓝牙规范演进可能出现旧版本、新版本、增强版本。12.2 Controller 生成事件时要选择合适版本选择规则是使用 Controller 支持并且 Host 已启用的最新版本。12.3 supported 和 enabled 都必须满足supportedController 支持该事件版本 enabled / unmaskedHost 通过 event mask 允许该事件上报缺一不可。12.4 event mask 是 Host 控制事件上报的机制Host 通过 event mask 告诉 Controller哪些事件可以上报 哪些事件不要上报12.5 新版本事件通常携带更多信息如果 Host 和 Controller 都支持并启用新版本Controller 应该使用新版本。12.6 不同设备上看到不同事件版本是正常的这可能由 Controller 能力、Host 协议栈版本、event mask 配置共同决定。13. 最核心的一句话这一节可以总结为Versioned events 的核心规则是如果某个 HCI Event 存在多个版本Controller 在生成该事件时应使用自己支持并且 Host 已通过 event mask 启用的最新版本这样既能尽量使用新版本事件携带更多信息又能避免上报 Host 没有启用或无法处理的事件版本。对 BLE 学习来说最重要的是同一个 BLE 流程在不同手机、不同 Controller、不同系统版本上HCI log 中看到的事件版本可能不同分析时要结合 Controller 支持能力和 event mask 配置来看不能只按一个固定事件名理解。