
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_Delete_Stored_Link_Key 命令遵循蓝牙HCI)的命令格式。

该命令由操作码(OCF)和参数部分组成。
BD_ADDR用于指定要删除的Link Key所对应的蓝牙设备。蓝牙MAC地址-CSDN博客

BD_ADDR 的大小为 6 个八位组(octets),在编程中通常表示为一个长度为 6 的字节数组(例如在 C 语言中可以使用 uint8_t[6])。Delete_All_Flag表示是否删除所有已存储的link key。

0x00:仅删除与指定 BD_ADDR 相关联的链路密钥。当此值被设置时,命令必须包含一个有效的 BD_ADDR 参数,该参数指定了要删除链路密钥的蓝牙设备。0x01:删除所有存储的链路密钥。当此值被设置时,BD_ADDR 参数将被忽略,因为命令将作用于所有存储的链路密钥。当HCI_Delete_Stored_Link_Key命令执行完成后,会生成一个HCI_Command_Complete事件。这个事件是蓝牙HCI协议中定义的一种标准事件,用于通知主机(Host)关于命令执行的结果。

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

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

Num_Keys_Deleted 的大小为 2 个八位组(octets),在编程中通常使用一个无符号 16 位整数(例如在 C 语言中可以用uint16_t)来表示 。这种数据类型选择是为了能够表示一定范围内的链路密钥删除数量,2 个字节可以表示 0 到 65535 之间的无符号整数。
下面提供一个简化的、高层次的伪代码示例,以展示如何在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;
}综上所述,HCI_Delete_Stored_Link_Key命令是蓝牙安全管理中的一个重要工具,用于删除不再需要的链路密钥,从而维护设备的安全性和存储效率。