首页 > 其他分享 >【0x0022】HCI_LE_Set_Data_Length命令全面解析

【0x0022】HCI_LE_Set_Data_Length命令全面解析

时间:2024-11-10 17:19:29浏览次数:3  
标签:Set 0x0022 命令 Length LE BLE HCI Data

目录

一、命令概述

二、命令格式和参数说明

2.1. HCI_LE_Set_Data_Length 命令格式

 2.2. Connection_Handle

2.3. TX_Octets

2.4. TX_Time

三、响应事件及参数说明

3.1. HCI_Command_Complete事件

3.1.1. Status

3.1.2. Connection_Handle

3.2. HCI_LE_Data_Length_Change事件

四、命令执行流程

4.1. 命令准备阶段

4.2. 命令构建与发送阶段

4.3. 控制器接收与处理阶段

4.4. 命令完成与反馈阶段

4.5. 主机后续操作阶段

4.6. 示例代码

 五、使用场景

5.1. 设备连接建立后的初始化设置

5.2. 数据传输效率优化

5.3. 适配不同设备的数据传输能力

5.4. 设备功能更新或状态变化时的调整

5.5. 实现特定功能

5.6. 调试和测试

六、注意事项

6.1. 命令格式与参数

6.2. 数据长度限制

6.3. 设备兼容性问题

6.4. 连接状态稳定性

6.5. 事件处理与错误排查

6.6. 广播与连接状态

6.7. 规范与文档参考


HCI_LE_Set_Data_Length 是低功耗蓝牙(Bluetooth Low Energy, BLE)核心规范中定义的一个主机控制接口(Host Controller Interface, HCI)命令。该命令允许主机(Host)设置蓝牙控制器(Controller)的数据长度参数。通过合理设置数据长度,可以优化数据传输效率,适应不同的应用场景和通信需求。例如,在传输大量数据(如文件传输)时,适当增大数据长度可以减少数据包的数量,从而降低传输开销,提高传输速度。

一、命令概述

不同的蓝牙设备其控制器支持的数据长度能力可能不同。HCI_LE_Set_Data_Length 命令允许主机根据设备的实际能力和通信双方的需求,设置合适的数据长度,以确保数据传输的兼容性和高效性。比如,当连接一个支持较大数据长度的新设备时,可以使用该命令设置较大的数据长度来充分利用设备的性能优势。

HCI_LE_Set_Data_Length命令的主要功能是让主机(Host)能够对给定连接中的链路层(LL,Link Layer)数据协议数据单元(PDU,Protocol Data Unit)的最大传输有效载荷大小(connMaxTxOctets)和最大数据包传输时间(connMaxTxTime)提出建议。这两个参数是在BLE通信的链路层数据传输过程中非常关键的因素,它们决定了数据如何在连接上进行传输。

  • 命令参数
    • Connection Handle:指定要更改数据长度的BLE连接的句柄。
    • Max TX OctetsconnMaxTxOctets):建议的最大传输数据长度(包括头部和CRC),以字节为单位。这个值决定了BLE数据包可以携带的最大有效载荷。
    • Max TX TimeconnMaxTxTime):建议的最大传输时间,以微秒为单位。这个值表示在BLE连接上传输一个数据包所需的最大时间。
  • 控制器行为:虽然主机可以通过这个命令提出建议,但控制器(Controller)在实际操作中有一定的自主性。控制器可能会根据本地信息(如设备的当前状态、通信环境、硬件资源等)来决定使用比主机建议的更小或者更大的值。
    • 如果控制器接受主机的建议,它将在后续的BLE连接中使用这些参数来传输数据。
    • 如果控制器不接受主机的建议,它可能会忽略该命令或返回一个错误代码。
  • 示例:假设主机希望为某个BLE连接设置最大传输有效载荷大小为251字节,最大传输时间为某个特定值(该值取决于BLE物理层的波特率和数据包长度)。主机将发送一个HCI_LE_Set_Data_Length命令,其中包含相应的Connection HandleMax TX OctetsMax TX Time参数。控制器接收到该命令后,将根据其内部策略决定是否接受这些建议,并在后续的BLE连接中使用这些参数(如果接受的话)。

二、命令格式和参数说明

2.1. HCI_LE_Set_Data_Length 命令格式

HCI_LE_Set_Data_Length 命令的格式通常包括以下几个部分:

  • OGF(Opcode Group Field,操作码组字段):对于BLE相关的命令,OGF通常为0x08,表示该命令属于LE(低功耗)控制器命令组。
  • OCF(Opcode Command Field,操作码命令字段):对于HCI_LE_Set_Data_Length命令,OCF为0x0022,用于指示该命令的功能。
  • Parameter Length(参数长度):这是一个无符号8位整数,表示后续参数的总长度(以字节为单位)。对于HCI_LE_Set_Data_Length命令,这个长度是固定的,通常为6字节(不包括OGF和OCF)。
  • Connection Handle:指定要更改数据长度的BLE连接的句柄,是一个16位值。
  • Max TX Octets:指定最大传输数据长度(包括头部和CRC),是一个无符号16位整数,范围通常为27到251字节
  • Max TX Time:指定最大传输时间(以微秒为单位),是一个无符号16位整数。

以下是一个HCI_LE_Set_Data_Length命令的示例格式:

OGF: 0x08  
OCF: 0x0022(具体值根据蓝牙核心规范确定)  
Parameter Length: 0x06(表示后续参数长度为6字节)  
Connection Handle: 0xXXXX(具体值根据连接句柄确定)  
Max TX Octets: 0xFF(表示最大传输数据长度为255字节,这里仅为示例,实际值应根据需要设置)  
Max TX Time: 0xXXXX(具体值根据最大传输时间确定,单位微秒)

注意:

  • 在实际发送命令时,OCF的具体值需要参考蓝牙核心规范来确定。
  • Connection Handle的值应该替换为实际要更改数据长度的BLE连接的句柄。
  • Max TX OctetsMax TX Time的值应该根据实际需要来设置,但需要注意它们受到BLE规范的限制,并且可能受到控制器硬件和软件的限制。

 2.2. Connection_Handle

Connection_Handle的作用是指定需要设置数据长度的连接。由于BLE设备可能同时与多个设备保持连接,因此需要使用Connection_Handle来区分不同的连接。Connection_Handle是在建立连接时由BLE控制器分配的,并且对于每个活跃的连接都是唯一的。当主机发送HCI_LE_Set_Data_Length命令时,它会通过Connection_Handle来告诉BLE控制器要修改哪个连接的数据长度参数。

取值范围:0x0000到0x0EFF(十进制为0到3839)。然而,这个范围可能会因BLE控制器的具体实现而有所不同。在实际应用中,可能不会用到这个范围内的所有值。例如,某些值可能被保留用于特定目的,或者由于实现方式的限制,某些值可能根本不会被分配。

2.3. TX_Octets

HCI_LE_Set_Data_Length命令中,TX_Octets参数为控制器提供了一个关于发送数据长度的参考。当主机发送该命令时,这个参数值就是主机认为在当前连接下,控制器比较合适的最大发送有效载荷字节数。虽然控制器最终可能根据自身的实际情况(如设备状态、信号质量等)进行调整,但这个参数起到了重要的引导作用,帮助控制器更好地理解主机对于数据传输效率和性能的期望。

参数范围: 

  • 最小值:0x001B(十进制为27)
  • 最大值:0x00FB(十进制为251)

这个范围定义了BLE设备在单个LL Data PDU中可以发送或接收的最大数据量。需要注意的是,这个参数是一个优选值,实际发送或接收的数据量可能会受到多种因素的影响,如BLE控制器的实现、连接间隔、其他设备的干扰等。

影响数据传输策略TX_Octets直接影响了数据传输过程中的数据包大小策略。如果这个参数值较大,理论上可以减少数据包的数量,从而可能减少传输开销,提高传输效率,但同时也可能对通信质量有更高的要求。相反,较小的值会使数据包变小,增加数据包的数量,虽然可能会降低传输效率,但在不稳定的通信环境中可能会提高数据传输的可靠性。

应用场景示

标签:Set,0x0022,命令,Length,LE,BLE,HCI,Data
From: https://blog.csdn.net/weixin_37800531/article/details/143648890

相关文章

  • 4-2-2.C# 数据容器 - HashSet 扩展(HashSet 集合操作、HashSet 存储对象的特性、HashSe
    HashSet概述HashSet<T>存储的元素是无序的HashSet<T>存储的元素是不可重复的HashSet<T>支持泛型,可以指定存储的元素的类型HashSet<T>不支持索引,不可以通过索引获取或修改元素HashSet<T>不是线程安全的,在多线程环境中需要谨慎使用一、HashSet集合操作1......
  • 4-2-2.C# 数据容器 - HashSet(HashSet 的定义、HashSet 元素的基本操作、HashSet 元素
    HashSet概述HashSet<T>存储的元素是无序的HashSet<T>存储的元素是不可重复的HashSet<T>支持泛型,可以指定存储的元素的类型HashSet<T>不支持索引,不可以通过索引获取或修改元素HashSet<T>不是线程安全的,在多线程环境中需要谨慎使用一、HashSet的定义定义......
  • [LeetCode] 3090. Maximum Length Substring With Two Occurrences
    Givenastrings,returnthemaximumlengthofasubstringsuchthatitcontainsatmosttwooccurrencesofeachcharacter.Example1:Input:s="bcbbbcba"Output:4Explanation:Thefollowingsubstringhasalengthof4andcontainsatmosttw......
  • ffmpeg Preset files
    Apresetfilecontainsasequenceofoption=valuepairs,oneforeachline,specifyingasequenceofoptionswhichwouldbeawkwardtospecifyonthecommandline.Linesstartingwiththehash(’#’)characterareignoredandareusedtoprovidecomments.......
  • [CKS] K8S ServiceAccount Set Up
    最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于Rolebinding的题目。Question1ThebuffyPodinthesunnydalenamespacehasabuffy-saServiceAccountwithpermissionsthePoddoesn’tneed.ModifytheattachedRolesothatitonlyhasthea......
  • HarmonyOS Next之Asset Store Kit基础功能全解析
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在HarmonyOS......
  • ffmpeg问题解决:Unrecognized option 'preset'. Error splitting the argument list: O
    来到这里,十有八九是手动编译安装的ffmpeg,在跑视频流程序或命令时出现这个问题。跟这个报错:ffmpeg:errorwhileloadingsharedlibraries:libx264.so.164:cannotopensharedobjectfile:Nosuchfileordirectory的错误本质是一样的,都是由于ffmpeg时使用到了libx264,而在......
  • C++之setw
    1.什么是setwsetw是C++中一个用于控制输出宽度的操纵符(manipulator),它定义在<iomanip>头文件中。通过setw可以指定下一个输出项应占用的字符宽度,在格式化输出时非常有用。2.setw的作用setw(n)设置的宽度n表示下一个要输出的项所占的最小宽度。如果输出项的实际字......
  • [USACO23FEB] Problem Setting P 题解
    [USACO23FEB]ProblemSettingP题目说的很绕,意思就是所有验题人都认为题目难度顺序单增。发现\(m\)很小,很容易想到状压。把H看作\(\tt1\),E看作\(\tt0\),则我们得到\(m\)个长度为\(n\)的\(\tt01\)串,这就是每道题的“状态”。发现状态相同的题没有本质区别,所以我们......
  • 【C++篇】无序中的法则:探索 STL之unordered_map 与 unordered_set容器的哈希美学
    文章目录C++`unordered_map`和`unordered_set`容器详解前言第一章:`unordered_map`和`unordered_set`的概念1.1`unordered_map`和`unordered_set`的定义1.2与`map`、`set`的区别第二章:`unordered_map`和`unordered_set`的构造方法2.1`unordered_map`......