【0x0012】HCI_Delete_Stored_Link_Key命令详解

news2025/1/24 17:06:02

目录

一、命令参数

二、命令格式及参数

2.2. BD_ADDR

2.3. Delete_All

三、生成事件及参数

3.1. HCI_Command_Complete事件

3.2. Status

3.3. Num_Keys_Deleted

四、命令执行流程

4.1. 命令发送阶段

4.2. 控制器处理阶段

4.3. 命令完成反馈阶段

4.4. 主机处理反馈阶段

4.5. 示例代码

五、应用场景

六、注意事项

6.1. 确认删除对象

6.2. 设备状态与连接

6.3. 命令参数与执行

6.4. 并发操作与状态管理

6.5. 安全与隐私

6.6. 兼容性与版本


HCI_Delete_Stored_Link_Key 命令是用于删除蓝牙BR/EDR(Basic Rate/Enhanced Data Rate)控制器(蓝牙芯片)中存储的一个或多个链路密钥(Link Keys)的命令。Link key是两个蓝牙设备之间共享的密钥,用于确保两设备间的安全通信。蓝牙BR/EDR控制器可以存储有限数量的与其他BR/EDR设备相关联的链路密钥。

一、命令参数

HCI_Delete_Stored_Link_Key命令允许用户删除存储在BR/EDR控制器中的一个或多个链路密钥。对于管理存储空间和隐私保护非常重要。

  • 删除逻辑
    • 如果指定删除的链路密钥当前正在用于连接,则该链路密钥会立即从存储中标记为删除,但只有在所有使用该密钥的连接断开后,才会被完全删除。
    • 如果链路密钥未被使用,则会被立即完全删除。
  • 命令完成:无论链路密钥是立即还是稍后完全删除,命令都会在密钥从存储中标记或删除后完成。意味着,使用HCI_Read_Stored_Link_Key命令将无法再读取这些密钥。

二、命令格式及参数

HCI_Delete_Stored_Link_Key 命令遵循蓝牙HCI)的命令格式。

该命令由操作码(OCF)和参数部分组成。

  • 操作码(OCF):对于HCI_Delete_Stored_Link_Key命令,其操作码是固定的,用于标识该命令。
  • 参数部分:包含要删除的链路密钥的相关信息。
    • BD_ADDR(蓝牙设备地址)

      • 48位的蓝牙设备地址,用于唯一标识一个蓝牙设备。
      • 当需要删除特定设备的链路密钥时,应提供该设备的蓝牙地址。
    • Delete_All(删除所有标志)

      • 1位的标志位,用于指示是否删除所有存储的链路密钥。
      • 如果设置为1(或true),则表示删除所有存储的链路密钥,此时BD_ADDR参数将被忽略。
      • 如果设置为0(或false),则表示仅删除与指定BD_ADDR相关的链路密钥。

2.2. BD_ADDR

BD_ADDR用于指定要删除的Link Key所对应的蓝牙设备。蓝牙MAC地址-CSDN博客

  • 大小BD_ADDR 的大小为 6 个八位组(octets),在编程中通常表示为一个长度为 6 的字节数组(例如在 C 语言中可以使用 uint8_t[6])。
  • 数据类型:无符号 8 位字节数组,用于存储蓝牙设备的地址信息。

2.3. Delete_All

Delete_All_Flag表示是否删除所有已存储的link key。

  • 0x00:仅删除与指定 BD_ADDR 相关联的链路密钥。当此值被设置时,命令必须包含一个有效的 BD_ADDR 参数,该参数指定了要删除链路密钥的蓝牙设备。
  • 0x01:删除所有存储的链路密钥。当此值被设置时,BD_ADDR 参数将被忽略,因为命令将作用于所有存储的链路密钥。

三、生成事件及参数

3.1. HCI_Command_Complete事件

当HCI_Delete_Stored_Link_Key命令执行完成后,会生成一个HCI_Command_Complete事件。这个事件是蓝牙HCI协议中定义的一种标准事件,用于通知主机(Host)关于命令执行的结果。

  • 事件代码:HCI_Command_Complete是一个特定的事件代码,用于标识该事件。

  • 参数:该事件通常包含以下参数:

    • Number_of_Completed_Commands:表示已完成的命令数量。对于HCI_Delete_Stored_Link_Key命令,这个值通常为1,因为每个HCI命令通常是单独执行的。
    • Command_Opcode:表示已完成命令的操作码(Opcode)。
    • Status:表示命令执行的状态。这是一个重要的参数,用于指示命令是否成功执行。常见的状态值包括0x00(成功)和各种错误代码。
    • Return_Parameters:对于HCI_Delete_Stored_Link_Key命令,如果成功执行,可能包含被删除的链路密钥数量等信息。

3.2. Status

Status用于指示 HCI_Delete_Stored_Link_Key 命令的执行结果。

  • 0x00:表示HCI_Delete_Stored_Link_Key命令成功执行。意味着指定的链路密钥(如果提供了BD_ADDR)或所有存储的链路密钥(如果Delete_All设置为0x01)已被成功删除。
  • 0x010xFF:表示HCI_Delete_Stored_Link_Key命令执行失败。蓝牙Controller错误代码全面概览_connection rejected due to limited resources-CSDN博客

3.3. Num_Keys_Deleted

Num_Keys_Deleted参数用于指示在执行HCI_Delete_Stored_Link_Key命令后从存储中删除的链路密钥(Link Keys)的数量。

Num_Keys_Deleted 的大小为 2 个八位组(octets),在编程中通常使用一个无符号 16 位整数(例如在 C 语言中可以用uint16_t)来表示 。这种数据类型选择是为了能够表示一定范围内的链路密钥删除数量,2 个字节可以表示 0 到 65535 之间的无符号整数。

四、命令执行流程

4.1. 命令发送阶段

  • 主机构建命令:构建包含操作码和参数(BD_ADDR或Delete_All)的HCI_Delete_Stored_Link_Key命令数据包。
    • 若Delete_All=0x00,需指定BD_ADDR。
    • 若Delete_All=0x01,忽略BD_ADDR。
  • 发送命令:通过HCI接口将命令数据包发送给蓝牙控制器。

4.2. 控制器处理阶段

  • 接收并解析命令:蓝牙控制器解析操作码和参数。
  • 删除链路密钥
    • 若Delete_All=0x01,遍历并删除所有链路密钥(正在使用的先标记,待连接断开后完全删除)。
    • 若Delete_All=0x00,根据BD_ADDR查找并删除对应的链路密钥(同样处理正在使用的)。

4.3. 命令完成反馈阶段

  • 生成事件数据包:控制器完成处理后,生成HCI_Command_Complete事件数据包,包含事件码、状态字段、操作码和Num_Keys_Deleted字段。
  • 发送反馈:将事件数据包发送回主机。

4.4. 主机处理反馈阶段

  • 接收并解析反馈:主机解析事件数据包中的各个字段。
  • 判断命令结果
    • 若状态为0x00,确认命令成功,并记录删除的链路密钥数量。
    • 若状态不为0x00,根据错误状态码确定失败原因,进行后续处理。

4.5. 示例代码

下面提供一个简化的、高层次的伪代码示例,以展示如何在C语言中实现这一流程的主要步骤。

#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
 
// 假设的HCI接口函数(在实际实现中,这些函数将由蓝牙协议栈提供)
bool hci_send_command(uint16_t opcode, uint8_t *parameters, uint8_t parameter_length, uint8_t *response, uint16_t *response_length);
void hci_event_callback(uint8_t *event, uint16_t event_length);
 
// 假设的链路密钥存储和管理函数(在实际实现中,这些函数将处理实际的存储和删除操作)
bool delete_link_key(uint8_t *bd_addr, bool delete_all);
uint8_t get_num_deleted_keys(void);
 
// HCI_Delete_Stored_Link_Key命令的OCF(操作码字段)
#define HCI_OP_DELETE_STORED_LINK_KEY 0x0012
 
// 示例函数:发送HCI_Delete_Stored_Link_Key命令
bool send_delete_stored_link_key_command(uint8_t *bd_addr, bool delete_all) {
    uint8_t parameters[7]; // BD_ADDR是6个字节,加上1个字节的Delete_All标志
    if (!delete_all) {
        // 如果不是删除所有,则需要指定BD_ADDR
        memcpy(parameters, bd_addr, 6);
        parameters[6] = 0x00; // Delete_All设置为0x00
    } else {
        // 如果是删除所有,则忽略BD_ADDR,只设置Delete_All标志
        // 这里我们其实不需要填充BD_ADDR,但为了保持数组大小一致,可以设置为任意值或零
        memset(parameters, 0, 6);
        parameters[6] = 0x01; // Delete_All设置为0x01
    }
 
    uint8_t response[256]; // 假设的响应缓冲区大小
    uint16_t response_length = sizeof(response);
 
    // 发送命令并等待响应(在实际实现中,这可能需要一个异步回调机制)
    bool success = hci_send_command(HCI_OP_DELETE_STORED_LINK_KEY, parameters, delete_all ? 1 : 7, response, &response_length);
 
    // 在这里,我们假设hci_send_command函数是同步的,并且会在命令完成后返回结果。
    // 在实际实现中,可能需要使用事件回调来处理异步响应。
 
    // 检查响应并处理结果(在实际实现中,这将涉及解析响应数据包)
    // 这里我们简化处理,只检查一个假设的“成功”状态
    if (success && response[0] == 0x04 && response[1] == 0x0E && response[2] == 0x00 && response[3] == 0x00) {
        // 假设的成功响应检查(在实际实现中,这将更加复杂)
        // 调用链路密钥删除函数(在实际实现中,这将由蓝牙协议栈内部处理)
        // 但在这里我们模拟它
        delete_link_key(bd_addr, delete_all);
 
        // 假设的回调函数调用(在实际实现中,这将由蓝牙协议栈提供)
        // 来通知上层应用程序命令已完成
        // hci_event_callback(...);
 
        return true;
    } else {
        // 处理错误(在实际实现中,这将涉及解析错误代码并采取适当的行动)
        return false;
    }
}
 
// 示例函数:模拟链路密钥删除操作(在实际实现中,这将处理实际的存储删除)
bool delete_link_key(uint8_t *bd_addr, bool delete_all) {
    // 在这里实现实际的链路密钥删除逻辑
    // ...
 
    // 返回删除操作是否成功的标志
    return true;
}
 
// 示例函数:获取已删除的链路密钥数量(在实际实现中,这将从某个状态或日志中检索信息)
uint8_t get_num_deleted_keys(void) {
    // 在这里实现获取已删除链路密钥数量的逻辑
    // ...
 
    // 返回已删除的链路密钥数量
    return 1; // 假设删除了1个(或全部,如果delete_all为true)
}
 
int main() {
    uint8_t bd_addr[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; // 示例蓝牙地址
 
    // 发送删除链路密钥命令(删除指定地址的链路密钥)
    bool result = send_delete_stored_link_key_command(bd_addr, false);
    if (result) {
        printf("Successfully deleted link key for BD_ADDR: %02X:%02X:%02X:%02X:%02X:%02X\n",
               bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
    } else {
        printf("Failed to delete link key for BD_ADDR: %02X:%02X:%02X:%02X:%02X:%02X\n",
               bd_addr[0], bd_addr[1], bd_addr[2], bd_addr[3], bd_addr[4], bd_addr[5]);
    }
 
    // 发送删除所有链路密钥命令
    result = send_delete_stored_link_key_command(NULL, true);
    if (result) {
        printf("Successfully deleted all link keys. Number of deleted keys: %d\n", get_num_deleted_keys());
    } else {
        printf("Failed to delete all link keys.\n");
    }
 
    return 0;
}

五、应用场景

  • 设备安全维护
    • 当用户不再使用某个已配对的蓝牙设备时,或设备丢失、被盗时,可通过此命令删除对应的链路密钥,防止非法连接。

    • 在设备软件更新或恢复出厂设置时,删除所有链路密钥,确保设备安全重置。

  • 取消蓝牙设备配对:用户希望取消两个蓝牙设备之间的配对关系时,可删除链路密钥,使设备需要重新配对才能建立安全连接。
  • 清除旧的或不再使用的链路密钥:随着时间推移,用户可能连接多个蓝牙设备,产生多个链路密钥。定期清除旧的或不再使用的密钥,有助于保持设备安全性和管理简洁性。
  • 重置蓝牙设备的安全设置:在设备被盗或丢失后,通过删除所有链路密钥,确保设备在重新配对前不会被未经授权的设备访问。
  • 故障排查和修复:当蓝牙连接出现问题时,如无法建立连接或连接频繁断开,可尝试删除有问题的链路密钥,然后重新配对以解决问题。
  • 多设备管理与优化
    • 在蓝牙网关或服务器设备中,删除不再使用或过期的链路密钥,释放存储空间,提高设备运行效率。

    • 对于频繁更换连接设备的场景,如蓝牙测试设备,每次测试后删除链路密钥,为下次测试准备干净环境。

  • 遵守安全策略和合规性要求:在某些行业或组织中,可能需要遵守特定的安全策略和合规性要求,定期删除不再需要的蓝牙链路密钥。

六、注意事项

6.1. 确认删除对象

  • 准确性:务必确认要删除的链路密钥与对应的蓝牙设备匹配,避免错误删除导致连接中断。
  • 必要性:评估删除链路密钥的必要性,仅在确实需要取消配对、优化存储或遵守安全策略时执行。

6.2. 设备状态与连接

  • 设备状态:确保蓝牙设备处于可操作状态,能够接收和执行HCI命令。
  • 连接状态:若设备与待删除链路密钥对应的蓝牙设备仍连接,建议先断开连接再执行删除操作。

6.3. 命令参数与执行

  • 参数设置
    • BD_ADDR准确性:当Delete_All为0时,BD_ADDR必须准确无误。
    • Delete_All谨慎使用:设置为1时会删除所有链路密钥,需确认必要性并通知用户可能导致的连接中断。
  • 命令格式:按照HCI协议规范构造命令的OpCode和参数。
  • 反馈处理:等待并正确处理HCI_Command_Complete事件,根据状态字段判断命令是否成功执行。失败时,根据错误代码表找出原因并采取相应措施。

6.4. 并发操作与状态管理

  • 并发操作:避免并发发送HCI_Delete_Stored_Link_Key命令或与其他蓝牙命令冲突,可通过同步机制确保命令顺序执行。
  • 链路密钥状态:正在使用的密钥在删除后不会立即完全删除,需考虑连接未断开时密钥的删除状态。
  • 设备连接管理:删除链路密钥后,及时更新设备连接管理模块信息,避免连接管理混乱。

6.5. 安全与隐私

  • 重新配对:删除链路密钥后,设备需重新配对才能建立安全连接,确保用户了解此流程。
  • 数据保护:在删除过程中确保数据安全和隐私性,避免在不安全环境中执行操作。

6.6. 兼容性与版本

  • 兼容性:确认蓝牙设备和HCI实现支持该命令,注意不同版本蓝牙协议和HCI实现的差异。
  • 版本更新:设备软件或固件升级后,重新检查HCI命令的兼容性和正确性。

综上所述,HCI_Delete_Stored_Link_Key命令是蓝牙安全管理中的一个重要工具,用于删除不再需要的链路密钥,从而维护设备的安全性和存储效率。

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

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

相关文章

github汉化

本文主要讲述了github如何汉化的方法。 目录 问题描述汉化步骤1.打开github&#xff0c;搜索github-chinese2.打开项目&#xff0c;打开README.md3.下载安装脚本管理器3.1 在README.md中往下滑动&#xff0c;找到浏览器与脚本管理器3.2 选择浏览器对应的脚本管理器3.2.1 点击去…

机器学习-K近邻算法

文章目录 一. 数据集介绍Iris plants dataset 二. 代码三. k值的选择 一. 数据集介绍 鸢尾花数据集 鸢尾花Iris Dataset数据集是机器学习领域经典数据集&#xff0c;鸢尾花数据集包含了150条鸢尾花信息&#xff0c;每50条取自三个鸢尾花中之一&#xff1a;Versicolour、Setosa…

C++函数——fill

在C中&#xff0c;std::fill 是标准库提供的一个算法适用于几乎所有类型的容器&#xff0c;只要这些容器支持迭代器操作。具体来说&#xff0c;std::fill 的适用性取决于容器是否提供了满足其要求的迭代器类型&#xff0c;用于将指定范围内的所有元素设置为某个特定值。它是一个…

如何打造高效同城O2O平台?外卖跑腿系统源码选型与开发指南

打造一个高效的同城O2O平台&#xff0c;选择合适的外卖跑腿系统源码并制定科学的开发方案至关重要。本篇文章&#xff0c;笔者将从源码选型、核心功能、开发架构及运营策略等方面&#xff0c;全面解析O2O平台的搭建思路。 一、外卖跑腿系统源码的选型要点 在搭建O2O平台时&…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有&#xff1a; TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例&#xff1a; body: Center(child: Text(开启 TextWidget 的旅程吧&#xff0c;珠珠, 开启 TextWidget 的旅程吧&a…

Qt实践:一个简单的丝滑侧滑栏实现

Qt实践&#xff1a;一个简单的丝滑侧滑栏实现 笔者前段时间突然看到了侧滑栏&#xff0c;觉得这个抽屉式的侧滑栏非常的有趣&#xff0c;打算这里首先尝试实现一个简单的丝滑侧滑栏。 首先是上效果图 &#xff08;C&#xff0c;GIF帧率砍到毛都不剩了&#xff09; QProperty…

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析

10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析 文章目录 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析1. 规则持久化1.1 Nacos Server 配置中心-规则持久化实例 2. 最后&#xff1a; 1. 规则持久化 规则没有持久化的问题 如果 sentinel 流控规则没有…

SpringCloud微服务Gateway网关简单集成Sentinel

Sentinel是阿里巴巴开源的一款面向分布式服务架构的轻量级流量控制、熔断降级组件。Sentinel以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来帮助保护服务的稳定性。 官方文档&#xff1a;https://sentinelguard.io/zh-cn/docs/introduction.html …

正则表达式以及Qt中的使用

目录 一、正则表达式 1、基本匹配&#xff1a; 2、元字符&#xff1a; 2.1 .运算符&#xff1a; 2.2 字符集&#xff1a; 2.3 重复次数&#xff1a; 2.4 量词{} 2.5 特征标群() 2.6 或运算符 2.7 \反斜线转码特殊字符 2.8 锚点 3、简写字符 4、零宽度断言 4.1 正…

【STM32HAL-----GPIO】

1. 什么是GPIO&#xff1f;&#xff08;了解&#xff09; 2. STM32 GPIO简介 2.1. GPIO特点 2.2. GPIO电气特性 2.3. GPIO引脚分布图 IO引脚分布特点&#xff1a;按组存在、组数视芯片而定、每组最多16个IO引脚。 3. IO端口基本结构介绍 4. GPIO八种工作模式 4.1. 输入浮空 特…

亲测有效!解决PyCharm下PyEMD安装报错 ModuleNotFoundError: No module named ‘PyEMD‘

解决PyCharm下PyEMD安装报错 PyEMD安装报错解决方案 PyEMD安装报错 PyCharm下通过右键自动安装PyEMD后运行报错ModuleNotFoundError: No module named ‘PyEMD’ 解决方案 通过PyCharm IDE python package搜索EMD-signal&#xff0c;选择版本后点击“install”执行安装

低代码系统-产品架构案例介绍、简道云(七)

今天分析另外一个零代码、低代码产品-简道云&#xff0c;跟所有低代码产品的架构图一样&#xff0c;高、大、炫、美。 依然是从下至上&#xff0c;从左到右的顺序。 开发层 搭建中心 表单、流程、报表、用户中心&#xff0c;还是这些内容&#xff0c;自定义打印很多平台都有&am…

Chrome 132 版本新特性

Chrome 132 版本新特性 一、Chrome 132 版本浏览器更新 1. 在 iOS 上使用 Google Lens 搜索 在 Chrome 132 版本中&#xff0c;开始在所有平台上推出这一功能。 1.1. 更新版本&#xff1a; Chrome 126 在 ChromeOS、Linux、Mac、Windows 上&#xff1a;在 1% 的稳定版用户…

计算机网络三张表(ARP表、MAC表、路由表)总结

参考&#xff1a; 网络三张表&#xff1a;ARP表, MAC表, 路由表&#xff0c;实现你的网络自由&#xff01;&#xff01;_mac表、arp表、路由表-CSDN博客 网络中的三张表&#xff1a;ARP表、MAC表、路由表 首先要明确一件事&#xff0c;如果一个主机要发送数据&#xff0c;那么必…

cursor重构谷粒商城04——vagrant技术快速部署虚拟机

前言&#xff1a;这个系列将使用最前沿的cursor作为辅助编程工具&#xff0c;来快速开发一些基础的编程项目。目的是为了在真实项目中&#xff0c;帮助初级程序员快速进阶&#xff0c;以最快的速度&#xff0c;效率&#xff0c;快速进阶到中高阶程序员。 本项目将基于谷粒商城…

【玩转全栈】----Django连接MySQL

阅前先赞&#xff0c;养好习惯&#xff01; 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings&#xff0c;连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改&#xff08;更新&#xff09;数据&#xff1a; 获取数据 1、OR…

Jmeter使用Request URL请求接口

简介 在Jmeter调试接口时&#xff0c;有时不清楚后端服务接口的具体路径&#xff0c;可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…

mock可视化生成前端代码

介绍&#xff1a;mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件&#xff0c;来解决我们的问题。目前支持vite和webpack。&#xff08;配置超级简单&#xff01;&#xff09; 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…

输入网址到网页显示,发生了什么--讲述

输入www.baidu.com作为网址&#xff0c; 孤身的人-HTTP 浏览器要做的第一步就是 解析URL&#xff0c;根据url里面的资源路径&#xff0c;确认服务器资源和路径&#xff0c;生成http请求消息&#xff0c;包括请求消息&#xff08;请求行 消息头 请求体&#xff09; 举例&am…

1.CSS的三大特性

css有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级 1.1 层叠性 想通选择器给设置想听的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要是解决样式冲突的问题。 <!DOCTYPE html> <html lang"en&…