当前位置: 首页 > article >正文

【0x003A】HCI_Write_Current_IAC_LAP命令详解

目录

一、命令概述

二、命令格式及参数

2.1. HCI_Write_Current_IAC_LAP 命令格式

2.2. Num_Current_IAC

2.3. IAC_LAP[i]

三、生成事件及参数

3.1. HCI_Command_Complete 事件

3.2. Status

四、命令执行流程

4.1. 命令发送阶段(主机端)

4.2. 命令执行阶段(控制器端)

4.3. 事件接收与处理阶段(主机端)

4.4. 示例代码

五、使用场景

5.1. 蓝牙设备配置与初始化

5.2. 设备发现与筛选

5.3. 多设备连接与管理

5.4. 蓝牙设备安全性增强

5.5. 蓝牙协议开发与测试

六、注意事项

6.1. 参数设置方面

6.2. 命令执行和反馈方面

6.3. 设备兼容性方面

6.4. 安全和权限方面


HCI_Write_Current_IAC_LAP命令是蓝牙主机控制器接口(HCI)中的一个重要命令,用于设置本地蓝牙BR/EDR(基本速率/增强数据率)控制器在查询扫描期间同时监听的查询访问码(Inquiry Access Codes,IAC)的逻辑地址部分(LAP)。

一、命令概述

HCI_Write_Current_IAC_LAP 命令用于设置本地蓝牙BR/EDR控制器在查询扫描期间同时扫描使用的查询访问码(Inquiry Access Codes, IAC)的LAP(逻辑地址部分,Logical Address Part)。每个LAP用于创建一个IAC,其中至少应支持一个IAC,即通用查询访问码(General Inquiry Access Code, GIAC)。某些BR/EDR控制器支持额外的IAC。

二、命令格式及参数

2.1. HCI_Write_Current_IAC_LAP 命令格式

完整的 HCI_Write_Current_IAC_LAP 命令数据包通常由多个部分组成,遵循蓝牙主机控制接口(HCI)的数据包格式规范。

具体格式如下:

  • 命令起始字节0x01,表明这是一个HCI(Host Controller Interface)命令数据包。
  • 操作码(Opcode):由操作码组字段(OGF)和操作码命令字段(OCF)组成,共2个字节。
    • OGF0x03,表示该命令属于HCI Control and Baseband Commands组。
    • OCF0x003A,表示这是Write Current IAC LAP命令。
  • 参数长度:1个字节,表示随后参数的总长度(不包括起始字节和操作码)。
  • Num_Current_IAC:1个字节,表示要设置的IAC数量,其值应在1到64之间(即0x01到0x40)。
  • IAC_LAP[i]:随后是Num_Current_IAC个IAC的LAP值,每个LAP值占用3个字节(24位),其中i是从0到Num_Current_IAC-1的索引。

2.2. Num_Current_IAC

Num_Current_IAC 是 HCI_Write_Current_IAC_LAP 命令中的一个关键参数,它指定了本地BR/EDR控制器在查询扫描期间将同时监听多少个查询访问码(IAC)的逻辑地址部分(LAP)。

取值范围:

  • 最小值0x01,表示设置1个IAC。
  • 最大值0x40,表示设置64个IAC。

设置的IAC数量不应超过蓝牙设备支持的最大IAC数量。如果 Num_Current_IAC 的值超过了设备支持的最大数量,则蓝牙控制器可能会忽略超出部分,或者返回一个错误代码。在实际使用中,应根据需要监听的IAC数量来设置 Num_Current_IAC。过多的IAC可能会增加查询扫描的复杂性和功耗,而过少的IAC可能会限制设备发现的灵活性。

假设我们要设置本地BR/EDR控制器在查询扫描期间同时监听3个IAC,那么 Num_Current_IAC 的值应设置为 0x03。随后,命令中还应包含这3个IAC的LAP值,每个LAP值占用3个字节(24位)。

通过正确设置 Num_Current_IAC 和相应的IAC LAP值,可以控制本地蓝牙设备在查询过程中的行为,从而优化设备发现和连接过程。

2.3. IAC_LAP[i]

IAC_LAP[i] 是 HCI_Write_Current_IAC_LAP 命令中的一个参数数组,用于指定本地BR/EDR控制器在查询扫描期间将监听的查询访问码(IAC)的逻辑地址部分(LAP)。

取值范围:

  • 最小值0x9E8B00
  • 最大值0x9E8B3F

这个范围确保了LAP值符合蓝牙规范中定义的通用查询访问码(GIAC)及其变体的格式。GIAC本身的LAP值是 0x9E8B33

  • IAC_LAP[i] 中的每个LAP值都应位于上述指定的范围内。如果提供的LAP值不在此范围内,蓝牙控制器可能会忽略该值,或者返回一个错误代码。
  • 根据蓝牙规范,默认的IAC应包括GIAC(0x9E8B33),并且可以由制造商指定零个或多个其他IAC。
  • 在设置 IAC_LAP[i] 时,应确保 Num_Current_IAC 的值与提供的LAP值数量相匹配。
  • 在发送 HCI_Write_Current_IAC_LAP 命令之前,应确保蓝牙设备已处于可配置状态,并且与蓝牙主机的连接是活动的。

三、生成事件及参数

3.1. HCI_Command_Complete 事件

HCI_Write_Current_IAC_LAP命令执行完成后,会生成一个HCI_Command_Complete事件(除非该事件被屏蔽)。这是蓝牙HCI协议中的标准行为。

HCI_Command_Complete事件通常具有以下格式:

  • 事件代码:一个字节,表示这是HCI_Command_Complete事件。
  • 参数总长度:一个字节,表示随后参数的总长度。
  • 命令操作码:两个字节,与触发此事件的HCI命令的操作码相同。
  • 返回参数:对于HCI_Write_Current_IAC_LAP命令,通常不包含返回参数,但事件的存在本身表明了命令的完成状态。
  • 状态:一个字节,表示命令的执行结果。0x00表示成功,其他值表示失败,并伴随有特定的错误代码。

3.2. Status

Status 参数是 HCI_Write_Current_IAC_LAP 命令执行结果的重要反馈。

  • 0x00HCI_Write_Current_IAC_LAP 命令成功执行。表示本地BR/EDR控制器已经成功更新了其当前使用的IAC(Inquiry Access Codes,查询访问码)LAP(Logical Address Part,逻辑地址部分)列表。

  • 0x01 至 0xFFHCI_Write_Current_IAC_LAP 命令执行失败。这些值表示发生了不同类型的错误。蓝牙Controller错误代码全面概览_蓝牙错误代码-CSDN博客

四、命令执行流程

4.1. 命令发送阶段(主机端)

  • 参数准备
    • 确定要使用的IAC数量(Num_Current_IAC),值域为0x01至0x40。
    • 准备IAC_LAP数组,每个元素为3字节,值域为0x9E8B00至0x9E8B3F。
    • 构建命令数据包,包括分组类型、参数总长度、操作码(0x003A)、Num_Current_IAC及IAC_LAP数组。
  • 发送命令:通过HCI驱动程序及物理接口(如UART、USB)将数据包发送给蓝牙控制器。

4.2. 命令执行阶段(控制器端)

  • 接收并解析命令:蓝牙控制器接收数据包,解析出操作码、Num_Current_IAC及IAC_LAP数组。
  • 参数验证
    • 验证Num_Current_IAC是否在允许范围内。
    • 验证IAC_LAP数组中的每个元素是否在规定值域内。
    • 检查设备支持的IAC数量(Num_Supported_IAC),若Num_Current_IAC超出此值,则仅处理前Num_Supported_IAC个IAC_LAP。
  • 更新IAC列表
    • 清除当前IAC设置。
    • 将有效的IAC_LAP值存储至控制器内部存储区域。
  • 状态反馈
    • 生成状态码,表示命令执行结果(0x00为成功,其他为失败)。
    • 发送HCI_Command_Complete事件至主机,包含状态码。

4.3. 事件接收与处理阶段(主机端)

  • 接收事件:主机通过HCI驱动程序接收HCI_Command_Complete事件。
  • 状态检查:检查事件中的状态码,若为0x00,则命令执行成功;否则,根据错误代码进行错误处理。
  • 后续操作:根据命令执行结果,执行后续蓝牙操作,如设备查询、连接等。

4.4. 示例代码

以下是一个简化的C语言代码示例,展示上述HCI_Write_Current_IAC_LAP命令的发送、接收和处理流程。

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
 
// 假设这些是HCI驱动程序提供的函数原型
extern int hci_send_command(uint8_t *packet, uint16_t length);
extern int hci_receive_event(uint8_t *event, uint16_t *length);
 
// 假设的HCI_Command_Complete事件结构体
typedef struct {
    uint8_t  event_code;
    uint8_t  packet_len;
    uint16_t opcode;
    uint8_t  status;
    // 其他可能的返回参数
} HCI_Command_Complete_Event;
 
// 发送HCI_Write_Current_IAC_LAP命令
int send_hci_write_current_iac_lap(uint8_t num_iac, uint8_t iac_lap[][3]) {
    uint8_t packet[64]; // 假设数据包最大长度为64字节
    uint8_t *ptr = packet;
 
    // 构建命令数据包
    *ptr++ = 0x01; // 分组类型(Command Packet)
    *ptr++ = (0x003A & 0x00FF); // 操作码的低字节
    *ptr++ = ((0x003A >> 8) & 0x00FF); // 操作码的高字节
    *ptr++ = 0x05 + num_iac * 3; // 参数总长度(包括Num_Current_IAC和IAC_LAP数组)
    *ptr++ = num_iac; // Num_Current_IAC
 
    // 添加IAC_LAP数组
    for (int i = 0; i < num_iac; i++) {
        memcpy(ptr, iac_lap[i], 3);
        ptr += 3;
    }
 
    // 发送命令
    return hci_send_command(packet, ptr - packet);
}
 
// 处理HCI_Command_Complete事件
int handle_command_complete_event(HCI_Command_Complete_Event *event) {
    if (event->status == 0x00) {
        printf("Command executed successfully\n");
        // 执行后续操作
        return 0; // 成功
    } else {
        printf("Command failed with status code: 0x%02X\n", event->status);
        // 根据错误代码进行错误处理
        return -1; // 失败
    }
}
 
int main() {
    // 示例IAC_LAP数组
    uint8_t iac_lap[5][3] = {
        {0x9E, 0x8B, 0x00},
        {0x9E, 0x8B, 0x01},
        {0x9E, 0x8B, 0x02},
        {0x9E, 0x8B, 0x03},
        {0x9E, 0x8B, 0x04}
    };
 
    // 发送HCI_Write_Current_IAC_LAP命令
    if (send_hci_write_current_iac_lap(5, iac_lap) < 0) {
        printf("Failed to send HCI_Write_Current_IAC_LAP command\n");
        return -1;
    }
 
    // 等待并接收HCI_Command_Complete事件
    uint8_t event[64];
    uint16_t length;
    if (hci_receive_event(event, &length) < 0) {
        printf("Failed to receive HCI event\n");
        return -1;
    }
 
    // 解析HCI_Command_Complete事件
    HCI_Command_Complete_Event *command_complete = (HCI_Command_Complete_Event *)event;
    if (command_complete->event_code == 0x0E && //HCI_Command_Complete事件码
        command_complete->opcode == 0x003A) { // 检查操作码
        handle_command_complete_event(command_complete);
    } else {
        printf("Received unexpected event or incorrect opcode\n");
        return -1;
    }
 
    return 0;
}

五、使用场景

5.1. 蓝牙设备配置与初始化

在蓝牙设备的初始化或配置阶段,HCI_Write_Current_IAC_LAP命令用于设置设备的查询接入码(IAC)。这是设备可发现性和与其他蓝牙设备互操作性的关键设置。通过配置IAC,设备可以精确控制哪些查询接入码被用于设备发现过程,从而决定哪些设备能够发现并连接到它。

5.2. 设备发现与筛选

  • 特定设备类型发现:在复杂的蓝牙设备环境中,通过设置不同的IAC,可以有针对性地发现特定类型的设备,如智能家居系统中的智能灯或智能插座。
  • 排除不需要的设备:通过设置IAC,可以排除一些不需要扫描的设备类型,提高设备发现的效率和准确性。

5.3. 多设备连接与管理

  • 设备分组管理:利用HCI_Write_Current_IAC_LAP命令为不同功能组的设备分配不同的IAC,以便更好地对设备进行分组管理。
  • 优化连接顺序:通过设置不同的IAC,可以确保蓝牙设备按照预定的顺序发现和连接目标设备,确保系统的正确配置。

5.4. 蓝牙设备安全性增强

  • 限制可发现设备范围:通过设置特定的IAC,可以限制蓝牙设备能够发现的其他设备范围,增强设备的安全性。
  • 隐藏特定设备服务:通过调整IAC,可以隐藏具有敏感信息或需要严格访问控制的蓝牙设备服务。

5.5. 蓝牙协议开发与测试

  • 模拟设备发现场景:在蓝牙协议的开发和测试过程中,可以使用HCI_Write_Current_IAC_LAP命令模拟不同的设备发现场景,测试蓝牙设备的发现机制是否符合协议规范。
  • 验证设备兼容性:通过设置不同的IAC,可以检查设备在各种扫描设置下是否能够正确响应和被发现,帮助开发人员找出可能存在的兼容性问题。

六、注意事项

6.1. 参数设置方面

  • Num_Current_IAC范围限制
    • 严格确保Num_Current_IAC的取值在0x010x40范围内。
    • 超出此范围可能导致命令无法被蓝牙控制器正确处理。
  • IAC_LAP[i]取值范围
    • IAC_LAP[i]数组中的每个元素值必须在0x9E8B000x9E8B3F之间。
    • 保证IAC_LAP的合法性和兼容性。
    • IAC_LAP[i]的长度由Num_Current_IAC决定,需保持一致。
  • 参数的准确性和合理性
    • 根据实际应用场景和设备环境确定Num_Current_IACIAC_LAP[i]的具体值。
    • 避免随意设置参数导致扫描到不需要的设备或无法扫描到目标设备。

6.2. 命令执行和反馈方面

  • 状态码检查
    • 仔细检查返回的HCI_Command_Complete事件中的状态码。
    • 状态码为0x00表示命令成功,其他值表示命令失败。
    • 根据蓝牙协议文档查找具体错误原因。
  • 事件处理顺序和逻辑
    • 确保在接收到HCI_Write_Current_IAC_LAP命令对应的HCI_Command_Complete事件后,再根据状态码进行后续操作。
    • 避免命令尚未完成或未接收到反馈事件时进行其他可能干扰命令执行的操作。

6.3. 设备兼容性方面

  • 不同设备支持差异
    • 考虑不同蓝牙设备对IAC的支持情况。
    • 较旧的设备可能只支持基本的GIAC
    • 在跨设备蓝牙应用或包含多种设备的蓝牙网络中,考虑设备之间的兼容性。
  • 设备固件和软件版本影响
    • 考虑设备的固件和软件版本是否满足要求。
    • 更新设备固件或软件后,重新测试HCI_Write_Current_IAC_LAP命令的执行情况。

6.4. 安全和权限方面

  • 安全风险
    • 不合理的IAC设置可能带来安全风险。
    • 设置过于宽泛的IAC可能导致设备被未经授权的其他设备发现和连接。
    • 在涉及敏感信息的蓝牙设备应用场景中,充分考虑安全因素。
  • 权限要求
    • 在某些蓝牙设备系统中,执行HCI_Write_Current_IAC_LAP命令可能需要特定权限。
    • 确保在使用该命令时满足相应的权限要求。

综上所述,HCI_Write_Current_IAC_LAP命令是蓝牙HCI接口中的一个重要命令,用于设置本地蓝牙控制器监听的IAC。通过合理配置IAC,可以实现蓝牙设备的精确搜索和连接,提高设备的互操作性和兼容性。


http://www.kler.cn/a/504675.html

相关文章:

  • api开发及运用小红书笔记详情api如何获取笔记详情信息
  • 医学图像分割半监督学习记录
  • 分布式数据存储基础与HDFS操作实践(副本)
  • 504 Gateway Timeout:网关超时解决方法
  • 如何通俗易懂的理解 html js css
  • Open FPV VTX开源之嵌入式OSD配置
  • 前端Vue框架——npm ci与npm install的区别以及package-lock.json文件与package.json的区别
  • 【gin】中间件使用之jwt身份认证和Cors跨域,go案例
  • 【scala】含有list子集的递归方法记录层数深度
  • 算法分析与设计之贪心算法
  • 基于pysptools实现端元提取及无监督光谱分类
  • Flink (五) :DataStream API (二)
  • 将内部部署系统的端口暴露给外部访问,并且仅允许指定 IP 的服务器访问该端口
  • 线上资源访问本地数据-跨域问题总结
  • 在eNSp上telnet一下吧
  • ubuntu下安装Mysql 以及3306端口被占用解决方法
  • Kibana操作ES基础
  • 学习AI大模型的小白入门建议和具体的学习方法推荐
  • 【python】OpenCV—Extract Horizontal and Vertical Lines—Morphology
  • 【学习笔记】Macbook管理多个不同的Python版本
  • 初学者如何用 Python 写第一个爬虫?
  • 1.15学习
  • elementUI项目中,只弹一个【token过期提示】信息框的处理
  • Vue中nextTick实现原理
  • 鸿蒙心路旅程:HarmonyOS NEXT 心路旅程:技术、成长与未来
  • 探索文本相似性算法:解锁文本比对的奥秘