【0x000C】HCI_Link_Key_Request_Negative_Reply 命令详解

目录

一、命令概述

二、命令格式及参数说明

2.2. BD_ADDR

三、返回事件及参数

3.1. 生成的事件

3.2. BD_ADDR

2.3. Status

四、命令执行流程场景

4.1. 命令触发条件

4.2. 命令组装与发送

4.3. 控制器接收与处理

4.4. 执行结果反馈

4.5. 事件生成(如果适用)

4.6. 示例代码

五、使用场景

5.1. 安全认证环节

5.2. 设备管理与权限控制场景

5.3. 设备兼容性与协议差异场景

5.4. 命令影响

六、注意事项 

6.1. 命令发送时机与参数设置

6.2. 状态码检查与错误处理

6.3. BD_ADDR准确性

6.4. 命令时效性与同步性

6.5. 协议版本和兼容性

6.6. 安全策略与设备管理


当两个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)、参数长度、以及具体的参数值。

  • 命令操作码(OCF):用于标识这是一个HCI_Link_Key_Request_Negative_Reply命令。
  • 参数长度:表示后续参数的总长度(以字节为单位)。对于HCI_Link_Key_Request_Negative_Reply命令,参数长度通常包括BD_ADDR和Status两个参数的长度。
  • 参数BD_ADDR。

2.2. BD_ADDR

BD_ADDR指定了与链路密钥请求相关的目标蓝牙设备。当主机(Host)发送这个否定回复命令时,它通过BD_ADDR告诉控制器这个回复是针对哪一个具体的设备的链路密钥请求。蓝牙MAC地址-CSDN博客

三、返回事件及参数

3.1. 生成的事件

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

  • 事件名称:HCI_Command_Complete
  • 生成条件:当HCI_Link_Key_Request_Negative_Reply命令执行完成后(无论成功还是失败)。
  • 包含的信息:该事件通常包含命令的操作码(OCF)、返回参数(如Status和BD_ADDR,如果适用)、以及任何额外的状态或结果信息。

3.2. BD_ADDR

BD_ADDR 用于唯一标识已完成 HCI_Link_Key_Request_Negative_Reply 命令的蓝牙设备。

0x 前缀表示这是一个十六进制数,XXXXXXXXXXXX 是地址的具体值,其中每个 X 代表一个十六进制字符(0-9 或 A-F)。 

2.3. Status

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博客

四、命令执行流程场景

4.1. 命令触发条件

当蓝牙主机(Host)收到来自BR/EDR控制器的HCI_Link_Key_Request事件时,如果该主机没有为与请求中指定的BD_ADDR相关联的连接存储链路密钥(Link Key),则会触发HCI_Link_Key_Request_Negative_Reply命令的发送。

4.2. 命令组装与发送

  • 组装命令包
    • 操作码(OCF):设置为0x000C,以标识该命令为HCI_Link_Key_Request_Negative_Reply
    • 参数:BD_ADDR:6个字节,表示请求链路密钥的远程蓝牙设备的地址。
  • 发送命令:主机通过HCI接口将组装好的命令包发送给蓝牙控制器。这个过程涉及多个层次的协议处理,以确保命令能够准确无误地到达目标控制器。

4.3. 控制器接收与处理

  • 接收命令:蓝牙控制器接收来自主机的命令包,并检查操作码以确认是否为HCI_Link_Key_Request_Negative_Reply命令。
  • 处理命令
    • 控制器解析命令包中的BD_ADDRStatus参数。
    • 根据BD_ADDR确定该否定回复是针对哪个具体的设备连接请求。
    • 将否定回复信息传递给相应的模块(如链路管理器),用于处理与目标设备的连接请求后续操作。

4.4. 执行结果反馈

  • 更新命令状态
    • 控制器根据命令的执行情况更新Status参数。
    • 如果命令执行成功(如成功将否定回复信息传递给相关模块,且系统资源足够、通信链路正常等),则Status设置为0x00
  • 返回结果给主机
    • 控制器将包含更新后的StatusBD_ADDR的结果信息打包成一个响应包,并通过HCI接口返回给主机。
    • 主机接收响应包后,根据Status的值判断命令是否成功执行。

4.5. 事件生成(如果适用)

  • HCI_Link_Key_Request_Negative_Reply命令成功完成(即Status0x00)时,会生成一个HCI_Command_Complete事件。
  • 该事件可以被主机中的其他模块捕获,用于通知系统相关部分该命令已经成功执行,并可能触发其他操作(如更新用户界面显示连接被拒绝的信息等)。

4.6. 示例代码

以下是一个简化的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)得到完整的opcodebool 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作为状态码,但在实际应用中,应该根据蓝牙协议和具体需求来选择合适的状态码。

五、使用场景

5.1. 安全认证环节

  • 初次配对失败场景
    • 描述:在蓝牙设备初次配对过程中,若主机未存储与请求连接设备对应的Link Key,会拒绝连接请求。
    • 示例:新蓝牙音箱尝试与手机配对,手机若未预先存储音箱的Link Key,则发送HCI_Link_Key_Request_Negative_Reply命令拒绝请求。
  • 重新连接但密钥丢失场景
    • 描述:已配对设备因某些原因(如恢复出厂设置、数据丢失)导致主机丢失Link Key,当设备再次尝试连接时,主机拒绝其Link Key请求。
    • 示例:用户重置蓝牙耳机后尝试与之前配对过的手机重新连接,手机发现无该耳机的Link Key后,发送否定回复命令。

5.2. 设备管理与权限控制场景

  • 未经授权设备连接拒绝场景
    • 描述:在需要高安全性的环境中,主机拒绝未经授权的蓝牙设备连接请求。
    • 示例:企业内部敏感设备只允许特定蓝牙设备连接,未知设备尝试连接并请求Link Key时,主机发送否定回复命令。
  • 设备连接数量限制场景
    • 描述:主机达到允许连接的蓝牙设备数量上限时,拒绝新的连接请求。
    • 示例:智能手表最多允许同时连接3个蓝牙设备,第四个设备尝试连接并请求Link Key时,手表发送否定回复命令。

5.3. 设备兼容性与协议差异场景

  • 旧设备与新协议不兼容场景
    • 描述:蓝牙协议更新后,旧设备发送不符合新协议要求的Link Key请求,主机无法处理或不支持旧协议版本对应的请求方式时,发送否定回复命令。
    • 示例:蓝牙协议从4.0更新到6.0后,基于旧版本协议设计的蓝牙设备尝试请求Link Key,新主机设备拒绝请求。
  • 不同设备类型之间不兼容场景
    • 描述:不同类型的蓝牙设备安全要求和Link Key管理方式不同,当一种设备的请求不符合另一种设备的安全策略或协议规范时,接收请求的主机发送否定回复命令。
    • 示例:医疗设备蓝牙模块请求连接到普通消费类电子设备,由于医疗设备安全级别较高,其Link Key请求方式不被消费类设备接受,导致消费类设备发送否定回复命令。

5.4. 命令影响

  • 连接失败:当HCI_Link_Key_Request_Negative_Reply命令被发送时,表示当前蓝牙连接尝试失败,设备间无法建立安全连接。
  • 用户操作:用户可能需要重新尝试配对过程,或检查设备的蓝牙设置和兼容性。

HCI_Link_Key_Request_Negative_Reply命令在蓝牙通信中用于指示链路密钥请求失败的情况,通常与设备兼容性、配置问题、安全简单配对过程中的问题或设备管理与权限控制相关。

六、注意事项 

在使用HCI_Link_Key_Request_Negative_Reply命令进行蓝牙通信时,需要关注以下关键事项以确保命令的正确执行和蓝牙设备间的稳定连接。

6.1. 命令发送时机与参数设置

  • 在蓝牙设备尝试建立安全连接且主机无法找到或验证匹配的链路密钥时,及时发送此命令。
  • 确保命令中包含正确的远端设备地址(BD_ADDR)以标识请求链路密钥的设备。
  • 仔细检查并设置状态码(Status),以准确反映命令的执行情况。

6.2. 状态码检查与错误处理

  • 接收控制器返回的结果后,仔细检查状态码,并根据蓝牙核心规范中的错误码列表进行详细的排查和处理。
  • 规划好错误处理机制,如检查连接稳定性、设备兼容性或主机存储中的数据损坏问题,并向用户提供清晰的反馈。

6.3. BD_ADDR准确性

  • 确保BD_ADDR正确标识目标设备,避免命令发送到错误的设备或无法正确识别需要拒绝Link Key请求的设备。
  • 注意BD_ADDR的格式(6个字节)和传输完整性,遵循蓝牙协议规范。

6.4. 命令时效性与同步性

  • 遵守命令响应时间要求,在远程链路管理器检测到LMP响应超时之前发送命令,避免通信双方链路管理器状态不一致。
  • 同步处理与其他蓝牙命令和事件的关系,避免命令顺序混乱或冲突导致的蓝牙连接故障。

6.5. 协议版本和兼容性

  • 考虑不同蓝牙协议版本对命令细节的差异,确保设备所遵循的协议版本与命令的实际使用方式相匹配。
  • 进行充分的兼容性测试,确保在不同品牌、型号的设备之间使用该命令时能够正常工作。

6.6. 安全策略与设备管理

  • 确保发送HCI_Link_Key_Request_Negative_Reply命令符合设备的安全策略,如在企业或安全要求较高的环境中拒绝未经授权的蓝牙设备连接请求。
  • 定期检查设备的蓝牙设置和兼容性,以确保设备间的安全通信。

综上所述,HCI_Link_Key_Request_Negative_Reply命令是蓝牙协议栈中用于回应Link Key请求的重要命令之一。当主机没有为指定连接存储Link Key时,应使用此命令进行回应。

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

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

相关文章

数字产业化和产业数字化到底是什么?

“数字产业化”和“产业数字化”在很多官方文件和领导人讲话中都是成对出现的&#xff0c;这两个术语看起来非常相似&#xff0c;但它们作为数字经济的两个重要组成部分&#xff0c;既有联系又有区别。 在谈数字产业化和产业数字化之前&#xff0c;我这里需要先给大家介绍一个概…

npm或yarn包配置地址源

三种方法 1.配置.npmrc 文件 在更目录新增.npmrc文件 然后写入需要访问的包的地址 2.直接yarn.lock文件里面修改地址 简单粗暴 3.yarn install 的时候添加参数 设置包的仓库地址 yarn config set registry https://registry.yarnpkg.com 安装&#xff1a;yarn install 注意…

文件上传之黑名单检测

一般情况下&#xff0c;代码文件里会有一个数组或者列表&#xff0c;该数组或者列表里会包含一些非法的字符或者字符串&#xff0c;当数据包中含有符合该列表的字符串时&#xff0c;即认定该数据包是非法的。 ​​ 一.如何判断是否为黑名单检测 黑名单是有限的&#xff0c;可以…

光控资本:锂电排产上行 AI手机有望快速渗透

AI手机有望快速渗透 据赛迪参谋猜想&#xff0c;2024年AI手机的出货量估量将会抵达1.5亿部&#xff0c;占全球智能手机总出货量13%&#xff0c;到2027年&#xff0c;全球AI手机销售量有望跨过5.9亿部&#xff0c;占全球智能手机总出货量的比重跨过50%。 跟着硬件根底夯实、端侧…

el-table 动态计算合并行

原始表格及代码 <el-table:data"tableData"class"myTable"header-row-class-name"tableHead" ><el-table-column prop"date" label"日期"> </el-table-column><el-table-column prop"name" …

druid.properties图标是齿轮

一、问题 在IDEA中&#xff0c; druid.properties图标是齿轮 二、原因 2023版本开始&#xff0c;IDEA新的UI的问题 三、解决方法 1、点击右上角的齿轮图标 2、点击Settings 3、Appearance & Behavior---->New UI---->取消勾选“Enable new UI”---->右下角OK 4…

龙海家园地面停车场探寻2

在南山前海上班2年多了&#xff0c;到现在最喜欢的小区还是龙海家园小区。龙海家园小区是深圳目前最大的公共保障性租赁住房小区,目前居住有约2.6万人。而小区的停车位是远远不够的。之前一直很好奇车子可以停哪里。 后面加班之余经常去小区吃饭和转转。发现龙海家园小区与对面…

群控系统服务端开发模式-应用开发-操作记录功能开发

一、开放路由 在根目录下route文件夹下修改app.php文件&#xff0c;代码如下&#xff1a; // 操作日志Route::get(token/get_list,permission.Token/getList);// 获取操作日志列表Route::post(token/get_all,permission.Token/getAll);// 获取操作日志所有数据Route::post(toke…

探索 HTTP 请求头中的 “Host” 字段及其安全风险

探索 HTTP 请求头中的 “Host” 字段及其安全风险 大家好&#xff0c;今天我们来聊聊 HTTP 请求头中的“Host”字段&#xff0c;以及它的使用方法和安全风险。 什么是Host字段 在 HTTP 请求头中&#xff0c;“Host”字段是一个至关重要的部分。它告诉服务器&#xff0c;我们…

Type-C接口电热毯的创新之旅

在科技日新月异的今天&#xff0c;智能家居产品正逐步渗透到我们生活的每一个角落&#xff0c;从智能灯光到温控系统&#xff0c;无一不展现着科技带来的便捷与舒适。而在这个追求高效与智能化的浪潮中&#xff0c;一款结合了最新科技元素的电热毯——Type-C接口电热毯&#xf…

计算机网络知识点全梳理(一.TCP/IP网络模型)

目录 TCP/IP网络模型概述 应用层 什么是应用层 应用层功能 应用层协议 传输层 什么是传输层 传输层功能 传输层协议 网络层 什么是网络层 网络层功能 网络层协议 数据链路层 什么是数据链路层 数据链路层功能 物理层 物理层的概念和功能 TCP/IP网络模型概述…

【MySQL 保姆级教学】用户管理和数据库权限(16)

数据库账户管理是指对数据库用户进行创建、修改和删除等操作&#xff0c;以控制用户对数据库的访问权限。通过账户管理&#xff0c;可以设置用户名、密码、主机地址等信息&#xff0c;确保数据库的安全性和可控性。例如&#xff0c;使用 CREATE USER 创建用户&#xff0c;ALTER…

SpringSecurity使用教程

一、基本使用 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;专门设计用于保护基于 Spring 的应用程序。它不仅提供了全面的安全服务&#xff0c;还与 Spring 框架及其生态系统&#xff08;如 Spring Boot、Spring MVC 等&#xff09;紧密集…

docker 安装mysql 5.7 详细保姆级教程

1. 安装mysql(5.7) docker pull mysql:5.7 若是拉取不了&#xff0c;可以配置下 docker 源 2. 查看是否安装成功 docker images 下图就是成功了 3.创建mysql专用目录、数据挂载目录、配置文件目录 &#xff0c;演示目录在于/home/下 //命令逐条执行cd /home/ mkdir mysql …

fixture装饰器

普通代码案例&#xff1a; python本身执行 import pytestdef init_new():print("init_new...")return Truedef test_case(init_new):if init_new is True:print("如果init_new返回True&#xff0c;就执行用例test_case")if __name__ __main__:#用python本…

【韩顺平Java JDBC学习笔记】

Java JDBC 文章目录 jdbc概述基本介绍jdbc原理示意图 jdbc快速入门JDBC程序编写步骤获取数据库连接5种方式ResultSet[结果集]SQL注入Statement PreparedStatement预处理好处基本使用 JDBC APIJDBCUtils工具类使用工具类 事务基本介绍应用实例模拟经典的转帐业务 - 未使用事务模…

KeepAlive与RouterView缓存

参考 vue动态组件&#xff1c;Component&#xff1e;与&#xff1c;KeepAlive&#xff1e; KeepAlive官网介绍 缓存之keep-alive的理解和应用 Vue3Vite KeepAlive页面缓存问题 vue多级菜单(路由)导致缓存(keep-alive)失效 vue3 router-view keeperalive对于同一路径但路径…

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

为什么要使用数据仓库?

现状和需求 大量的企业经营性数据&#xff08;订单&#xff0c;库存&#xff0c;原料&#xff0c;付款等&#xff09;在企业的业务运营系统以及其后台的(事务型)数据库中产生的。 企业的决策者需要及时地对这些数据进行归类分析&#xff0c;从中获得企业运营的各种业务特征&a…

CSS|07 标准文档流

标准文档流 一、什么是标准文档流 在制作的 HTML 网页和 PS 画图软件画图时有本质上面的区别: HTML 网页在制作的时候都得遵循一个“流的规则:从左至右、从上至下。 使用 Ps 软件画图时可以在任意地方画图。 <!DOCTYPE html> <html lang"en"> <hea…