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 保留。
0x00000000 00000100 保留。
0x00000000 00000200 保留。
0x00000000 00000400 控制器支持 HCI_VS_MSFT_LE_Monitor_Advertisement [v2]。 此外,控制器支持使用 HCI_VS_MSFT_LE_Monitor_Advertisement [v2] 对与其他无线电活动并发执行的 LE 播发的持续播发监视。
0xFFFFFFFF FFFFF800 为将来的定义保留的位。 必须为零。

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 时控制器上的转换状态。

State diagram showing transition states on the controller when monitoring RSSI for a connection.

当接收到的 RSSI 大于或等于指定的 RSSI_threshold_high 时,控制器应生成 HCI_VS_MSFT_Rssi_Event。 生成此事件后,控制器不应生成新的 HCI_VS_MSFT_Rssi_Event,以指定已超出 RSSI_threshold_high,直到生成一个用来指定 RSSI 已降至低于 RSSI_threshold_lowHCI_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_highHCI_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_highRSSI_threshold_lowRSSI_threshold_low_time_intervalRSSI_sampling_period 参数值。

此状态图显示了监视播发的 RSSI 时控制器上的转换状态。

State diagram showing transition states for HCI_VS_MSFT_LE_Monitor_Advertisement.

仅当接收到的 RSSI 大于或等于特定设备的 RSSI_threshold_highMonitor_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_intervalRSSI_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 中存在的模式数以及模式数据。

Diagram illustrating the pattern condition data layout for HCI_VS_MSFT_LE_Monitor_Advertisement.

模式数 指定需要匹配的模式数。

模式数据 具有以下格式。

  • 长度 指定此模式的长度包括数据类型和模式的起始字节。
  • 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_ADDRMonitor_handle 指定的设备。
0x01 控制器已开始监视由 BD_ADDRMonitor_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 秒

Graph showing advertisement monitoring with RSSI values over time.

播发 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,控制器就可以以不同的方式实现此逻辑。

Flowchart that shows Microsoft HCI extension filtering process.

序列图:传播与播发关联的扫描响应

序列图:传播与播发关联的扫描响应

此序列图显示了一个传播扫描响应,该响应与启用活动扫描时满足播发筛选器的播发相关联。 此图仅显示了控制器和主机之间的预期事件序列,而不显示控制器和特定设备之间的事件。 假设有一个满足播发筛选器的播发 A,还有一个不满足播发筛选器的播发 B

Sequence diagram that shows HCI propagate scan response associated with advertisement.