
当两个BR/EDR控制器尝试建立安全连接时,可能需要共享一个Link Key。这个Link Key是一个用于加密和解密在蓝牙连接上传输的数据的密钥。如果主机(Host)没有为与另一个BR/EDR控制器(由BD_ADDR指定)之间的连接存储Link Key,那么当该控制器发出HCI_Link_Key_Request事件时,主机就会使用HCI_Link_Key_Request_Negative_Reply命令进行回应。
当BR/EDR控制器需要Link Key来建立连接时,会生成HCI_Link_Key_Request事件。通常发生在远程主机发送了HCI_Create_Connection或HCI_Authentication_Requested命令后,远程链路管理器(Link Manager)向本地链路管理器发出请求时。
在这种情况下,本地主机必须在远程链路管理器检测到LMP响应超时之前,使用HCI_Link_Key_Request_Reply或HCI_Link_Key_Request_Negative_Reply命令进行回应。如果主机没有为指定BD_ADDR的连接存储Link Key,则应使用HCI_Link_Key_Request_Negative_Reply命令进行回应。

HCI_Link_Key_Request_Negative_Reply包含两个主要的参数,即 BD_ADDR(蓝牙设备地址)和 Status(状态)。BD_ADDR 用于指定目标蓝牙设备,也就是对来自这个设备的链路密钥请求做出否定回复。
HCI_Link_Key_Request_Negative_Reply命令通常遵循蓝牙核心规范中定义的HCI命令格式。包括命令操作码(OCF)、参数长度、以及具体的参数值。
BD_ADDR指定了与链路密钥请求相关的目标蓝牙设备。当主机(Host)发送这个否定回复命令时,它通过BD_ADDR告诉控制器这个回复是针对哪一个具体的设备的链路密钥请求。蓝牙MAC地址-CSDN博客

当HCI_Link_Key_Request_Negative_Reply命令执行完成后,会生成一个HCI_Command_Complete事件。这个事件是蓝牙HCI用于通知主机命令已经成功执行或失败的标准机制。
BD_ADDR 用于唯一标识已完成 HCI_Link_Key_Request_Negative_Reply 命令的蓝牙设备。

0x 前缀表示这是一个十六进制数,XXXXXXXXXXXX 是地址的具体值,其中每个 X 代表一个十六进制字符(0-9 或 A-F)。
Status 用于指示 HCI_Link_Key_Request_Negative_Reply 命令的执行结果。这个参数的值决定了命令是成功还是失败,并提供了有关失败原因的详细信息(如果适用)。

0x00:表示 HCI_Link_Key_Request_Negative_Reply 命令成功执行。意味着主机已经正确地发送了拒绝Link Key请求的回应,并且没有遇到任何错误。0x01 至 0xFF:表示 HCI_Link_Key_Request_Negative_Reply 命令执行失败。这些值对应于不同的错误代码,每个代码都代表了一个特定的错误情况。具体的错误代码和对应的描述可以在蓝牙核心规范的[Vol 1] Part F, Controller Error Codes部分找到。蓝牙Controller错误代码全面概览_connection rejected due to limited resources-CSDN博客当蓝牙主机(Host)收到来自BR/EDR控制器的HCI_Link_Key_Request事件时,如果该主机没有为与请求中指定的BD_ADDR相关联的连接存储链路密钥(Link Key),则会触发HCI_Link_Key_Request_Negative_Reply命令的发送。
0x000C,以标识该命令为HCI_Link_Key_Request_Negative_Reply。BD_ADDR:6个字节,表示请求链路密钥的远程蓝牙设备的地址。HCI_Link_Key_Request_Negative_Reply命令。BD_ADDR和Status参数。BD_ADDR确定该否定回复是针对哪个具体的设备连接请求。Status参数。Status设置为0x00。Status和BD_ADDR的结果信息打包成一个响应包,并通过HCI接口返回给主机。Status的值判断命令是否成功执行。HCI_Link_Key_Request_Negative_Reply命令成功完成(即Status为0x00)时,会生成一个HCI_Command_Complete事件。以下是一个简化的C语言代码示例,用于展示如何在一个蓝牙主机控制器中实现HCI_Link_Key_Request_Negative_Reply命令的基本流程。请注意,这只是一个概念性的示例,并不包含完整的蓝牙协议栈实现或硬件接口代码。
#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
// 假设这些结构体和函数是由蓝牙协议栈库提供的
typedef struct {
uint8_t bd_addr[6];
uint8_t status;
} HCI_Link_Key_Request_Negative_Reply_Command;
typedef struct {
uint16_t opcode;
uint8_t status;
uint8_t bd_addr[6];
} HCI_Command_Complete_Event;
// 模拟发送HCI命令的函数(在实际中,这将与蓝牙硬件接口)
bool send_hci_command(uint16_t opcode, uint8_t *data, uint16_t length) {
// 这里只是模拟发送,实际上需要将数据发送到蓝牙控制器
printf("Sending HCI command with opcode 0x%04X\n", opcode);
// ...(发送数据的代码)
return true; // 假设发送成功
}
// 模拟接收HCI事件的函数(在实际中,这将由蓝牙硬件中断触发)
void receive_hci_event(uint8_t *event_data, uint16_t length) {
// 解析接收到的HCI事件
if (length >= sizeof(HCI_Command_Complete_Event)) {
HCI_Command_Complete_Event *event = (HCI_Command_Complete_Event *)event_data;
if (event->opcode == 0x000C) { // 检查是否为我们的命令完成事件
printf("Received HCI Command Complete Event for Link Key Request Negative Reply\n");
printf("Status: 0x%02X, BD_ADDR: ", event->status);
for (int i = 0; i < 6; i++) {
printf("%02X ", event->bd_addr[i]);
}
printf("\n");
}
// ...(处理其他事件的代码)
}
}
// 发送HCI_Link_Key_Request_Negative_Reply命令的函数
bool send_link_key_request_negative_reply(const uint8_t *bd_addr, uint8_t status) {
HCI_Link_Key_Request_Negative_Reply_Command command;
command.bd_addr[0] = bd_addr[0];
command.bd_addr[1] = bd_addr[1];
command.bd_addr[2] = bd_addr[2];
command.bd_addr[3] = bd_addr[3];
command.bd_addr[4] = bd_addr[4];
command.bd_addr[5] = bd_addr[5];
command.status = status;
uint16_t opcode = 0x0013; // HCI_Link_Key_Request_Negative_Reply的OCF为0x000C,加上OGF(通常为0x0001表示Link Control Commands)得到完整的opcode
bool success = send_hci_command(opcode, (uint8_t *)&command, sizeof(command));
if (success) {
// 在这里,我们可能会等待一个HCI_Command_Complete事件来确认命令的成功执行
// 但在这个简化的示例中,我们不会实现这一点
printf("HCI_Link_Key_Request_Negative_Reply command sent successfully\n");
} else {
printf("Failed to send HCI_Link_Key_Request_Negative_Reply command\n");
}
return success;
}
int main() {
// 示例BD_ADDR和状态码
uint8_t bd_addr[6] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55};
uint8_t status = 0x00; // 表示成功(在这个上下文中,状态码的具体含义由蓝牙协议定义)
// 发送Link Key Request Negative Reply命令
send_link_key_request_negative_reply(bd_addr, status);
// 在实际应用中,这里将会有一个事件循环来接收和处理来自蓝牙控制器的HCI事件
// 但在这个简化的示例中,我们不会实现这一点
return 0;
}在这个示例中,我们使用了0x00作为状态码,但在实际应用中,应该根据蓝牙协议和具体需求来选择合适的状态码。
HCI_Link_Key_Request_Negative_Reply命令在蓝牙通信中用于指示链路密钥请求失败的情况,通常与设备兼容性、配置问题、安全简单配对过程中的问题或设备管理与权限控制相关。
在使用HCI_Link_Key_Request_Negative_Reply命令进行蓝牙通信时,需要关注以下关键事项以确保命令的正确执行和蓝牙设备间的稳定连接。
综上所述,HCI_Link_Key_Request_Negative_Reply命令是蓝牙协议栈中用于回应Link Key请求的重要命令之一。当主机没有为指定连接存储Link Key时,应使用此命令进行回应。