
HCI_Write_Link_Supervision_Timeout 命令是用于设置蓝牙基本速率/增强数据速率(BR/EDR)控制器中的链路监督超时(Link Supervision Timeout, LSTO)值的命令。链路监督超时是指在一定时间内如果没有接收到来自对端设备的数据包,则认为链路已经丢失,设备将断开连接。这个命令对于管理蓝牙连接的稳定性和资源非常关键。
HCI_Write_Link_Supervision_Timeout 命令是蓝牙HCI(Host Controller Interface)协议中用于设置特定ACL(Asynchronous Connection-Less)连接的链路监督超时的命令。它允许主机(Host)为特定的蓝牙连接设置一个链路监督超时值。在蓝牙设备的管理和连接维护中起着重要作用。

0x0C)。HCI_Write_Link_Supervision_Timeout 命令格式HCI_Write_Link_Supervision_Timeout 命令的格式遵循蓝牙核心规范中定义的HCI命令结构。

该命令的详细格式:
HCI_Write_Link_Supervision_Timeout命令,参数总长度固定为4个字节(2个字节用于连接句柄,2个字节用于链路监督超时值)。
Handle 是指一个用于标识特定BR/EDR控制器连接的连接句柄(Connection_Handle)。在 HCI_Write_Link_Supervision_Timeout 命令中用于指定哪个连接的链路监督超时值将被写入。

范围:从 0x0000 到 0x0EFF。这个范围限制了可以标识的连接数量,因为连接句柄只有 12 位有效。
Link_Supervision_Timeout用于定义蓝牙BR/EDR连接在没有收到来自对等设备的任何数据包时可以保持活动状态的最长时间。这个参数在 HCI_Write_Link_Supervision_Timeout 命令中用于设置特定连接的链路监督超时值。

0x0000:表示没有设置链路监督超时,但在实际应用中,通常不是有效的设置,因为蓝牙核心规范为控制器定义了一个强制范围。N = 0xXXXX:N 是一个十六进制值,表示以BR/EDR基带时隙为单位的数量。链路监督超时值是通过将 N 乘以 0.625 毫秒来计算的,其中 0.625 毫秒是一个基带时隙的持续时间。 0x7D00,表示 20 秒的超时时间。0x0190 到 0xFFFF;意味着超时值可以从 1 个基带时隙(即 0.625 毫秒)到 65535 个基带时隙(即约 40.96 秒)不等。另外,0x0000 可以表示无限超时(尽管在实际应用中,可能需要特定的实现或配置)。HCI_Command_Complete 事件当 HCI_Write_Link_Supervision_Timeout 命令完成时,将生成一个 HCI_Command_Complete 事件。这个事件是HCI层用来通知主机命令已经执行完毕的标准机制。

Status和Handle(如果适用)。Status字段将指示命令是否成功执行(0x00表示成功,其他值表示失败及相应的错误代码)。如果命令成功,Handle字段将包含被更新链路监督超时值的连接句柄。HCI_Command_Complete事件后,将检查Status字段以确定命令是否成功执行。如果命令失败,主机可能会采取适当的错误处理措施,如重试命令、记录错误日志或通知用户。
Status 参数用于表明 HCI_Write_Link_Supervision_Timeout 命令的执行情况。

Status 的值为 0x00 时,代表 HCI_Write_Link_Supervision_Timeout 命令已成功执行。表示系统已成功更新了指定连接的链路监督超时值。Status 的值介于 0x01 到 0xFF 之间,意味着命令执行失败。此时,具体的错误代码将提供有关失败原因的详细信息。蓝牙Controller错误代码全面概览_蓝牙错误代码-CSDN博客Handle 参数用于指定哪个连接的链路监督超时值被 HCI_Write_Link_Supervision_Timeout 命令所更新。

与HCI_Write_Link_Supervision_Timeout 命令参数中的 Handle 格式相同,用于确认操作对应的连接。如果命令执行成功,返回的 Handle 应该与发送命令时使用的 Handle 一致;如果出现错误,返回的 Handle 可能用于帮助定位问题连接。
以下是一个简化的示例代码框架,用于说明如何在C语言中构建和发送该命令,以及如何处理响应。请注意,这只是一个示例,并不包含实际的硬件接口代码或错误处理细节。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 假设有一个HCI接口库提供以下函数
// hci_send_command(uint8_t *packet, uint16_t length);
// hci_receive_event(uint8_t *event, uint16_t *length);
// 示例:HCI命令包结构
typedef struct {
uint16_t opcode; // 操作码
uint8_t param_len; // 参数长度
uint16_t handle; // 连接句柄
uint16_t lsto; // 链路监督超时值
} hci_write_lsto_cmd_t;
// 示例:HCI事件包结构(简化)
typedef struct {
uint8_t evt_code; // 事件代码
uint8_t plen; // 参数长度
uint8_t status; // 状态码
uint16_t handle; // 连接句柄(可能包含在返回包中)
// ... 其他可能的参数
} hci_command_complete_evt_t;
// 函数:构建并发送HCI_Write_Link_Supervision_Timeout命令
void send_write_lsto_command(uint16_t handle, uint16_t lsto) {
hci_write_lsto_cmd_t cmd;
cmd.opcode = 0x0037; // HCI_Write_Link_Supervision_Timeout 操作码
cmd.param_len = 4; // 参数长度(2字节handle + 2字节lsto)
cmd.handle = handle;
cmd.lsto = lsto;
uint8_t packet[HCI_COMMAND_PACKET_MAX_SIZE]; // 假设定义了最大包大小
memset(packet, 0, sizeof(packet));
// 将命令结构复制到包中(这里需要适当的字节序转换,如果必要)
memcpy(packet, &cmd, sizeof(cmd));
// 发送命令
hci_send_command(packet, sizeof(cmd));
}
// 函数:处理HCI_Command_Complete事件
void handle_command_complete_event(uint8_t *event, uint16_t length) {
if (length < sizeof(hci_command_complete_evt_t)) {
// 事件包太短,无法处理
return;
}
hci_command_complete_evt_t *evt = (hci_command_complete_evt_t *)event;
if (evt->evt_code == HCI_EVENT_COMMAND_COMPLETE) {
if (evt->status == 0x00) {
// 命令成功执行
printf("HCI_Write_Link_Supervision_Timeout command succeeded for handle 0x%04X\n", evt->handle);
} else {
// 命令执行失败
printf("HCI_Write_Link_Supervision_Timeout command failed with status 0x%02X for handle 0x%04X\n", evt->status, evt->handle);
}
} else {
// 不是命令完成事件
printf("Unexpected event code 0x%02X\n", evt->evt_code);
}
}
// 主函数:示例使用
int main() {
uint16_t handle = 0x0001; // 示例连接句柄
uint16_t lsto = 0x0200; // 示例链路监督超时值(512 * 0.625ms = 320ms)
// 发送HCI_Write_Link_Supervision_Timeout命令
send_write_lsto_command(handle, lsto);
// 等待并处理HCI事件(这里需要实现一个循环来不断检查新事件)
// 示例中省略了这部分,因为它通常涉及到异步I/O和事件循环机制
// ...
// 假设在某个时刻,我们收到了一个HCI_Command_Complete事件
// uint8_t event_data[] = { ... }; // 假设这是接收到的事件数据
// uint16_t event_length = ...; // 假设这是接收到的事件长度
// handle_command_complete_event(event_data, event_length);
return 0;
}在将命令结构复制到包中时,可能需要进行字节序转换(大端或小端)。这取决于HCI接口和蓝牙控制器的要求。
HCI_Write_Link_Supervision_Timeout命令允许用户根据具体的应用场景和设备需求,灵活地设置链路监督超时(LSTO)的值。这一特性使得该命令在多个方面都有广泛的应用。
HCI_Write_Link_Supervision_Timeout命令在蓝牙通信中具有广泛的应用场景和重要的实用价值。通过合理设置LSTO的值,可以优化连接稳定性、实现节能管理、协调多设备连接以及支持蓝牙协议栈的开发与测试。在实际应用中,开发人员和工程师应根据具体需求和场景来合理设置LSTO的值,以实现最佳的蓝牙通信性能和用户体验。
开发者需要关注以下几个关键方面,以确保蓝牙通信的性能和用户体验得到优化:
通过合理设置LSTO值,并遵循上述注意事项,可以优化蓝牙通信的性能和用户体验。
综上所述,HCI_Write_Link_Supervision_Timeout 命令是蓝牙设备管理中一个重要的命令,它允许主机根据需要调整链路监督超时值,从而优化连接的稳定性和资源使用。在使用此命令时,需要仔细考虑其对设备性能和功耗的影响,并确保符合蓝牙规范和应用需求。