
HCI_LE_Set_Extended_Scan_Parameters 命令是低功耗蓝牙(Bluetooth Low Energy, BLE)核心规范中定义的一个HCI(Host Controller Interface)命令,用于设置BLE设备的扩展扫描参数。扩展扫描参数允许设备在扫描过程中有更多的灵活性和配置选项,相比传统扫描参数提供了更广泛的扫描能力和性能。
HCI_LE_Set_Extended_Scan_Parameters 命令用于设置BLE设备在广播物理通道上使用的扩展扫描参数。这些参数决定了设备在扫描过程中如何接收和处理广播数据包。

BLUETOOTH CORE SPECIFICATION Version 5.4 | Vol 4, Part E page 2481
使用场景:该命令通常用于BLE设备发现、低功耗扫描以及特定设备过滤等场景。通过调整扫描参数,设备可以根据实际需求平衡扫描性能和功耗。
HCI_LE_Set_Extended_Scan_Parameters命令是BLE设备在进行扫描操作时的重要配置命令,它允许设备根据实际需求灵活设置扫描参数,以实现高效的设备发现和数据接收。
HCI_LE_Set_Extended_Scan_Parameters 命令的格式遵循蓝牙核心规范中定义的HCI(Host Controller Interface)命令结构。

以下是该命令的详细格式:
字段 | 大小(字节) | 描述 |
|---|---|---|
Opcode | 2 | 命令的操作码 |
Own_Address_Type | 1 | 扫描时使用的设备地址类型。 |
Scanning_Filter_Policy | 1 | 扫描过滤策略,决定哪些广播包会被接受。 |
Extended Parameters(可选,根据实现) | 可变 | 包含了更详细的扫描参数,如Scanning_PHYs等(注意:这部分是可选的,并且具体字段可能因蓝牙规范版本和设备实现而异)。但在此基本格式中,我们主要关注前四个字段,因为它们是必需的。然而,为了完整性,我提到了可能存在的扩展参数。 |
Scan_Type (对于每个PHY) | 1 或多个(根据PHY数量) | 每个物理层(PHY)对应的扫描类型。如果是多PHY扫描,则此字段会重复多次,每次对应一个PHY。但基本格式中通常只考虑一个PHY的情况。 |
Scan_Interval (对于每个PHY) | 2 或多个(根据PHY数量) | 每个物理层(PHY)对应的扫描间隔,以0.625毫秒为单位。如果是多PHY扫描,则此字段会重复多次。 |
Scan_Window (对于每个PHY) | 2 或多个(根据PHY数量) | 每个物理层(PHY)对应的扫描窗口,以0.625毫秒为单位。如果是多PHY扫描,则此字段会重复多次。 |
HCI_LE_Set_Extended_Scan_Parameters命令的基本组成部分。然而,在某些蓝牙规范版本或特定设备实现中,可能会引入额外的“扩展参数”字段,特别是当支持多PHY扫描时。
HCI_LE_Set_Extended_Scan_Parameters命令的实际长度可能会超过上述基本格式所示的长度。为了确定命令的确切长度,设备制造商通常会提供详细的规范或文档。
在实际应用中,发送
HCI_LE_Set_Extended_Scan_Parameters命令之前,建议查阅设备制造商提供的具体文档或规范,以确保正确理解和使用该命令。
HCI_LE_Set_Extended_Scan_Parameters命令的参数共同决定了设备的扫描行为和性能。因此,在设置这些参数时,需要仔细考虑它们之间的相互作用和影响。
在HCI_LE_Set_Extended_Scan_Parameters命令中,Own_Address_Type参数用于指定扫描过程中设备使用的地址类型。这一参数对于BLE设备在进行扫描操作时非常重要,因为它决定了设备如何标识自己以及它如何响应接收到的广播包。

需要注意的是,
Own_Address_Type参数的选择应基于设备的应用场景、安全性和隐私保护需求。在某些情况下,使用随机地址可能更为合适,因为它提供了更高的隐私保护级别。而在其他情况下,使用公共地址可能更为方便,因为它允许其他设备更容易地识别和连接设备。

Scanning_PHYs参数用于指示在主广播物理信道上接收广播数据包时应使用的物理层(PHY)。蓝牙设备的主机(Host)可以选择启用一个或多个扫描PHY。这个参数通过设置一个或多个位(bit)来指定哪些物理层被启用。
Scanning_PHYs参数中的某个位被预留用于未来使用(即当前不被任何已知的物理层所使用),那么当主机尝试启用这个未支持的物理层时,控制器(Controller)应该返回一个错误代码,表明这是一个不支持的特性或参数值(Unsupported Feature or Parameter Value,错误码0x11)。

参数数组的顺序和数量:
Scan_Type[i]、Scan_Interval[i]和Scan_Window[i]这三个参数数组的元素顺序应该与Scanning_PHYs参数中设置的位的顺序相同,从位0开始。这意味着,如果Scanning_PHYs的第0位被设置,那么Scan_Type[0]、Scan_Interval[0]和Scan_Window[0]将对应于这个启用的物理层。
Scanning_PHYs参数中设置的位的数量决定。如果Scanning_PHYs中有两个位被设置,那么每个参数数组都将有两个元素,分别对应于这两个启用的物理层。
Scanning_PHYs参数是BLE中用于配置设备在主广播物理信道上接收广播数据包时应使用的物理层的关键参数。通过正确设置这个参数,可以控制蓝牙设备的扫描行为,从而优化设备的性能和用户体验。同时,还需要注意,如果尝试启用不支持的物理层,控制器将返回错误代码,表明这是一个不支持的特性或参数值。
在BLE技术中,扫描类型决定了设备如何监听和响应广播数据包。Scan_Type[i]参数指定了蓝牙设备在进行扫描时应采用的扫描类型。这个参数是数组形式的,其中i表示数组中的元素索引,其数量通常由Scanning_PHYs参数中设置的位的数量决定。

Scan_Type[i]数组的大小。它的大小取决于Scanning_PHYs参数中设置的位的数量(Bits set in Scanning_PHYs),每个这样的位都会对应一个Scan_Type[i]元素。每个元素的大小是1个字节(octet)。 Scan_Type[i]设置为0x00时,设备将执行被动扫描。在被动扫描中,设备仅监听广播信道上的广播数据包,但不会主动发送扫描请求PDUs(协议数据单元)以请求更多信息。这种扫描类型通常用于节省能源,因为它不需要设备发送任何数据。
Scan_Type[i]设置为0x01时,设备将执行主动扫描。在主动扫描中,设备不仅会监听广播数据包,还会在需要时发送扫描请求PDUs以请求广播者提供更多信息。这种扫描类型通常用于获取更详细的设备信息或服务列表。
Scan_Type[i]数组中的每个元素都与Scanning_PHYs参数中设置的一个位相对应。这意味着,如果Scanning_PHYs中有多个位被设置,那么Scan_Type[i]数组中将有相应数量的元素,每个元素都指定了对应物理层上的扫描类型。
Scan_Type[i]参数中的某个值被预留用于未来使用(即当前不被任何已知的扫描类型所使用),那么当尝试使用该值时,蓝牙控制器应该返回一个错误代码,表明这是一个不支持的特性或参数值。
Scan_Type[i]参数是蓝牙技术中用于指定扫描类型的关键参数。通过正确设置这个参数,开发者可以控制蓝牙设备的扫描行为,从而优化设备的性能和用户体验。了解不同的扫描类型及其适用场景对于设计有效的蓝牙应用至关重要。
Scan_Interval[i]参数指定了控制器在两次连续扫描之间的时间间隔(即从控制器开始上一次扫描到它开始下一次在主广播物理通道上扫描的时间间隔)。它决定了扫描的频率。较小的间隔意味着更频繁的扫描,而较大的间隔则意味着扫描不那么频繁。主机通过设置这个参数来建议控制器应该如何平衡扫描的频繁程度和设备的能耗。

Scan_Interval[i]参数的大小。它的大小取决于Scanning_PHYs参数中设置的位的数量(Bits set in Scanning_PHYs)。每个元素的大小是2个字节(octets)。在BLE技术中,扫描窗口是指设备在扫描广播或连接请求时,会监听信道的时间段。Scan_Window[i]参数指定了每次扫描过程中控制器应该监听广播信道的时间长度。它决定了扫描的持续时间。较小的窗口意味着每次扫描时监听的时间较短,而较大的窗口则意味着监听的时间较长。主机通过设置这个参数来建议控制器在每次扫描时应该花费多少时间来监听广播数据包。

Scan_Interval[i]和Scan_Window[i]参数是蓝牙技术中用于控制扫描行为的重要参数。主机通过提供这些建议来指导控制器如何进行扫描,但最终的扫描频率和持续时间取决于控制器的实现。了解这些参数的作用和限制对于设计有效的蓝牙应用至关重要,因为它们决定了设备在扫描过程中监听广播信道的频率和持续时间,直接影响到设备的性能和能耗。
当HCI_LE_Set_Extended_Scan_Parameters命令执行完成后,会生成一个HCI_Command_Complete事件(除非该事件被屏蔽)。这是蓝牙主机控制器接口(HCI)标准中的一个典型流程。这个事件的格式遵循蓝牙核心规范中定义的HCI事件通用格式。

HCI_Command_Complete事件格式以下是针对HCI_LE_Set_Extended_Scan_Parameters命令的一个简化的HCI_Command_Complete事件格式。
Event Code: 0x0E (HCI_Command_Complete event code)
Parameter Length: variable (通常至少为2字节,用于存储返回码和可能的额外数据)
Parameters:
1. Number of HCI Command Packets: 1 byte
- 这通常设置为1,表示完成的是单个命令。
2. Command Opcode: 2 bytes
- 这是已完成的命令的操作码(Opcode),对于`HCI_LE_Set_Extended_Scan_Parameters`命令,这个值应该是该命令的操作码。
3. Return Parameters: variable length
- 这部分包含命令执行的结果。对于`HCI_LE_Set_Extended_Scan_Parameters`命令,它通常包括:
a. Status: 1 byte
- 0x00 表示成功
- 非0值 表示错误,具体错误码需要参考蓝牙核心规范的错误码列表。
b. (可选)其他返回数据:如果有的话,这部分可能包含额外的信息,但`HCI_LE_Set_Extended_Scan_Parameters`命令的完成事件通常不需要额外的返回数据。然而,需要注意的是,虽然上述格式提供了一个通用的框架,但实际的HCI_Command_Complete事件可能会根据蓝牙芯片的具体实现和版本有所不同。特别是,一些芯片可能会在返回参数中包含额外的信息或省略某些部分。
HCI_Command_Complete事件包含命令的返回码,用于指示命令是否成功执行,以及可能的错误信息。

此外,对于HCI_LE_Set_Extended_Scan_Parameters命令,如果命令成功执行,那么蓝牙设备将按照设置的扫描参数开始扫描。如果命令失败,那么蓝牙设备将不会改变其当前的扫描参数,并且可以通过返回的状态码来确定失败的原因。
HCI_LE_Set_Extended_Scan_Parameters命令是BLE技术中的一个重要命令,它允许设备设置扩展扫描参数,以便在扫描过程中更有效地发现其他设备。以下是该命令的执行流程。
HCI_LE_Set_Extended_Scan_Parameters命令之前,设备需要确定扫描窗口(Scan Window)和扫描间隔(Scan Interval)等参数。这些参数定义了设备在扫描过程中的活动时间和休眠时间。HCI_LE_Set_Extended_Scan_Parameters命令的数据包。这包括设置操作码(Opcode)、参数长度(Parameter Length)以及具体的扫描参数值。HCI_LE_Set_Extended_Scan_Parameters命令数据包发送给蓝牙控制器。HCI_Command_Complete事件,用于确认命令是否成功执行。HCI_LE_Set_Extended_Scan_Parameters命令后,会根据命令中的参数设置扫描参数。HCI_Command_Complete事件,并通过HCI层返回给主机部分。这个事件包含了命令的执行结果,即状态码(Status)。HCI_Command_Complete事件后,会解析状态码以确定命令是否成功执行。状态码为0x00表示成功,非0值表示出现错误。HCI_LE_Set_Extended_Scan_Parameters命令成功执行,设备将按照设置的扫描参数开始扫描周围的其他蓝牙设备。以下是一个简化代码示例,用于说明如何执行HCI_LE_Set_Extended_Scan_Parameters命令。请注意,此代码是基于假设的蓝牙协议栈和HCI层接口编写的,并且可能需要根据所使用的具体蓝牙库或SDK进行调整。
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
// 假设的HCI层接口函数声明
bool hci_send_command(uint16_t opcode, const uint8_t *params, uint8_t param_len, uint8_t *status);
void hci_event_callback(uint8_t event_code, const uint8_t *event_data, uint8_t event_len);
// 扫描参数结构体
typedef struct {
uint16_t scan_interval;
uint16_t scan_window;
uint8_t own_address_type;
uint8_t filter_duplicates;
} ScanParameters;
// 命令执行完成回调函数(模拟)
void on_command_complete(uint8_t status) {
if (status == 0x00) {
printf("HCI_LE_Set_Extended_Scan_Parameters command succeeded.\n");
// 开始扫描操作
// ...
} else {
printf("HCI_LE_Set_Extended_Scan_Parameters command failed with status 0x%02X.\n", status);
// 错误处理
// ...
}
}
// 假设的HCI事件回调实现(用于接收HCI_Command_Complete事件)
void hci_event_callback(uint8_t event_code, const uint8_t *event_data, uint8_t event_len) {
if (event_code == 0x0E) { // HCI_Command_Complete event
uint8_t num_hci_command_packets = event_data[0];
uint16_t opcode = (event_data[1] << 8) | event_data[2];
uint8_t status = event_data[3];
// 检查是否是我们发送的HCI_LE_Set_Extended_Scan_Parameters命令的响应
if (opcode == 0x4120) { // 假设的HCI_LE_Set_Extended_Scan_Parameters操作码(需要根据实际规范确认)
on_command_complete(status);
}
// 处理其他HCI事件...
}
// 处理其他事件代码...
}
// 设置扫描参数的函数
bool set_extended_scan_parameters(const ScanParameters *params) {
uint8_t cmd_params[8]; // 根据参数数量和大小分配空间
cmd_params[0] = params->scan_interval & 0xFF; // Scan Interval (LSB)
cmd_params[1] = (params->scan_interval >> 8) & 0xFF; // Scan Interval (MSB)
cmd_params[2] = params->scan_window & 0xFF; // Scan Window (LSB)
cmd_params[3] = (params->scan_window >> 8) & 0xFF; // Scan Window (MSB)
cmd_params[4] = params->own_address_type;
cmd_params[5] = params->filter_duplicates;
uint8_t status;
bool success = hci_send_command(0x0020, cmd_params, 6, &status); // 发送命令并等待初步状态(可能需要异步处理)
if (!success) {
printf("Failed to send HCI_LE_Set_Extended_Scan_Parameters command.\n");
return false;
}
// 注意:此处的status是发送命令的初步状态,不是最终命令完成的状态。
// 最终状态将在hci_event_callback中通过HCI_Command_Complete事件获取。
return true;
}
int main() {
// 初始化蓝牙栈和HCI层(假设已在此处完成)
// ...
// 设置扫描参数
ScanParameters params = {
.scan_interval = 0x00A0, // 1000ms(根据规范,单位为0.625ms)
.scan_window = 0x0050, // 500ms(根据规范,单位为0.625ms)
.own_address_type = 0x00,// 公共地址
.filter_duplicates = 0x01 // 过滤重复设备
};
// 发送设置扫描参数的命令
set_extended_scan_parameters(¶ms);
// 主循环(等待和处理HCI事件)
while (true) {
// 假设有一个机制来接收和处理HCI事件
// 例如:使用事件循环、中断或轮询
// 在这里,我们模拟等待HCI事件
// ...
}
return 0;
}重要说明:
hci_send_command和hci_event_callback是假设的HCI层接口函数。在实际应用中,需要使用蓝牙协议栈提供的相应函数。
0x4120是假设的HCI_LE_Set_Extended_Scan_Parameters命令的操作码。需要根据蓝牙核心规范中的实际值进行替换。
hci_event_callback中,我们检查了事件代码和操作码,以确定是否是HCI_Command_Complete事件以及它是否对应于我们发送的HCI_LE_Set_Extended_Scan_Parameters命令。然后,我们调用了on_command_complete回调函数来处理命令完成的状态。
set_extended_scan_parameters函数中,我们返回的success只是表示命令已成功发送,而不是表示命令已完成。
main函数中,我们有一个无限循环来等待和处理HCI事件。在实际应用中,需要实现一个适当的事件处理机制。
HCI_LE_Set_Extended_Scan_Parameters命令在BLE技术中具有广泛的应用场景,这些场景主要涉及到BLE设备的发现、连接以及数据传输等方面。
HCI_LE_Set_Extended_Scan_Parameters命令在BLE技术中具有广泛的应用场景,这些场景涵盖了设备发现、连接、数据传输以及安全性与隐私保护等方面。通过合理设置扫描参数,BLE设备可以实现更高效、更可靠、更安全的通信和交互。
关于HCI_LE_Set_Extended_Scan_Parameters命令的注意事项,以下是一些关键要点。
综上所述,通过理解和正确使用HCI_LE_Set_Extended_Scan_Parameters命令,可以显著提升BLE设备在扫描过程中的灵活性和效率。