Microsoft 定义的蓝牙 HCI 扩展
蓝牙主机控制器接口 (HCI) 指定主机和蓝牙无线电控制器之间的所有交互。 蓝牙规范允许供应商定义的 HCI 命令和事件在主机和控制器之间启用非标准化交互。 Microsoft 定义了 Windows 使用的特定于供应商的 HCI 命令和事件。 蓝牙控制器实现者可以使用这些扩展来实现特殊功能。
要求
蓝牙 HCI 命令由 16 位命令代码标识。 蓝牙组织定义 0x0000 到 0xFBFF 范围内的值。 供应商定义范围 0xFC00 至 0xFFFF 中的值,允许 1024 个不同的供应商分配的命令代码。
供应商必须选择 Microsoft 定义的命令代码的值。 Microsoft 无法选择命令代码,并假定没有其他供应商将代码用于冲突目的。 发出特定于供应商的命令是不安全的,如果控制器不了解该命令,则由它拒绝该命令。 控制器可以将命令解释为破坏性操作,例如更新控制器的固件。
供应商必须通过控制器以外的方法传达所选值。 Microsoft 未指定如何获取所选代码。
通知 Windows 蓝牙堆栈供应商特定的命令代码
Windows 蓝牙堆栈从注册表项 VsMsftOpCode
中读取供应商特定的命令代码。
VsMsftOpCode
注册表项具有 REG_DWORD 类型,键数据是供应商特定的操作码。
若要指定供应商特定的操作码,请使用驱动程序 INF 中 DDInstall.HW 节下的 AddReg
指令。 add registry 节应包含:
HKR,,"VsMsftOpCode",0x00010001,<Vendor Specific Opcode>
示例:
[radio.NTamd64.HW]
AddReg=radio.NTamd64.HW.AddReg
[radio.NTamd64.HW.AddReg]
HKR,,"VsMsftOpCode",0x00010001,<Vendor Specific Opcode>
Microsoft 定义的 HCI 命令
HCI 命令 | 说明 |
---|---|
HCI_VS_MSFT_Read_Supported_Features | 提供一个位图,用来描述控制器支持哪些 Microsoft 定义功能,并指定控制器返回的 Microsoft 定义的事件的前缀。 |
HCI_VS_MSFT_Monitor_Rssi | 请求控制器开始监视所指定连接的测量链接 RSSI,并在连接的测量链接 RSSI 超出指定边界时生成事件。 |
HCI_VS_MSFT_Cancel_Monitor_Rssi | 取消以前发出的 HCI_VS_MSFT_Monitor_Rssi 命令。 |
HCI_VS_MSFT_LE_Monitor_Advertisement | 请求控制器开始监视属于指定 RSSI 范围内的播发并满足其他要求。 |
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement | 取消以前发出的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令。 |
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable | 设置播发筛选器的状态。 |
HCI_VS_MSFT_Read_Absolute_RSSI | 从控制器读取 BR/EDR 连接的绝对接收信号强度指示 (RSSI) 值。 |
Microsoft 定义的 HCI 命令和子命令
控制器了解只有一个特定于 Microsoft 的 HCI 命令。 特定于 Microsoft 的命令集是使用操作码扩展的。 Microsoft 定义的 HCI 命令的第一个命令参数是指定子命令的操作码。
控制器必须支持 HCI_VS_MSFT_Read_Supported_Features 才能支持任何其他 Microsoft HCI 子命令。 对其他命令的支持是可选的,取决于 HCI_VS_MSFT_Read_Supported_Features 返回的值。 除非控制器通过响应 HCI_VS_MSFT_Read_Supported_Features 指示对 Microsoft 定义的子命令的支持,否则 Windows 不会发送任何子命令。
HCI_VS_MSFT_Read_Supported_Features
HCI_VS_MSFT_Read_Supported_Features 提供了一个位图,用于描述控制器支持哪些 Microsoft 定义的功能,并指定控制器返回的 Microsoft 定义的事件的前缀。
控制器应始终使用 Command Completed 事件及时完成此命令。
命令 | 代码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_VS_MSFT_Read_Supported_Features | 所选基本代码 | Subcommand_opcode | 状态, Subcommand_opcode, Supported_features, Microsoft_event_prefix_length, Microsoft_event_prefix |
Command_parameters
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | HCI_VS_MSFT_Read_Supported_Features 的子命令操作码。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01 至 0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | HCI_VS_MSFT_Read_Supported_Features 的子命令操作码。 |
Supported_features(8 个八进制数):
值 | 参数说明 |
---|---|
0x00000000 00000001 | 控制器支持 BR/EDR 连接的 RSSI 监视功能。 此外,控制器还支持 HCI_VS_MSFT_Read_Absolute_RSSI 读取 BR/EDR 连接的绝对 RSSI 指标。 |
0x00000000 00000002 | 控制器支持 LE 连接的 RSSI 监视功能。 |
0x00000000 00000004 | 控制器支持 LE 旧播发的 RSSI 监视。 |
0x00000000 00000008 | 控制器支持 LE 旧版播发的播发监视。 |
0x00000000 00000010 | 控制器支持在 P-192 和 P-256 的安全简单配对过程中验证曲线上公共 X 和 Y 坐标的有效性。 有关详细信息,请参阅蓝牙核心规范 Erratum 10734。 |
0x00000000 00000020 | 控制器支持使用 HCI_VS_MSFT_LE_Monitor_Advertisement [v1] 对与其他无线电活动并发执行的 LE 播发的持续播发监视。 |
0x00000000 00000040 | 保留。 |
0x00000000 00000080 | 控制器支持 AVDTP 卸载和本文档中描述的 HCI_VS_MSFT_Avdtp_* 命令。 |
0x00000000 00000100 | 保留。 |
0x00000000 00000200 | 保留。 |
0x00000000 00000400 | 控制器支持 HCI_VS_MSFT_LE_Monitor_Advertisement [v2]。 此外,控制器支持使用 HCI_VS_MSFT_LE_Monitor_Advertisement [v2] 对与其他无线电活动并发执行的 LE 播发的持续播发监视。 |
0xFFFFFFFF FFFFFF00 | 为将来的定义保留的位。 必须为零。 |
Microsoft_event_prefix_length(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 到 0x20 | 返回的 Microsoft_event_prefix 中指定的 Microsoft 事件前缀字段中的字节数。 这是每个 Microsoft 指定的 HCI 事件开头的常量信息的字节数。 |
Microsoft_event_prefix(可变长度):
值 | 参数说明 |
---|---|
事件前缀值 | 每个 Microsoft 定义的事件开始时预期的常量信息。 此信息用于区分 Microsoft 定义的事件与其他自定义事件。 |
HCI_VS_MSFT_Monitor_Rssi
HCI_VS_MSFT_Monitor_Rssi 会请求控制器开始监视指定连接的测量链接 RSSI,并在连接的测量链接 RSSI 超出指定边界时生成事件。
命令 | 代码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_VS_MSFT_Monitor_Rssi | 所选基本代码 | Subcommand_opcode, 连接句柄, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period |
状态, Subcommand_opcode |
控制器应通过定期生成的事件(基于 RSSI_sampling_period)向主机通知 RSSI 值。 测量的链接 RSSI 应是 BR/EDR 连接的绝对接收方信号强度值(以 dBm 为单位)。
为了响应 HCI_VS_MSFT_Monitor_Rssi 命令,如果控制器可以开始监视,则应生成一个 Command Complete 事件;否则生成非零状态。 如果状态值为非零,则控制器不应生成 HCI_VS_MSFT_Rssi_Event 以响应此命令。
如果具有相同 Connection_Handle 的另一个 HCI_VS_MSFT_Monitor_Rssi 命令未完成,或者指定的连接句柄无效,则控制器应拒绝该命令。 控制器也可能出于其他原因(如资源耗尽)拒绝该命令。
此状态图显示了监视连接的 RSSI 时控制器上的转换状态。
当接收到的 RSSI 大于或等于指定的 RSSI_threshold_high 时,控制器应生成 HCI_VS_MSFT_Rssi_Event。 生成此事件后,控制器不应生成新的 HCI_VS_MSFT_Rssi_Event,以指定已超出 RSSI_threshold_high,直到生成一个用来指定 RSSI 已降至低于 RSSI_threshold_low 的 HCI_VS_MSFT_Rssi_Event 为止。
当接收到的 RSSI 等于或低于指定 RSSI_threshold_low_time_interval 内的指定 RSSI_threshold_low 时,控制器应生成 HCI_VS_MSFT_Rssi_Event。 生成此事件后,控制器不应生成新的 HCI_VS_MSFT_Rssi_Event,以指定 RSSI 已降至低于 RSSI_threshold_low,直到生成了用来指定已达到或超过 RSSI_threshold_high 的 HCI_VS_MSFT_Rssi_Event 事件为止。
如果 RSSI_sampling_period 介于 0x01 和 0xFE 之间,则控制器应定期每 RSSI_sampling_period 生成一个 HCI_VS_MSFT_Rssi_Event。 此事件应包含根据 RSSI_sampling_period 计算得出的 RSSI 的平均值。 如果 RSSI_sampling_period 为 0x00 或 0xFF,控制器不应通过 HCI_VS_MSFT_Rssi_Event 定期向主机发出通知。
Command_parameters
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x01 | HCI_VS_MSFT_Monitor_Rssi 的子命令操作码。 |
Connection_Handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 必须监视其 RSSI 的连接的句柄。 |
RSSI_threshold_high(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | 预期的最大 RSSI 值。 如果观察到的 RSSI 大于或等于此值,控制器将生成事件。 单位:dBm BR/EDR 范围:-128 到 127(带符号整数) LE 范围:-127 到 20(带符号整数) |
RSSI_threshold_low(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | 预期的最小 RSSI 值。 如果观察到的 RSSI 小于或等于此值,控制器将生成事件。 单位:dBm BR/EDR 强制范围:-128 到 127(带符号整数) LE 强制范围:-127 到 20(带符号整数) |
RSSI_threshold_low_time_interval(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 保留值。 |
N = 0xXX | 在生成 HCI_VS_MSFT_Rssi_Event 之前,RSSI 值应低于 RSSI_threshold_low 的时间(以秒为单位)。 时间段 = N * 1 秒 强制范围:0x01 到 0x3C |
RSSI_sampling_period(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 保留值。 |
N = 0xXX | 采样间隔(以毫秒为单位)。 时间段 = N * 100 毫秒 强制范围:0x01 到 0xFE |
0xFF | 保留值。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01 至 0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
0x07 | 如果控制器没有足够的内存来处理命令,则控制器应返回超出内存容量。 |
错误代码 | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x01 | HCI_VS_MSFT_Monitor_Rssi 的子命令操作码。 |
生成的事件(除非屏蔽掉)
收到 HCI_VS_MSFT_Monitor_Rssi 命令时,控制器应立即生成 Command Complete 事件。 如果 Command Complete 事件返回状态为 0,当发生下列情况之一时,控制器应生成 HCI_VS_MSFT_Rssi_Event。
- 设备在 RSSI_threshold_low_time_interval 观察到的 RSSI 等于或小于指定的 RSSI_threshold_low 值。
- 设备的观察到的 RSSI 大于或等于指定的 RSSI_threshold_high 值。
- RSSI_sampling_period 有效,采样期已过。
如果与指定设备的连接丢中断,控制器应执行所有必要的清理。 在这种情况下,不会向控制器发送 HCI_VS_MSFT_Cancel_Monitor_Rssi 命令。
HCI_VS_MSFT_Cancel_Monitor_Rssi
HCI_VS_MSFT_Cancel_Monitor_Rssi 会取消以前发出的 HCI_VS_MSFT_Monitor_Rssi 命令。 控制器应立即生成 Command Completed 事件,以响应此命令。
命令 | 代码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_VS_MSFT_Cancel_Monitor_Rssi | 所选基本代码 | Subcommand_opcode, 连接句柄 |
状态, Subcommand_opcode |
Command_parameters
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x02 | HCI_VS_MSFT_Cancel_Monitor_Rssi 的子命令操作码。 |
Connection_Handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 必须取消其 RSSI 的连接的句柄。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01 至 0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x02 | HCI_VS_MSFT_Cancel_Monitor_Rssi 的子命令操作码。 |
生成的事件(除非屏蔽掉)
收到 HCI_VS_MSFT_Cancel_Monitor_RSSI 命令时,控制器应生成 Command Complete 事件。
HCI_VS_MSFT_LE_Monitor_Advertisement
HCI_VS_MSFT_LE_Monitor_Advertisement 会请求控制器开始监视属于指定 RSSI 范围且满足以下条件之一的播发:
- 指定的模式可以匹配收到的播发数据包。
- 指定的 UUID 可以匹配收到的播发数据包。
- 指定的标识解析键 (IRK) 可用于解析播发数据包源自的设备专用地址。
- 指定的蓝牙地址可以匹配收到的播发数据包。
v2 命令允许主机将上述一些条件与管理播发源和定向播发目标的选项相结合,以进一步优化监视哪些播发。 v2 命令还允许主机筛选受监视播发会导致控制器生成播发报告。
命令 | 代码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_VS_MSFT_LE_Monitor_Advertisement [v2] | 所选基本代码 | Subcommand_opcode_v2, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period, Monitor_options, Advertisement_report_filtering_options, Peer_device_address, Peer_device_address_type, Peer_device_IRK, Condition_type, <条件参数> |
状态, Subcommand_opcode, Monitor_Handle |
HCI_VS_MSFT_LE_Monitor_Advertisement [v1] | 所选基本代码 | Subcommand_opcode_v1, RSSI_threshold_high, RSSI_threshold_low, RSSI_threshold_low_time_interval, RSSI_sampling_period, Condition_type, <条件参数> |
状态, Subcommand_opcode, Monitor_Handle |
控制器应生成 Command Complete 事件,以响应此命令。 如果控制器可以开始监视,则状态值应设置为零,否则为非零状态。 如果控制器不支持 LE 播发的 RSSI 监视,它应忽略 RSSI_threshold_high、RSSI_threshold_low、RSSI_threshold_low_time_interval 和 RSSI_sampling_period 参数值。
此状态图显示了监视播发的 RSSI 时控制器上的转换状态。
仅当接收到的 RSSI 大于或等于特定设备的 RSSI_threshold_high 且 Monitor_options 匹配时,控制器才开始监视播发(请参阅下文)。 控制器应生成一个 Monitor_state 设置为 1 且 Monitor_handle 设置为此 Condition 的句柄的 HCI_VS_MSFT_LE_Monitor_Device_Event,以向主机通知控制器正在监视此特定设备的 Condition。 此外,控制器应仅在 Advertisement_report_filter_options 匹配时,才将受监视播发的第一个播发报告传播到主机(请参阅下文)。
根据以下逻辑(在伪代码中)将筛选器的 Monitor_options 视为匹配项:
MatchesCondition = (PDU Matches Condition Parameters)
IsAdvAMatch = ((Monitor_options bit 0 is set) && ((AdvA == Peer_device_address) && (TxAdd == Peer_device_address_type))) ||
((Monitor_options bit 1 is set) && (AdvA resolvable with Peer_device_IRK))
IsDirectedAdvAMatch = (TargetA is permitted based on the Scanning Filter Policy) &&
(((Monitor_options bit 2 is set) && ((AdvA == Peer_device_address) && (TxAdd == Peer_device_address_type))) ||
((Monitor_options bit 3 is set) && (AdvA resolvable with Peer_device_IRK)))
IsDirectedTargetAMatch = (Monitor_options bit 4 is set) &&
(TargetA is permitted based on the Scanning Filter Policy)
MonitorOptionsMatch = (MatchesCondition && IsAdvAMatch) ||
IsDirectedAdvAMatch ||
IsDirectedTargetAMatch ||
((Monitor_options bit 5 is set) && MatchesCondition)
对于受监视的播发,Advertisement_report_filter_options 被视为基于以下逻辑(在伪代码中)的匹配项:
IsDuplicateFilterSatisfied = (Advertisement_report_filter_options bit 0 is NOT set || PDU is not a duplicate)
ShouldGenerateLegacyReport = (Advertisement_report_filter_options bit 1 is set) &&
(PDU is Legacy) &&
MonitorOptionsMatch
ShouldGenerateExtendedReport = (Advertisement_report_filter_options bit 2 is set) &&
(PDU is Extended) &&
MonitorOptionsMatch
ShouldGenerateDirectedReport = (Advertisement_report_filter_options bit 3 is set) &&
(PDU is Directed) &&
MonitorOptionsMatch
AdvertisementReportFilterOptionsMatch = IsDuplicateFilterSatisfied &&
(ShouldGenerateLegacyReport || ShouldGenerateExtendedReport || ShouldGenerateDirectedReport)
如果所收到播发的 RSSI 等于或低于特定设备在 RSSI_threshold_low_interval 内的 RSSI_threshold_low,控制器应停止监视 Condition。 控制器应生成 Monitor_state 设置为 0 的 HCI_VS_MSFT_LE_Monitor_Device_Event,以向主机通知控制器已停止监视特定设备的 Condition。 控制器指定 Monitor_state 设置为 0 的 HCI_VS_MSFT_LE_Monitor_Device_Event 后,不得允许更多播发数据包流向设备的主机,直到控制器向主机通知特定设备的 RSSI 已升至或高于 Condition 的特定设备的 RSSI_threshold_high。
此外,控制器应生成 Monitor_state 设置为 0 的 HCI_VS_MSFT_LE_Monitor_Device_Event,以通知主机如果指定的 RSSI_threshold_low_time_interval 过期,则控制器已停止监视设备的 Condition,而不从该设备接收任何播发数据包。 如果控制器正在监视特定条件的设备,则以下陈述是正确的。
如果控制器支持 LE 扩展播发的 RSSI 监视而不采样,当数据包的 RSSI 值大于或等于 RSSI_threshold_high 时,控制器应将匿名播发数据包传播到主机。 不得跟踪匿名播发,且不得生成 HCI_VS_MSFT_LE_Monitor_Device_Event 事件。
如果控制器支持 LE 播发的 RSSI 监视而不采样,则应在收到的播发片段匹配但在未成功接收整个播发的情况下生成截断的播发报告。
控制器应至少支持 30 个同时 Monitor_handles、至少 30 个同时跟踪的设备,以及至少 20 个同时跟踪的重复播发。 控制器还应能够以 10% 的占空比执行连续 LE 扫描。
如果在控制器中启用了地址解析,并且主机打算监视 IRK 已成功存储在控制器解析列表中远程设备,则主机应分别提供远程设备的解析列表条目中的 Peer_Identity_Address 和 Peer_Identity_Address_Type 参数作为 Peer_device_address 和 Peer_device_address_type 参数。
RSSI_sampling_period | 旧版播发 | 扩展播发(非匿名) | 扩展播发(匿名) |
---|---|---|---|
0x00 | 控制器应将所有已接收到的播发数据包传播到此条件的设备的主机,除非控制器之前收到了 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令。 即使接收到的 RSSI 小于或等于 RSSI_threshold_low,只要此 Condition 的特定设备的 RSSI_threshold_low_time_interval 未过期,控制器就会将播发数据包传播到主机。 此播发数据包的 RSSI 值应为收到的播发的 RSSI 值。 | 如果控制器支持对 LE 扩展播发进行 RSSI 监视而不采样,则行为与旧版播发 列中的行为相同,但播发数据包定义为播发链中的所有 PDU 除外。 | 如果控制器支持对 LE 扩展播发进行 RSSI 监视而不进行采样,则应将所有已接收到的播发数据包传播到此 Condition 的设备的主机,除非控制器之前收到了 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令。 |
0x01 至 0xFE | 除非控制器以前收到了 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,否则应按指定的 RSSI_sampling_period 将旧版播发数据包传播到主机。 为播发指定的 RSSI 值应是在此采样间隔期间收到的 RSSI 值的平均值。 如果控制器在采样期间未收到播发数据包,则不应将播发传播到主机。 RSSI_sampling_period 可能小于 RSSI_threshold_low_time_interval,RSSI_sampling_period 期间收到的所有播发的 RSSI 都低于RSSI_threshold_low。 控制器仍应传播播发,并为其指定在此采样间隔期间收到的 RSSI 值的平均值。 | 如果控制器支持在不进行采样的情况下对 LE 扩展播发进行 RSSI 监视,控制器的行为应与 RSSI_sampling_period 为 0x00 时一样。 | 如果控制器支持在不进行采样的情况下对 LE 扩展播发进行 RSSI 监视,控制器的行为应与 RSSI_sampling_period 为 0x00 时一样。 |
0xFF | 控制器不得允许更多播发数据包流向 Condition 的设备的主机,直到控制器已向主机通知特定设备的 RSSI 已在此 Condition 的特定设备的 RSSI_threshold_low_time_interval 内降至低于 RSSI_threshold_low。 此通知是通过生成 Monitor_state 设为 0 的 HCI_VS_MSFT_LE_Monitor_Device_Event 来完成的。 | 如果控制器支持在不进行采样的情况下对 LE 扩展播发进行 RSSI 监视,则行为与旧版播发 列的行为相同。 | 如果控制器支持在不进行采样的情况下对 LE 扩展播发进行 RSSI 监视,控制器的行为应与 RSSI_sampling_period 为 0x00 时一样。 |
如果控制器之前收到了 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,则采样周期计时器不应停止。 有关详细信息,请参见示例:具有采样周期的筛选器上的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable。 如果控制器从同一设备接收非重复播发数据包,则它应根据控制器上存储的条件匹配每个播发数据包。
如果控制器从与多个条件匹配的设备接收到播发数据包,则控制器应为每个匹配的 Condition 生成一个HCI_VS_MSFT_LE_Monitor_Device_Event,并将 Monitor_handle 设置为匹配的 Condition。
如果控制器无法监视范围内与 Condition 匹配的所有设备的 RSSI 值,则它会监视尽可能多的设备。 应监视哪些设备的决定取决于收到的播发的 RSSI 值。 控制器应监视接收到的信号强度较大的设备。
如果控制器已向主机通知特定设备 (A),并且它正在监视处于最大硬件容量的设备,如果另一台设备 (B) 进入具有更高 RSSI 值的范围,则控制器应通过生成 Monitor_state 设为 0 的 HCI_VS_MSFT_LE_Monitor_Device_Event 来通知主机它已停止监视设备 (A)。 控制器还应生成一个 Monitor_state 设为 1 的 HCI_VS_MSFT_LE_Monitor_Device_Event,以向主机通知设备 (B) 正在受到监视。
条件类型和条件参数
Condition_type参数指定 Condition 参数是指定模式、UUID、IRK 还是 BD_ADDR。
如果 Condition_type 参数指定模式,则 Condition 包含两个部分,其中包含 Condition 中存在的模式数以及模式数据。
模式数 指定需要匹配的模式数。
模式数据 具有以下格式。
- 长度 指定此模式的长度包括数据类型和模式的起始字节。
- AD 类型 指定 AD 类型字段。
- 模式的开头 指定紧跟 AD 类型的模式起始字节位置。
- 模式 的大小为 (Length - 0x2),并且是根据指定初始字节在播发数据包中为指定 AD 类型匹配的模式。
如果指定了多个模式,控制器应确保至少有一个模式与收到的播发匹配。
如果控制器支持在不采样的情况下对 LE 扩展播发进行 RSSI 监视:
控制器应查找主机播发数据的前 251 个八进制数中的模式,并可能查找主机播发数据的所有剩余八进制数。 如果 AD 节超出了主机播发数据的前 251 个八进制数,则控制器应查找位于主机播发数据前 251 个八进制数的 AD 节内的模式,并可能查找主机播发数据的所有其余八进制数。 注意:根据通告者的碎片,主机播发数据的前 251 个八进制数可以扩展到多个播发 PDU 的 AdvData 中。 扫描器应注意限制其遵循的 AuxPtrs 数量,以避免跟踪过长的 PDU 链。
控制器应基于每个播发集对每个设备地址进行跟踪。 即使播发来自同一设备地址,控制器也应传播与模式匹配的每个播发集的 HCI_VS_MSFT_LE_Monitor_Device_Event。
如果 Condition_type 参数指定 UUID,则 Condition 参数包含 UUID 类型和 UUID。 UUID 类型指定 UUID 是 16 位、32 位还是 128 位。 控制器应分析要为指定的 UUID 检查的播发数据包的服务 UUID。 如果 UUID 类型定义为 0x01,则控制器应分析 16 位服务 UUID 的不完整列表,以及服务 UUID AD 类型中指定的 16 位服务 UUID 的完整列表。 如果 UUID 类型定义为 0x02,则控制器应分析 32 位服务 UUID 的不完整列表,以及服务 UUID AD 类型中指定的 32 位 UUID 的完整列表。 如果 UUID 类型定义为 0x03,则控制器应分析 128 位服务 UUID 的不完整列表,以及服务 UUID AD 类型中指定的 128 位服务 UUID 的完整列表。
如果控制器支持在不采样的情况下对 LE 扩展播发进行 RSSI 监视:
控制器应查找主机播发数据的前 251 个八进制数中服务 UUID,并可能查找主机播发数据的所有其余八进制数。 如果 AD 节超出了主机播发数据的前 251 个八进制数,则控制器应查找位于主机播发数据前 251 个八进制数的 AD 节内的服务 UUID,并可能查找主机播发数据的所有其余八进制数。 注意:根据通告者的碎片,主机播发数据的前 251 个八进制数可以跨越多个播发 PDU 的 AdvData。 扫描器应注意限制其遵循的 AuxPtrs 数量,以避免跟踪过长的 PDU 链。
控制器应基于每个播发集对每个设备地址进行跟踪。 即使播发来自同一设备,控制器也应传播与服务 UUID 匹配的每个播发集的 HCI_VS_MSFT_LE_Monitor_Device_Event。
如果 Condition_type 参数指定了 IRK,则 Condition 参数包含 IRK。
如果 Condition_type 参数指定了蓝牙地址,则 Condition 参数包含地址类型和 BD_ADDR。
即使启用了扫描(主动或被动),控制器也应根据条件保持监视。 启用主动扫描后,应将与筛选器匹配的播发扫描响应传播到主机。
如果控制器在禁用筛选器时收到 HCI_VS_MSFT_LE_Monitor_Advertisement 命令(由于以前收到了 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令),控制器应接受命令(如果可以)但将其设置为禁用状态。 控制器也可能出于其他原因(如资源耗尽)拒绝该命令。
如果 Monitor_options 的所有位都已清除,控制器应返回错误代码 Invalid HCI Command Parameters (0x12)。
如果设置了 Monitor_options 的第 1 位或第 3 位,并且 Peer_device_IRK 设置为无效的 IRK,或者未设置 Monitor_options 的任何位,控制器应返回错误代码 Invalid HCI Command Parameters (0x12)。
如果设置了 Monitor_options 的第 0 位、第 1 位、第 2 位或第 3 位,并且 Condition_type 设置为 0x03 或 0x04,则控制器应返回错误代码 Invalid HCI Command Parameters (0x12)。
如果设置了 Advertisement_report_filter_options 的第 0 位,并且 RSSI_sampling_period 是除 0x00 以外的任何值,控制器应返回错误代码 Invalid HCI Command Parameters (0x12)。
缺少参数
发出不包含所有参数的此命令版本时,应使用以下表:
参数 | 值 |
---|---|
Monitor_options | 设置第 5 位;清除所有其他位 |
Advertisement_report_filter_options | 设置第 1 和第 2 位;清除所有其他位 |
Peer_device_IRK | 0x0000000000000000 0000000000000000 |
Peer_device_address | 0x000000000000 |
Peer_device_address_type | 0x00 |
Command_parameters
Subcommand_opcode_v1(1 个八进制数):
值 | 参数说明 |
---|---|
0x03 | HCI_VS_MSFT_LE_Monitor_Advertisement [v1] 的子命令操作码。 |
Subcommand_opcode_v2(1 个八进制数):
值 | 参数说明 |
---|---|
0x0F | HCI_VS_MSFT_LE_Monitor_Advertisement [v2] 的子命令操作码。 |
RSSI_threshold_high(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | 预期的最大 RSSI 值。 如果观察到的 RSSI 大于或等于此值,控制器将生成事件。 单位:dBm 强制范围:-127 到 20(带符号整数) |
RSSI_threshold_low(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | 预期的最小 RSSI 值。 如果观察到的 RSSI 小于或等于此值,控制器将生成事件。 单位:dBm 强制范围:-127 到 20(带符号整数) |
RSSI_threshold_low_time_interval(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 保留值。 |
N = 0xXX | 在生成 HCI_VS_MSFT_Rssi_Event 之前,RSSI 值应低于 RSSI_threshold_low 的时间(以秒为单位) 时间段 = N * 1 秒 强制范围:0x01 到 0x3C。 |
RSSI_sampling_period(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 控制器应将所有收到的播发传播到主机。 |
N = 0xXX | 采样间隔(以毫秒为单位)。 时间段 = N * 100 毫秒。 强制范围:0x01 到 0xFE |
0xFF | 控制器不应将接收的任何播发传播到主机。 |
Monitor_options(1 个八进制数):
位号 | 参数说明 |
---|---|
0 | 控制器应监控 AdvA 或其解析的标识地址与 Peer_device_address 和 Peer_device_address_type 相匹配且 TargetA 不存在的播发 PDU,或者,若 TargetA 存在,如果这些 PDU 与 Condition_Type 中指定的条件相匹配,则根据扫描过滤策略允许 TargetA 存在。 |
1 | 控制器应监控 AdvA 可通过 Peer_device_IRK 解析且 TargetA 不存在的播发 PDU,或者若 TargetA 存在,如果这些 PDU 符合 Condition_Type 中指定的条件,则根据扫描过滤策略允许 TargetA。 如果在控制器中使用链接层隐私,则不应设置此位。 |
2 | 控制器应监控定向播发 PDU,其中根据扫描过滤策略允许 TargetA 且 AdvA 或其解析的标识地址与 Peer_device_address 和 Peer_device_address_type 匹配。 无论 PDU 是否与 Condition_Type 中指定的条件匹配,都是如此。 |
3 | 控制器应监视定向播发 PDU,其中根据扫描筛选器策略允许 TargetA 且 AdvA 可通过 Peer_device_IRK 解析。 无论 PDU 是否与 Condition_Type 中指定的条件匹配,都是如此。 如果在控制器中使用链接层隐私,则不应设置此位。 |
4 | 控制器应监视根据扫描筛选器策略允许 TargetA 的定向播发 PDU,无论 Peer_device_address、Peer_device_address_type 或 Peer_device_IRK 的值为何,以及 PDU 是否与 Condition_Type 中指定的条件匹配。 |
5 | 控制器应监视任何 AdvA 中的播发 PDU(若 TargetA 不存在),或者应监视根据扫描筛选器策略允许的 TargetA(若 TargetA 存在),前提是这些 PDU 与 Condition_Type 中指定的条件匹配。 |
所有其他位 | 预留供以后使用 |
Advertisement_report_filtering_options(1 个八进制数):
位号 | 参数说明 |
---|---|
0 | 筛选重复播发 PDU。 仅当 RSSI_sampling_period 为 0x00 时,才应设置此位。 |
1 | 控制器应为旧版播发 PDU 生成 HCI_LE_Advertising_Report 事件、HCI_LE_Directed_Advertising_Report 事件或 HCI_LE_Extended_Advertising_Report 事件(如果这些 PDU 与指定的 Monitor_options 匹配)。 |
2 | 控制器应为扩展播发 PDU 生成 HCI_LE_Extended_Advertising_Report 事件(如果这些 PDU 与指定的 Monitor_options 匹配)。 |
3 | 控制器应为定向播发 PDU 生成 HCI_LE_Advertising_Report 事件、HCI_LE_Directed_Advertising_Report 事件或 HCI_LE_Extended_Advertising_Report 事件(如果这些 PDU 与指定的 Monitor_options 匹配)。 |
所有其他位 | 预留供以后使用 |
Peer_device_address(6 个八进制数):
值 | 参数说明 |
---|---|
0xXXXXXXXXXXXX | 要匹配的公共设备地址或随机设备地址。 |
Peer_device_address_type(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 公共设备地址 |
0x01 | 随机设备地址 |
所有其他值 | 预留供以后使用 |
Peer_device_IRK(16 个八进制数):
值 | 参数说明 |
---|---|
0x0000000000000000 0000000000000000 | IRK 无效。 设置 Monitor_options 位 1 或设置 Monitor_options 位 3 时,不应为此值。 |
0xXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX | 要匹配的设备 IRK。 应填充 Peer_device_address 和 Peer_device_address_type。 |
Condition_type(1 个八进制数):
值 | 参数说明 |
---|---|
0x01 | 条件是必须在播发上匹配的模式。 |
0x02 | 条件为 UUID 类型和 UUID。 |
0x03 | 条件是 IRK 的解析。 如果设置了任何 Monitor_options 位 0、1、2 或 3,则排除。 |
0x04 | 条件是蓝牙地址类型和蓝牙地址。 如果设置了任何 Monitor_options 位 0、1、2 或 3,则排除。 |
条件:条件的适用字段取决于 Condition_type 的值。 有关详细信息,请参阅“Condition_type 和条件参数”部分。
Number_of_patterns(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | Pattern_data 参数中指定的模式数。 |
Pattern_data(>3 个八进制数):
值 | 参数说明 |
---|---|
长度 | 此模式的长度。 |
数据类型 | 播发节的数据类型。 这些值列在蓝牙分配号码文档中。 |
起始字节 | 要为指定的数据类型匹配的模式的起始位置。 |
模式 | 要匹配的模式(长度大小 - 0x2 字节)。 |
UUID_type(1 个八进制数):
值 | 参数说明 |
---|---|
0x01 | UUID 是一个 16 位服务。 |
0x02 | UUID 是一个 32 位服务。 |
0x03 | UUID 是一个 128 位服务。 |
UUID(2、4 或 16 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 如果 UUID_type 为 0x01,则为 2 个字节。 如果 UUID_type 为 0x02,则为 4 个字节。 如果 UUID_type 为 0x03,则为 16 个字节。 |
IRK(16 个八进制数):
值 | 参数说明 |
---|---|
0xXXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX | 用于解析专用地址的 IRK。 |
Address_type(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 公共设备地址。 |
0x01 | 随机设备地址。 |
0x02 至 0xFF | 保留值供将来使用。 |
BD_ADDR(6 个八进制数):
值 | 参数说明 |
---|---|
0xXXXXXXXXXXXX | 要监视的设备的蓝牙地址。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x07 | 如果控制器没有足够的内存来处理命令,则控制器应返回超出内存容量。 |
错误代码 | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x03 或 0x0F | HCI_VS_MSFT_LE_Monitor_Advertisement [v1] 或 HCI_VS_MSFT_LE_Monitor_Advertisement [v2] 的子命令操作码,具体取决于提交的命令。 |
Monitor_handle(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 至 0xFF | 此规则的句柄。 此句柄用作 HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement 取消监视播发的参数。 仅当状态 0x00 时,此参数才有效。 |
生成的事件(除非屏蔽掉)
收到 HCI_VS_MSFT_LE_Monitor_Advertisement 命令时,控制器应生成 Command Complete 事件。
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement 会取消以前发出的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令。
命令 | 代码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement | 所选基本代码 | Subcommand_opcode, Monitor_handle |
状态, Subcommand_opcode |
控制器应立即生成 Command Completed 事件,以响应此命令。
Command_parameters
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x04 | HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement 的子命令操作码。 |
Connection_Handle(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | 要取消的筛选器的句柄。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x07 | 如果控制器没有足够的内存来处理命令,则控制器应返回超出内存容量。 |
错误代码 | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x04 | HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement 的子命令操作码。 |
生成的事件(除非屏蔽掉)
收到 HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement 命令时,控制器应生成 Command Complete 事件。
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 会设置播发筛选器的状态。
命令 | 代码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable | 所选基本代码 | Subcommand_opcode, 启用 |
状态, Subcommand_opcode |
如果 Enable 设置为 0x00,则控制器应根据现有的筛选器接受列表设置将收到的播发传播到主机。 如果设备不再受到监视,控制器应继续监视当前正在监视的设备,并生成 Monitor_state 设为 0 的 HCI_VS_MSFT_LE_Monitor_Device_Event。 如果监视新设备,控制器应生成 Monitor_state 设为 1 的 HCI_VS_MSFT_LE_Monitor_Device_Event。 主机可能会发出 Enable 设为 0x01 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 以重新启用所有筛选条件。
如果 Enable 设为 0x01,则此命令将启用使用以前发出的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令设置的所有筛选器。 如果控制器未切换筛选器状态,则应拒绝 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令:
- 如果控制器以前收到了 Enable 设为 0x01 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,则应拒绝 Enable 设为 0x01 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令。
- 如果控制器以前收到了 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令,则应拒绝 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令。
播发筛选器的默认状态应处于关闭状态。 此状态等效于控制器之前收到了 Enable 设为 0x00 的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令。 控制器应立即生成 Command Completed 事件,以响应此命令。
Command_parameters
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x05 | HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 的子命令操作码。 |
Enable(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 还原到当前筛选器接受列表行为,但根据 HCI_VS_MSFT_LE_Monitor_Advertisement 命令中的 Condition 继续监视设备。 |
0x01 | 在控制器上启用所有发出的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令。 |
Return_parameter
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x0C | 如果控制器拒绝该命令(因为它之前看到了一个 Enable 所设值为与此命令相同的 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令),则应返回 Command Disallowed。 |
错误代码 | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x05 | HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 的子命令操作码。 |
生成的事件(除非屏蔽掉)
收到 HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable 命令时,控制器应生成 Command Complete 事件。
HCI_VS_MSFT_Read_Absolute_RSSI
HCI_VS_MSFT_Read_Absolute_RSSI 从控制器读取 BR/EDR 连接的绝对接收信号强度指示 (RSSI) 值。
命令 | 代码 | 命令参数 | 返回参数 |
---|---|---|---|
HCI_VS_MSFT_Read_Absolute_RSSI | 所选基本代码 | Subcommand_opcode, 连接句柄 |
状态, Subcommand_opcode, 连接句柄, RSSI |
连接句柄作为命令和返回参数提供,用于标识正在读取其 RSSI 的 ACL 连接。 RSSI 指标是以 dBm 为单位的绝对接收器信号强度,精度可达 ± 6 dB。 如果无法读取 RSSI,则 RSSI 指标应设置为 127。 控制器应始终使用 Command Completed 事件及时完成此命令。
Command_parameters
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x06 | HCI_VS_MSFT_Read_Absolute_RSSI 的子命令操作码。 |
Connection_Handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 必须读取其 RSSI 的 BR/EDR 连接的句柄。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01 至 0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x06 | HCI_VS_MSFT_Read_Absolute_RSSI 的子命令操作码。 |
Connection_Handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 读取了其 RSSI 的 BR/EDR 连接的句柄。 |
RSSI(1 个八进制数):
值 | 参数说明 |
---|---|
N = 0xXX | BR/EDR 连接的 RSSI 值。 单位:dBm 强制范围:-128 到 127(带符号整数) |
生成的事件(除非屏蔽掉)
当 HCI_VS_MSFT_Read_Absolute_RSSI 命令已完成时,控制器应生成 Command Complete 事件。
Microsoft 定义的蓝牙 HCI 事件
所有 Microsoft 定义的蓝牙 HCI 事件都是供应商定义的事件,并使用事件代码 0xFF。 Microsoft 事件的事件数据始终以常量字节字符串开头,以区分 Microsoft 定义的事件与其他供应商定义的事件。 常量字符串的长度和值由控制器实现者定义,并返回以响应 HCI_VS_MSFT_Read_Supported_Features。
HCI 事件 | 说明 |
---|---|
HCI_VS_MSFT_Rssi_Event | HCI_VS_MSFT_RSSI_Event 指示 HCI_VS_MSFT_Monitor_Rssi 命令已完成。 |
HCI_VS_MSFT_LE_Monitor_Device_Event | HCI_VS_MSFT_LE_Monitor_Device_Event 指示控制器已启动或停止监视蓝牙 LE 设备。 |
HCI_VS_MSFT_RSSI_Event
HCI_VS_MSFT_RSSI_Event 指示 HCI_VS_MSFT_Monitor_Rssi 命令已完成。 如果 Status 参数为零,则命令已完成,因为远程设备的 RSSI 值已更改为指定范围之外的值。 如果 Status 参数为非零,则命令已完成,因为无法再监视连接的 RSSI 值。
事件 | 事件代码 | Microsoft 事件代码 | 事件参数 |
---|---|---|---|
HCI_VS_MSFT_RSSI_Event | 0xFF | 0x01 | Event_prefix, Microsoft_event_code, 状态, 连接句柄, RSSI |
Event_parameters
Event_prefix(可变大小):
值 | 参数说明 |
---|---|
事件前缀 | 将此事件标记为 Microsoft 定义的事件前缀。 大小和值由 HCI_VS_MSFT_Read_Supported_Features 命令返回。 |
Microsoft_event_code(1 个八进制数):
值 | 参数说明 |
---|---|
0x01 | HCI_VS_MSFT_RSSI_Event 的事件代码。 |
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 成功。 连接的 RSSI 值满足以下条件之一。 RSSI 达到或超过 RSSI_threshold_high。 RSSI 在 RSSI_threshold_low_time_interval 秒内达到或降至 RSSI_threshold_low 以下。 RSSI_sampling_period 已过期,并生成了此事件以向主机通知 RSSI 值。 |
0x01 至 0xFF | 失败。 无法再监视连接的 RSSI 值。 错误代码通常是描述基础 ACL 连接中断的原因的代码之一。 |
Connection_Handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 要监视其 RSSI 的连接的句柄。 |
RSSI(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | 连接的测量链接 RSSI 值。 单位:dBm BR/EDR 范围:-128 到 127(带符号整数) LE 范围:-127 到 20(带符号整数) |
HCI_VS_MSFT_LE_Monitor_Device_Event
HCI_VS_MSFT_LE_Monitor_Device_Event 指示控制器已启动或停止监视蓝牙 LE 设备。
如果 Monitor_state 参数值为 1,控制器已开始使用指定的 BD_ADDR 监视蓝牙设备。 如果 Monitor_state 参数值为 0,控制器已停止使用指定的 BD_ADDR 监视蓝牙设备。
事件 | 事件代码 | Microsoft 事件代码 | 事件参数 |
---|---|---|---|
HCI_VS_MSFT_LE_Monitor_Device_Event | 0xFF | 0x02 | Event_prefix, Microsoft_event_code, Address_type, BD_ADDR, Monitor_handle, Monitor_state |
如果控制器尚未生成 Monitor_state 参数设为 1 的 HCI_VS_MSFT_LE_Monitor_Device_Event,则它尚未生成 Monitor_state 设为 0 的 HCI_VS_MSFT_LE_Monitor_Device_Event。
Event_parameters
Event_prefix(可变大小):
值 | 参数说明 |
---|---|
事件前缀 | 将此事件标记为 Microsoft 定义的事件前缀。 大小和值由 HCI_VS_MSFT_Read_Supported_Features 命令返回。 |
Microsoft_event_code(1 个八进制数):
值 | 参数说明 |
---|---|
0x02 | HCI_VS_MSFT_LE_Monitor_Device_Event 的事件代码。 |
Address_type(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 公共设备地址。 |
0x01 | 随机设备地址。 |
0x02 至 0xFF | 保留值供将来使用。 |
BD_ADDR(6 个八进制数):
值 | 参数说明 |
---|---|
0xXXXXXXXXXXXX | 设备的蓝牙地址。 |
Monitor_handle(1 个八进制数):
值 | 参数说明 |
---|---|
0xXX | 为 HCI_VS_MSFT_LE_Monitor_Advertisement 命令指定的筛选器的句柄。 |
Monitor_state(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 控制器停止监视由 BD_ADDR 和 Monitor_handle 指定的设备。 |
0x01 | 控制器已开始监视由 BD_ADDR 和 Monitor_handle 指定的设备。 |
Microsoft 定义的 AVDTP HCI 命令
以下 AVDTP HCI 命令为音频边带 A2DP 卸载提供支持。 有关详细信息,请参阅音频边带 A2DP 卸载。
HCI AVDTP 命令 | 说明 |
---|---|
HCI_VS_MSFT_Avdtp_Capabilities_Configuration | 配置音频传输接口并返回蓝牙控制器的编解码器功能,即编解码器信息块的列表。 |
HCI_VS_MSFT_Avdtp_Open | 在控制器中分配和配置 AVDTP 卸载资源。 |
HCI_VS_MSFT_Avdtp_Start | 开始从音频传输接口到传输的 AVDTP 媒体数据包的音频流式处理。 |
HCI_VS_MSFT_Avdtp_Suspend | 停止由 HCI_VS_MSFT_Avdtp_Start 启动的流式处理活动。 |
HCI_VS_MSFT_Avdtp_Close | 释放由 HCI_VS_MSFT_Avdtp_Open 分配的 AVDTP 卸载资源。 |
HCI_VS_MSFT_Avdtp_Capabilities_Configuration
HCI_VS_MSFT_Avdtp_Capabilities_Configuration 配置音频传输接口并返回蓝牙控制器的编解码器功能,即编解码器信息块列表。 每个编解码器信息块描述一个支持的编解码器。
下面的一些参数是具有可变长度的结构数组,因此假定所有这些参数仍适合一个 HCI 命令和一个相应的 HCI 事件。
Command_parameters
External_codec_count(1 个八进制数):
值 | 参数说明 |
---|---|
0x00-0xFF | 跟随的 Codec_capability 块的计数。 |
External_codec_capability(可变长度):
值 | 参数说明 |
---|---|
编解码器功能块 | 编解码器功能信息块,如编解码器功能信息中所述。 这描述附加到音频接口的设备支持的单个编解码器。 |
此数据结构重复 External_codec_count 次。
Audio_interface_parameter_count(1 个八进制数):
值 | 参数说明 |
---|---|
0x00-0xFF | 跟随的 Audio_interface_parameters 计数。 |
Audio_interface_parameter(可变长度)
值 | 参数说明 |
---|---|
音频接口参数 | 音频接口参数(如上所述)由连接到音频接口的设备设置。 |
此数据结构重复 Audio_interface_parameter_count 次。
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode _(1 个八进制数):
值 | 参数说明 |
---|---|
0x07 | HCI_VS_MSFT_Avdtp_Capabilities_Configuration 的子命令操作码。 |
Internal_codec_count(1 个八进制数):
值 | 参数说明 |
---|---|
0x00-0xFF | 跟随的 Internal_codec_capability 块的计数。 |
Internal_codec_capability(可变长度):
值 | 参数说明 |
---|---|
编解码器功能块 | 音频边带 A2DP 卸载中所述的编解码器功能信息块。 这描述蓝牙控制器支持的单个编解码器。 |
此数据结构重复 Internal_codec_count 次。
Audio_interface_parameter_count(1 个八进制数):
值 | 参数说明 |
---|---|
0x00-0xFF | 跟随的 Audio_interface_parameters 计数。 |
Audio_interface_parameter(可变长度)
值 | 参数说明 |
---|---|
音频接口参数 | 音频接口参数(如上所述)。 主机软件将此参数传递给连接到音频接口的设备。 |
此数据结构重复 Audio_interface_parameter_count 次。
HCI_VS_MSFT_Avdtp_Open
在控制器中分配和配置 AVDTP 卸载资源。
下面的一些参数是具有可变长度的结构数组,因此假定所有这些参数仍适合一个 HCI 命令和一个相应的 HCI 事件。
Command_parameters
Connection_handle(2 个八进制数)
值 | 参数说明 |
---|---|
0xXXXX | 标识连接到远程设备的 AVDTP 媒体 L2CAP 通道。 |
L2cap_destination_cid(2 个八进制数)
值 | 参数说明 |
---|---|
0xXXXX | AVDTP 媒体通道的 L2CAP 目标 CID |
L2cap_mtu(2 个八进制数)
值 | 参数说明 |
---|---|
0xXXXX | L2CAP AVDTP 媒体通道 MTU |
Configured_codec_capability(可变长度):
值 | 参数说明 |
---|---|
编解码器功能块 | 音频边带 A2DP 卸载中所述的编解码器功能信息块。 这描述为 AVDTP 媒体配置的编解码器。 |
Audio_interface_parameter_count(1 个八进制数):
值 | 参数说明 |
---|---|
0x00-0xFF | 跟随的 Audio_interface_parameters 计数。 |
Audio_interface_parameter(可变长度)
值 | 参数说明 |
---|---|
音频接口参数 | 音频接口参数(如上所述)。 连接到音频接口的设备为特定流实例指定这些参数。 |
此数据结构重复 Audio_interface_parameter_count 次。
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x08 | HCI_VS_MSFT_Avdtp_Open 的子命令操作码。 |
Avdtp_offload_handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 标识为卸载流分配的资源。 |
Audio_interface_parameter_count(1 个八进制数):
值 | 参数说明 |
---|---|
0x00-0xFF | 跟随的 Audio_interface_parameters 计数。 |
Audio_interface_parameter(可变长度)
值 | 参数说明 |
---|---|
音频接口参数 | 音频接口参数(如上所述)。 主机软件将此参数传递给连接到流实例音频接口的设备。 |
此数据结构重复 Audio_interface_parameter_count 次。
HCI_VS_MSFT_Avdtp_Start
此命令开始从音频传输接口到传输的 AVDTP 媒体数据包的音频流式处理。 执行此命令后,蓝牙控制器将开始以下活动。
- 从音频传输接口接收音频数据
- 如果编码器位于蓝牙控制器中,则对从音频传输接口接收的数据进行编码以生成编码帧
- 如果编码器位于音频 DSP 中,请从音频传输接口中提取编码帧
- 将编码帧组合到 AVDTP 媒体有效负载中
- 构造和传输包含媒体有效负载的 AVDTP 媒体数据包
Command_parameters
Avdtp_offload_handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 标识为卸载流分配的资源。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x09 | HCI_VS_MSFT_Avdtp_Start 的子命令操作码。 |
HCI_VS_MSFT_Avdtp_Suspend
停止由 HCI_VS_MSFT_Avdtp_Start 启动的流式处理活动。
Command_parameters
Avdtp_offload_handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 标识为卸载流分配的资源 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x0A | HCI_VS_MSFT_Avdtp_Suspend 的子命令操作码。 |
HCI_VS_MSFT_Avdtp_Close
释放由 HCI_VS_MSFT_Avdtp_Open 分配的 AVDTP 卸载资源。
Command_parameters
Avdtp_offload_handle(2 个八进制数):
值 | 参数说明 |
---|---|
0xXXXX | 注意:此命令完成后,此值不再有效。 |
Return_parameters
状态(1 个八进制数):
值 | 参数说明 |
---|---|
0x00 | 命令成功。 |
0x01-0xFF | 命令失败。 有关详细信息,请参阅蓝牙核心规范中的错误代码。 |
Subcommand_opcode(1 个八进制数):
值 | 参数说明 |
---|---|
0x0B | HCI_VS_MSFT_Avdtp_Close 的子命令操作码。 |
值 | 参数说明 |
---|---|
0x00 | |
0x01 | 控制器已开始监视由 BD_ADDR 和 Monitor_handle 指定的设备。 |
附录
本节包含 Microsoft 定义的蓝牙 HCI 扩展示例和关系图。
示例:HCI_VS_MSFT_LE_Monitor_Advertisement 的匹配模式
此示例显示了收到的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令,以及针对命令参数对三个不同播发数据包的计算。
接收的 HCI_VS_MSFT_LE_Monitor_Advertisement 命令控制器接收到 HCI_VS_MSFT_LE_Monitor_Advertisement 命令,该命令包含以下参数。
参数 | 值 | 备注 |
---|---|---|
Subcommand_opcode | 0x03 | HCI_VS_MSFT_LE_Monitor_Advertisement 的子命令操作码 |
RSSI_threshold_high | 0x01 | 1dB |
RSSI_threshold_low | 0xCE | -50dB |
RSSI_threshold_low_time_interval | 0x05 | 5 秒 |
RSSI_sampling_period | 0xFF | 无需采样 |
Condition_type | 0x01 | 条件 |
条件 | 0x02 | 应匹配两种模式 |
0x03 | 第一个模式的长度,包括 AD 类型和起始位置 | |
0x01 | AD 类型 | |
0x00 | AD 类型后面的起始位置 | |
0x01 | 要匹配的第一个模式 | |
0x06 | 第二个模式的长度,包括 AD 类型和起始位置 | |
0xFF | AD 类型(制造商特定数据) | |
0x00 | AD 类型后面的起始位置 | |
0x00 | 要匹配的第二种模式 | |
0x06 | ||
0xFF | ||
0xFF |
然后,控制器会收到以下播发数据包。
播发数据包 [A]
0x02 0x01 0x01 0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x05 0xFF 0x00 0x06 0xFF 0xFF
播发数据包 [B]
0x02 0x01 0x01 0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x04 0xFF 0x00 0x06 0xFF
播发数据包 [C]
0x07 0x09 0x54 0x61 0x62 0x6C 0x65 0x74 0x05 0xFF 0x00 0x06 0xFF 0xFF
播发数据包 [D]
0x02 0x01 0x02 0x05 0xFF 0x00 0x06 0xFF 0x01
评估播发数据包 [A] 的匹配
说明 | 值 |
---|---|
要匹配的第一个模式的 AD 类型 | 0x01 |
要匹配的第一个模式的长度 | 0x03 - 0x02 = 0x01 字节 |
要在 AD 类型 0x01 的位置 0x00 匹配的模式 | 0x01 |
AD 类型 0x01 的位置 0x00 字节数 | 0x01 (MATCH!) |
要匹配的第二种模式的 AD 类型 | 0xFF(制造商特定数据) |
要匹配的第二个模式的长度 | 0x06 - 0x02 = 0x04 字节 |
要在 AD 类型 0xFF 的位置 0x00 匹配的模式 | 0x00 0x06 0xFF 0xFF |
AD 类型 0xFF 的位置 0x00 字节数 | 0x00 0x06 0xFF 0xFF (MATCH!) |
裁定:PASS(两种模式匹配)
评估播发数据包 [B] 的匹配
说明 | 值 |
---|---|
要匹配的第一个模式的 AD 类型 | 0x01 |
要匹配的第一个模式的长度 | 0x03 - 0x02 = 0x01 字节 |
要在 AD 类型 0x01 的位置 0x00 匹配的模式 | 0x01 |
AD 类型 0x01 的位置 0x00 字节数 | 0x01 (MATCH!) |
要匹配的第二种模式的 AD 类型 | 0xFF(制造商特定数据) |
要匹配的第二个模式的长度 | 0x06 - 0x02 = 0x04 字节 |
要在 AD 类型 0xFF 的位置 0x00 匹配的模式 | 0x00 0x06 0xFF 0xFF |
AD 类型 0xFF 的位置 0x00 字节数 | 0x00 0x06 0xFF(无匹配) |
裁定:PASS(仅第一个模式匹配)
评估播发数据包 [C] 的匹配
说明 | 值 |
---|---|
要匹配的第一个模式的 AD 类型 | 0x01 |
要匹配的第一个模式的长度 | 0x03 - 0x02 = 0x01 字节 |
要在 AD 类型 0x01 的位置 0x00 匹配的模式 | 0x01 |
AD 类型 0x01 的位置 0x00 字节数 | Undefined。 播发没有 AD 类型 0x01 的数据。 |
要匹配的第二种模式的 AD 类型 | 0xFF(制造商特定数据) |
要匹配的第二个模式的长度 | 0x06 - 0x02 = 0x04 字节 |
要在 AD 类型 0xFF 的位置 0x00 匹配的模式 | 0x00 0x06 0xFF 0xFF |
AD 类型 0xFF 的位置 0x00 字节数 | 0x00 0x06 0xFF 0xFF (MATCH!) |
裁定:PASS(仅第二个模式匹配)
评估播发数据包 [D] 的匹配
说明 | 值 |
---|---|
要匹配的第一个模式的 AD 类型 | 0x01 |
要匹配的第一个模式的长度 | 0x03 - 0x02 = 0x01 字节 |
要在 AD 类型 0x01 的位置 0x00 匹配的模式 | 0x01 |
AD 类型 0x01 的位置 0x00 字节数 | 0x02(无匹配) |
要匹配的第二种模式的 AD 类型 | 0xFF(制造商特定数据) |
要匹配的第二个模式的长度 | 0x06 - 0x02 = 0x04 字节 |
要在 AD 类型 0xFF 的位置 0x00 匹配的模式 | 0x00 0x06 0xFF 0xFF |
AD 类型 0xFF 的位置 0x00 字节数 | 0x00 0x06 0xFF 0x01(无匹配) |
裁定:FAIL(两种模式都不匹配)
示例:播发监视
此示例演示了 RSSI 播发监视。 下面显示了与指定条件匹配的已接收播发的 RSSI 值。
时间(秒) | RSSI (dB) |
---|---|
1 | -100 |
2 | -90 |
3 | -5 |
4 | 15- |
5 | -30 |
6 | 15- |
7 | -45 |
8 | 20- |
9 | 35- |
10 | -45 |
11 | 70- |
12 | -85 |
13 | -85 |
14 | -85 |
15 | -90 |
16 | -90 |
17 | 70- |
参数 | 值 |
---|---|
RSSI_threshold_high | -10dB |
RSSI_threshold_low | -80dB |
RSSI_threshold_low_time_interval | 3 秒 |
RSSI_sampling_period | 2 秒 |
播发 RSSI 在 3 时大于 RSSI_threshold_high。 采样的定期计时器从 3 秒开始。 每隔 2 秒,定期计时器过期一次,接收到播发的平均 RSSI 值将传播到堆栈。
当定期计时器在 5 秒过期时,在此期间 (-23dB) 收到的播发 RSSI 的平均值将传播到堆栈。
当定期计时器在 13 秒过期时,在此时间范围内收到的播发 RSSI 的平均时间低于 RSSI_threshold_low (-80dB)。 播发 RSSI (-85 dB) 的平均值应传播到主机。
当 RSSI_threshold_low_time_interval 在 15 秒过期时,播发将传播到 RSSI 为 -85dB 的主机。 在此示例中,不会向主机发送更多播发。
示例:监视来自设备的 BAP 公告
虽然与 CAP 接受器绑定而未连接,但主机可以监视来自该设备的 BAP 公告。
参数 | 值 |
---|---|
Subcommand_opcode_v2 | 0x0F |
RSSI_threshold_high | -127 |
RSSI_threshold_low | -127 |
RSSI_threshold_low_time_interval | 0x05 |
RSSI_sampling_period | 0x00 |
Monitor_options | 设置位 0;如果设备分发了 IRK,则设置位 1 |
Advertisement_report_filtering_options | 设置位 0、1 和 2 |
Peer_device_address | <address> |
Peer_device_address_type | <地址类型> |
Peer_device_IRK | <如果设置了位 1,则为 IRK> |
Condition_type | 0x01 |
Number_of_patterns | 0x01 |
Pattern_data | 0x04(长度) 0x16(服务数据 – 16 位 UUID) 0x00(起始字节) 0x4E(ASCS UUID 的低字节) 0x18(ASCS UUID 的高字节) |
示例:监视来自设备的 CAP 公告
虽然与 CAP Commander 绑定而未连接,但主机可以监视来自该设备的 CAP 公告。
参数 | 值 |
---|---|
Subcommand_opcode_v2 | 0x0F |
RSSI_threshold_high | -127 |
RSSI_threshold_low | -127 |
RSSI_threshold_low_time_interval | 0x05 |
RSSI_sampling_period | 0x00 |
Monitor_options | 设置位 0;如果设备分发了 IRK,则设置位 1 |
Advertisement_report_filtering_options | 设置位 0、1 和 2 |
Peer_device_address | <address> |
Peer_device_address_type | <地址类型> |
Peer_device_IRK | <如果设置了位 1,则为 IRK> |
Condition_type | 0x01 |
Number_of_patterns | 0x01 |
Pattern_data | 0x04(长度) 0x16(服务数据 – 16 位 UUID) 0x00(起始字节) 0x53(CAS UUID 的低字节) 0x18(CAS UUID 的高字节) |
流程图:播发和筛选接受列表筛选
此流程图提供了收到播发时播发筛选和筛选接受列表筛选的示例控制器实现。
只要主机收到播发通知或流程图指定的 HCI_VS_MSFT_LE_Monitor_Device_Event,控制器就可以以不同的方式实现此逻辑。
序列图:传播与播发关联的扫描响应
序列图:传播与播发关联的扫描响应
此序列图显示了一个传播扫描响应,该响应与启用活动扫描时满足播发筛选器的播发相关联。 此图仅显示了控制器和主机之间的预期事件序列,而不显示控制器和特定设备之间的事件。 假设有一个满足播发筛选器的播发 A,还有一个不满足播发筛选器的播发 B。