
这部分是 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 events
Versioned 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 supported:Controller 支持该事件版本
supported 表示 Controller 自己具备生成这个事件版本的能力。
例如:
Controller 只支持事件 v1
Controller 支持事件 v1 和 v2
Controller 支持事件 v1、v2、v3
如果 Controller 根本不支持 v3,那么即使 Host 希望使用 v3,Controller 也不能生成 v3。
4.2 enabled / unmasked:Host 已经通过 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 v3
Controller 支持:
v1、v2、v3
但 Host 只启用了:
v1、v2
那么 Controller 应该生成:
v2
因为 v3 虽然 Controller 支持,但没有被 Host 启用。
再举一个例子:
Controller 只支持:
v1、v2
Host 启用了:
v1、v2、v3
那么 Controller 也只能生成:
v2
因为 v3 虽然 Host 启用了,但 Controller 不支持。
再举一个例子:
Controller 支持:
v1、v2、v3
Host 启用了:
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 被 masked:
Controller 不应把这个 event 上报给 Host
如果某个 event 被 unmasked:
Controller 可以把这个 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 都必须满足
supported:Controller 支持该事件版本
enabled / unmasked:Host 通过 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 配置来看,不能只按一个固定事件名理解。