【0x0037】HCI_Write_Link_Supervision_Timeout命令详解

目录

一、命令概述

二、命令格式及参数说明

2.2. Handle

三、生成事件及参数

3.1.  HCI_Command_Complete 事件

3.2. Status

3.3. Handle

四、命令执行流程

4.1. 命令准备阶段

4.2. 命令传输阶段

4.3. 命令处理阶段(控制器端)

4.4. 返回结果阶段

4.5. 事件通知阶段(如果未屏蔽)

4.6. 示例代码

五、应用场景

六、注意事项

6.1. 角色限制

6.2. 参数设置

6.3. 事件处理

6.4. 兼容性考虑

6.5. 连接稳定性与节能的平衡

6.6. 安全性考虑


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)为特定的蓝牙连接设置一个链路监督超时值。在蓝牙设备的管理和连接维护中起着重要作用。

  • 当主机(Host)向控制器(Controller)发送此命令时,它指定了一个连接句柄和期望的链路监督超时值
  • 如果控制器作为外设(Peripheral)角色,并且主机尝试修改这个值,控制器将返回错误代码“命令不允许”(Command Disallowed,错误码0x0C
  • 使用的连接句柄应该是指向目标设备的ACL连接。执行此命令后,该设备的其他同步连接句柄(Synchronous Handles)的链路监督超时值也将被设置为相同的值。 

二、命令格式及参数说明

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

该命令的详细格式: 

  • Opcode(操作码):

    • OGF(Operation Group Field): 0x03表示该命令属于链路控制命令组。

    • OCF(Operation Code Field): 0x0037表示该命令是设置链路监督超时命令。

    • 完整的Opcode: 0x03 0x0037 或组合为 0x0C37

  • Parameter Total Length(参数总长度):

    • 长度为1个字节,表示后续参数的总长度。

    • 对于HCI_Write_Link_Supervision_Timeout命令,参数总长度固定为4个字节(2个字节用于连接句柄,2个字节用于链路监督超时值)。

  • Parameters(参数):

    • Connection Handle(连接句柄):

      • 长度:2个字节。

      • 用于唯一标识一个ACL连接。

    • Link Supervision Timeout(链路监督超时值):

      • 长度:2个字节。

      • 表示链路监督超时的值,单位为0.625毫秒的倍数。例如,如果设置为0x0200,则超时时间为0x0200 * 0.625毫秒 = 512毫秒。

2.2. Handle

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 = 0xXXXXN 是一个十六进制值,表示以BR/EDR基带时隙为单位的数量。链路监督超时值是通过将 N 乘以 0.625 毫秒来计算的,其中 0.625 毫秒是一个基带时隙的持续时间。
    • 时间范围:从 0.625 毫秒到 40.96 秒
    • 默认值0x7D00表示 20 秒的超时时间
    • 控制器的强制范围0x0190 到 0xFFFF;意味着超时值可以从 1 个基带时隙(即 0.625 毫秒)到 65535 个基带时隙(即约 40.96 秒)不等。另外,0x0000 可以表示无限超时(尽管在实际应用中,可能需要特定的实现或配置)。

三、生成事件及参数

3.1.  HCI_Command_Complete 事件

当 HCI_Write_Link_Supervision_Timeout 命令完成时,将生成一个 HCI_Command_Complete 事件。这个事件是HCI层用来通知主机命令已经执行完毕的标准机制。

  • 事件内容

    • 命令操作码(Opcode):标识触发此事件的HCI命令。
    • 返回参数:包括的StatusHandle(如果适用)。Status字段将指示命令是否成功执行(0x00表示成功,其他值表示失败及相应的错误代码)。如果命令成功,Handle字段将包含被更新链路监督超时值的连接句柄。
  • 事件处理:主机接收到HCI_Command_Complete事件后,将检查Status字段以确定命令是否成功执行。如果命令失败,主机可能会采取适当的错误处理措施,如重试命令、记录错误日志或通知用户。

3.2. Status

Status 参数用于表明 HCI_Write_Link_Supervision_Timeout 命令的执行情况。

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

3.3. Handle

Handle 参数用于指定哪个连接的链路监督超时值被 HCI_Write_Link_Supervision_Timeout 命令所更新。

HCI_Write_Link_Supervision_Timeout 命令参数中的 Handle 格式相同,用于确认操作对应的连接。如果命令执行成功,返回的 Handle 应该与发送命令时使用的 Handle 一致;如果出现错误,返回的 Handle 可能用于帮助定位问题连接。

四、命令执行流程

4.1. 命令准备阶段

  • 确定目标连接句柄:主机确定要设置链路监督超时(LSTO)值的蓝牙连接的唯一标识符(Connection_Handle),该句柄必须在0x0000到0x0EFF的范围内。
  • 设置超时值:主机设置所需的LSTO值,该值以0.625毫秒为单位,范围是0x0001到0xFFFF
  • 构建命令包:主机按照HCI命令格式,使用操作码0x0037,并附加Handle和Link_Supervision_Timeout参数,构建完整的命令数据包。

4.2. 命令传输阶段

  • 发送命令:主机通过HCI接口(如UART、USB等)将构建好的命令数据包发送给蓝牙控制器。

4.3. 命令处理阶段(控制器端)

  • 接收并解析命令:控制器接收命令包,并检查其格式是否正确。
  • 权限和范围检查
    • 控制器验证Handle对应的连接角色,确保不是从设备发出的命令(从设备不允许设置LSTO)。
    • 控制器检查Handle和LSTO参数是否在有效范围内。
  • 更新链路监督超时值:如果所有检查都通过,控制器将更新指定连接的LSTO值,包括可能的同步连接。

4.4. 返回结果阶段

  • 构建返回包:控制器根据命令执行结果构建返回包,包括Status和Handle参数。
  • 发送返回包:控制器通过HCI接口将返回包发送回主机。
  • 接收并处理返回结果
    • 主机接收返回包,检查Status参数以确定命令是否成功。
    • 根据Status值,主机执行相应的后续操作,如记录日志、更新状态或报告错误。

4.5. 事件通知阶段(如果未屏蔽)

  • 生成并发送事件:控制器生成HCI_Command_Complete事件(除非被屏蔽),并通过HCI接口发送给主机。
  • 接收并处理事件:主机接收事件,进一步确认命令已完成,并根据需要进行其他处理。

4.6. 示例代码

以下是一个简化的示例代码框架,用于说明如何在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)的值。这一特性使得该命令在多个方面都有广泛的应用。

  • 蓝牙连接稳定性维护:在不同环境下,通过调整LSTO的值,可以优化蓝牙连接的稳定性。例如,在干扰较大的环境中缩短超时时间,以便更快地检测到连接问题;在对连接稳定性要求极高的场景中延长超时时间,以减少因短暂数据传输间隔而误判连接中断的情况。

  • 节能管理:对于电池供电的蓝牙设备,合理设置LSTO值可以在一定程度上实现节能。当设备在一段时间内没有数据交互且超时时间到达后,蓝牙控制器可以将设备置于低功耗模式或断开连接,从而减少能耗。

  • 多设备连接协调:在多设备连接到一个主设备的场景中,通过为不同设备设置不同的LSTO值,可以优化资源分配,提高连接效率和用户体验。例如,为正在使用的设备设置较长的超时时间,而为不常使用的设备设置较短的超时时间。

  • 蓝牙协议栈开发与测试:在蓝牙协议栈的开发和测试阶段,使用HCI_Write_Link_Supervision_Timeout命令可以模拟各种连接场景和故障情况,从而发现协议栈实现中的潜在问题,并优化其性能和稳定性。

HCI_Write_Link_Supervision_Timeout命令在蓝牙通信中具有广泛的应用场景和重要的实用价值。通过合理设置LSTO的值,可以优化连接稳定性、实现节能管理、协调多设备连接以及支持蓝牙协议栈的开发与测试。在实际应用中,开发人员和工程师应根据具体需求和场景来合理设置LSTO的值,以实现最佳的蓝牙通信性能和用户体验。

六、注意事项

开发者需要关注以下几个关键方面,以确保蓝牙通信的性能和用户体验得到优化:

6.1. 角色限制

  • 只有在蓝牙设备作为主设备(Master)角色时,才能发送此命令。
  • 从设备(Slave)发送此命令将失败,并返回Command Disallowed错误码。
  • 开发者需要在设计蓝牙应用程序或进行系统集成时,明确设备角色,并在合适的角色下使用此命令。

6.2. 参数设置

  • 正确设置连接句柄(Connection Handle)和LSTO值。
  • 连接句柄需确保在有效范围内(0x0000 - 0x0EFF)。
  • LSTO值需以0.625毫秒为单位进行转换,并设置在允许的范围内(0x0001 - 0xFFFF)。
  • 不恰当的参数设置可能导致命令执行失败或影响蓝牙连接的正常功能。

6.3. 事件处理

  • 应用程序或系统需正确处理HCI_Command_Complete事件。
  • 未及时处理该事件可能导致系统无法得知命令执行结果,影响后续操作。
  • 在实时性要求较高的应用中,需特别注意事件处理的及时性。

6.4. 兼容性考虑

  • 不同蓝牙设备和芯片组对命令的实现细节可能存在差异。
  • 开发者需要进行充分的测试,确保命令在各种目标设备上都能正常工作。
  • 针对老旧设备或特殊设备,可能需要进行兼容性处理。

6.5. 连接稳定性与节能的平衡

  • LSTO值的设置需在连接稳定性和节能之间取得平衡。
  • 较短的LSTO值可快速检测连接问题,但可能增加功耗和连接断开频率。
  • 较长的LSTO值可减少连接断开频率,但可能延迟对连接问题的检测。

6.6. 安全性考虑

  • 在安全性要求较高的应用中,需对LSTO的设置进行严格的控制和验证。
  • 防止恶意设备通过修改LSTO值来干扰蓝牙通信。

通过合理设置LSTO值,并遵循上述注意事项,可以优化蓝牙通信的性能和用户体验。

综上所述,HCI_Write_Link_Supervision_Timeout 命令是蓝牙设备管理中一个重要的命令,它允许主机根据需要调整链路监督超时值,从而优化连接的稳定性和资源使用。在使用此命令时,需要仔细考虑其对设备性能和功耗的影响,并确保符合蓝牙规范和应用需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/65901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【杂谈】-DeepSeek如何以560万美元突破成本障碍

DeepSeek如何以560万美元突破成本障碍 文章目录 DeepSeek如何以560万美元突破成本障碍1、高效人工智能的经济学2、实现不可能的工程3、人工智能生态系统的连锁反应 传统的人工智能观点认为&#xff0c;构建大型语言模型 (LLM)需要大量资金——通常需要数十亿美元的投资。但中国…

TIOBE 指数 12 月排行榜公布,VB.Net排行第九

IT之家 12 月 10 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#xff0c;今天 TIOBE 官网公布了 2024 年 12 月的编程语言排行榜&#xff0c;IT之家整理如下&#xff1a; …

vs2022编译opencv 4.10.0

参考&#xff1a;Windosw下Visual Studio2022编译OpenCV与参考区别在于&#xff0c;没有用cmake GUI&#xff0c;也没有创建build目录&#xff0c;直接用vs2022打开了C:\code\opencv目录&#xff0c;即CMakeLists.txt所在根目录。没有修改默认下载地址&#xff0c;采用手动下载…

未来教育:AI知识库如何重塑学习体验

在科技日新月异的今天&#xff0c;教育领域正经历着前所未有的变革。人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是AI知识库的广泛应用&#xff0c;正在重塑我们的学习体验&#xff0c;使之变得更加高效、个性化和智能化。本文将深入探讨AI知识库如何影…

Android Camera压力测试工具

背景描述&#xff1a; 随着系统的复杂化和业务的积累&#xff0c;日常的功能性测试已不足以满足我们对Android Camera相机系统的测试需求。为了确保Android Camera系统在高负载和多任务情况下的稳定性和性能优化&#xff0c;需要对Android Camera应用进行全面的压测。 对于压…

JDK8源码分析Jdk动态代理底层原理

本文侧重分析JDK8中jdk动态代理的源码&#xff0c;若是想看JDK17源码分析可以看我的这一篇文章 JDK17源码分析Jdk动态代理底层原理-CSDN博客 两者之间有着略微的差别&#xff0c;JDK17在JDK8上改进了不少 目录 源码分析 过程 生成的代理类大致结构 本文侧重分析JDK8中jdk…

Spire.PDF for .NET【页面设置】演示:向 PDF 添加平铺背景图像

平铺背景通常是指用一个或多个小图像重复填充的背景。在本文中&#xff0c;您将学习如何在 PDF 中平铺图像&#xff0c;并使用 C# 和 VB.NET 为您的 PDF 创建平铺背景。 Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作 PDF 文档。使用 …

ImageNet 2.0?自动驾驶数据集迎来自动标注新时代

引言&#xff1a; 3DGS因其渲染速度快和高质量的新视角合成而备受关注。一些研究人员尝试将3DGS应用于驾驶场景的重建。然而&#xff0c;这些方法通常依赖于多种数据类型&#xff0c;如深度图、3D框和移动物体的轨迹。此外&#xff0c;合成图像缺乏标注也限制了其在下游任务中的…

stm32 智能语音电梯系统

做了个stm32智能语音控制的电梯模型&#xff0c;总结一下功能&#xff0c;源码用ST的HAL库写的&#xff0c;整体流程分明。 实物图 这个是整个板子的图片&#xff0c;逻辑其实并不复杂&#xff0c;只是功能比较多&#xff0c;在我看来都是一些冗余的功能&#xff0c;但也可能是…

多模态论文笔记——CogVLM和CogVLM2

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型的LoRA版本——CogVLM和CogVLM2。在SD 3中使用其作为captioner基准模型的原因和优势。 文章目录 CogVLM论文背景VLMs 的任务与挑战现有方法及…

【react】Redux的设计思想与工作原理

Redux 的设计理念 Redux 的设计采用了 Facebook 提出的 Flux 数据处理理念 在 Flux 中通过建立一个公共集中数据仓库 Store 进行管理&#xff0c;整体分成四个部分即: View &#xff08;视图层&#xff09;、Action &#xff08;动作&#xff09;、Dispatcher (派发器)、Stor…

PCB层叠结构设计

PCB层叠结构设计 层叠结构设计不合理完整性相关案例&#xff1a;在构成回流路径时&#xff0c;由于反焊盘的存在&#xff0c;使高速信号回流路径增长&#xff0c;造成信号回流路径阻抗不连续&#xff0c;对信号质量造成影响。 PCB层叠结构实物&#xff1a;由Core 和 Prepreg&a…

【Cesium】七、设置Cesium 加载时的初始视角

文章目录 一、前言二、实现方法2.1 获取点位、视角2.2 设置 三、App.vue 一、前言 在前面的文章 【Cesium】三、实现开场动画效果 中有提到过 虽然也能回到初始点位但是有一个明显的动画过程。下面方法加载时就是在初始点位 没有动画效果&#xff0c;根据需求选择。 本文参考…

Edge安装问题,安装后出现:Could not find Edge installation

解决&#xff1a;需要再安装&#xff08;MicrosoftEdgeWebView2RuntimeInstallerX64&#xff09;。 网址&#xff1a;https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/?formMA13LH#download 如果已经安装了edge&#xff0c;那就再下载中间这个独立程序安装就…

日期时间选择(设置禁用状态)

目录 1.element文档需要 2.禁用所有过去的时间 3.设置指定日期的禁用时间 <template><div class"block"><span class"demonstration">起始日期时刻为 12:00:00</span><el-date-pickerv-model"value1"type"dat…

【《python爬虫入门教程11--重剑无峰168》】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 【《python爬虫入门教程11--selenium的安装与使用》】 前言selenium就是一个可以实现python自动化的模块 一、Chrome的版本查找&#xff1f;-- 如果用edge也是类似的1.chrome…

系统架构风险、敏感点和权衡点的理解

系统架构是软件开发过程中的关键环节&#xff0c;它决定了系统的可扩展性、稳定性、安全性和其他关键质量属性。然而&#xff0c;架构设计并非易事&#xff0c;其中涉及的风险、敏感点和权衡点需要仔细考虑和处理。本文将详细探讨系统架构风险、敏感点和权衡点的概念&#xff0…

leetcode热题100(79. 单词搜索)dfs回溯 c++

链接&#xff1a;79. 单词搜索 - 力扣&#xff08;LeetCode&#xff09; 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的…

用PicGo向Github图床上传图片,然后通过markdown语言显示图片

目录 下载PicGo软件图床GitHub设置在Markdown中使用图片 下载PicGo软件 先进入Pic官网&#xff0c;然后点击下图中的免费下载 然后点击下载下图中PicGo-Setup-2.4.0-beta.9.exe这个可执行软件 图床GitHub设置 点击PicGo中的图床设置&#xff0c;再点击其中的Github&#xff…

bilibili 哔哩哔哩小游戏SDK接入

小游戏的文档 简介 bilibili小游戏bilibili小游戏具有便捷、轻量、免安装的特点。游戏包由云端托管&#xff0c;在哔哩哔哩APP内投放和运行&#xff0c;体验流畅&#xff0c;安全可靠。https://miniapp.bilibili.com/small-game-doc/guide/intro/ 没想过接入这个sdk比ios还难…