【0x0012】HCI_Delete_Stored_Link_Key命令详解
目录
一、命令参数
二、命令格式及参数
2.1. HCI_Delete_Stored_Link_Key 命令格式
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
命令将无法再读取这些密钥。
二、命令格式及参数
2.1. HCI_Delete_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
)已被成功删除。0x01
到0xFF
:表示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_ADDRmemcpy(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
命令是蓝牙安全管理中的一个重要工具,用于删除不再需要的链路密钥,从而维护设备的安全性和存储效率。
相关文章:
【0x0012】HCI_Delete_Stored_Link_Key命令详解
目录 一、命令参数 二、命令格式及参数 2.1. HCI_Delete_Stored_Link_Key 命令格式 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. 控制器处理阶段…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证10)
基于Cookie传递token的主要思路是通过用户身份验证后,将生成的token保存到Response.Cookies返回客户端,后续客户端访问服务接口时会自动携带Cookie到服务端以便验证身份。之前一直搞不清楚的是服务端程序如何从Cookie读取token进行认证(一般都…...
应用层协议 HTTP 讲解实战:从0实现HTTP 服务器
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 HTTP 协议 🦋 认识 URL🦋 urlencode 和 urldecode 二:🔥 HTTP 协议请求与响应格式 🦋 HTTP 请求…...
Linux权限管理:从用户切换到文件权限
在Linux系统中,权限管理是确保系统安全和资源合理分配的核心机制。它通过用户和用户组的管理、文件权限的设置以及特殊权限的使用,实现了对系统资源的精细控制。 一、用户切换:su 和 sudo 1. 用户切换命令 su su(switch user&a…...
PyQt5超详细教程终篇
PyQt5超详细教程 前言 接: [【Python篇】PyQt5 超详细教程——由入门到精通(序篇)](【Python篇】PyQt5 超详细教程——由入门到精通(序篇)-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果,方便理…...
Alibaba Spring Cloud 四 Seata 的核心组件:TC
Seata 的 Transaction Coordinator (TC) 是分布式事务架构中的核心组件之一,它负责管理全局事务的生命周期,包括事务的创建、状态维护以及协调各分支事务的提交和回滚。以下是有关 TC 的详细解析及其配置和使用方法: 1. TC 的核心功能 全局事…...
机器学习-线性回归(简单回归、多元回归)
这一篇文章,我们主要来理解一下,什么是线性回归中的简单回归和多元回归,顺便掌握一下特征向量的概念。 一、简单回归 简单回归是线性回归的一种最基本形式,它用于研究**一个自变量(输入)与一个因变量&…...
Java如何向http/https接口发出请求
用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一个工具类 import javax.net.ssl.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Outpu…...
three.js+WebGL踩坑经验合集(1):THREE.Line无故消失的元凶
在项目开发过程中,笔者两次遇到同事的一个提问,我场景中的Line在相机旋转到某些角度或者移动到某些位置的时候会无故消失。由于业务场景复杂,所以这两位同事都是先花费了大量时间排查业务问题,然后才找我求助。这个问题抽象出来的…...
【ROS】RViz2源码分析(四):初始化、启动
【ROS】郭老二博文之:ROS目录 1、简述 RViz2在main函数中,首先注册日志处理函数; 将 RCLCPP_DEBUG 等日志记录函数,通过 rviz_common::set_logging_handlers() 注册到 rviz_common 中。然后,创建界面类 rviz_common::VisualizerApp,并执行初始化 vapp.init(argc, argv)…...
【MySQL】 库的操作
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 库的操作 发布时间:2025.1.23 隶属专栏:MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…...
豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | 🐍 蛇年运势预测 在线体验地址:蛇年…...
新能源汽车充电桩选型以及安装应用
摘要:随着当前经济的不断发展,国家的科技也有了飞速的进步,传统的燃油汽车已经不能适应当前社会的发展,不仅对能源造成巨大的消耗,还对环境造成了污染,当前一种新型的交通运输工具正在占领汽车市场。在环境问题和能源问题愈发严重的当今社会,节能减排已经成为全世界的共同课题,…...
docker Ubuntu实战
目录 Ubuntu系统环境说明 一、如何安装docker 二、发布.netcore应用到docker中 三、查看docker信息 Ubuntu系统环境说明 cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.5 LTS (…...
w-form-select.vue(自定义下拉框组件)(与后端字段直接相关性)
文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…...
深入探索 Nginx 的高级用法:解锁 Web 服务器的强大潜能
在当下互联网技术飞速发展的浪潮中,Nginx 凭借其轻量级、高性能的特性,在 Web 服务器和反向代理服务器领域脱颖而出,成为众多开发者和运维工程师的得力工具。它不仅能高效处理静态资源,在负载均衡、反向代理等方面也表现出色。然而…...
iOS开发设计模式篇第二篇MVVM设计模式
目录 一、什么是MVVM 二、MVVM 的主要特点 三、MVVM 的架构图 四、MVVM 与其他模式的对比 五、如何在iOS中实现MVVM 1.Model 2.ViewModel 3.View (ViewController) 4.双向绑定 5.文中完整的代码地址 六、MVVM 的优缺点 1.优点 2.缺点 七、MVVM 的应用场景 八、结…...
kettle与Springboot的集成方法,完整支持大数据组件
目录 概要整体架构流程技术名词解释技术细节小结 概要 在现代数据处理和ETL(提取、转换、加载)流程中,Kettle(Pentaho Data Integration, PDI)作为一种强大的开源ETL工具,被广泛应用于各种数据处理场景。…...
详解:TCP/IP五层(四层)协议模型
一.五层(四层)模型 1.概念 TCP/IP协议模型分为五层:物理层、数据链路层、网络层、传输层和应用层。这五层每一层都依赖于其下一层给它提供的网络去实现需求。 1)物理层:这是最基本的一层,也是最接近硬件…...
(七)Mapbox GL JS 表达式初识
以下是关于如何在 Mapbox GL JS 中使用表达式的详细讲解和代码示例。 文章目录 什么是 Mapbox GL JS 表达式?使用场景步骤1. 初始化地图2. 解释表达式 总结 什么是 Mapbox GL JS 表达式? Mapbox GL JS 表达式是一种灵活的样式语言,允许你在 …...
阿里巴巴开发规范手册MySQL
1、MySQL 数据库 1.1、建表规约 1) 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)。 说明:任何字段如果为非负数,必须是 unsigned。 注…...
SpringCloud微服务Gateway网关简单集成Sentinel
Sentinel是阿里巴巴开源的一款面向分布式服务架构的轻量级流量控制、熔断降级组件。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助保护服务的稳定性。 官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html …...
Linux下Ubuntun系统报错find_package(BLAS REQUIRED)找不到
Linux下Ubuntun系统报错find_package(BLAS REQUIRED)找不到 这次在windows的WSL2中遇到了一个非常奇怪的错误,就是 CMake Error at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find BLAS (missing: BLAS_LIBRAR…...
私有IP、VLAN和VPC,分别适合哪些场景你知道吗?
当我们在云中构建应用程序,尤其是使用了第三方云服务商的服务并且我们无法完全掌控后端的每部分时,安全性可能是最需要关注的地方。但这是一项充满挑战的工作,因为保护应用程序的方法实在是太多了!为了改善安全性,开发…...
【学术会议论文投稿】深度解码:机器学习与深度学习的界限与交融
目录 一、定义与起源:历史长河中的两条轨迹 二、原理差异:从浅层到深层的跨越 三、代码解析:实战中的机器学习与深度学习 机器学习示例:线性回归 深度学习示例:卷积神经网络(CNN) 四、应用差异:各自领…...
一位前端小白的2024总结
目录 简要 一、迷茫点的解决 (1)前端领域该怎么学? (2)旧技术还需要学吗? (3)我该学些什么? 二、折磨点的解决 (1)学技术成果回报太慢怎么…...
状态模式——C++实现
目录 1. 状态模式简介 2. 代码示例 3. 单例状态对象 4. 状态模式与策略模式的辨析 1. 状态模式简介 状态模式是一种行为型模式。 状态模式的定义:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 通俗的说就是一个对象…...
C# 控制打印机:从入门到实践
在开发一些涉及打印功能的应用程序时,使用 C# 控制打印机是一项很实用的技能。这篇文章就来详细介绍下如何在 C# 中实现对打印机的控制。 一、准备工作 安装相关库:在 C# 中操作打印机,我们可以借助System.Drawing.Printing命名空间&#x…...
【一个按钮一个LED】用STM32F030单片机实现苹果充电器的定时装置
文章目录 前言一、要实现的功能1、循环定时2、倒计时3、指示灯提示4、使用场景二、实现方法1、使用方法2、电路设计三、程序代码和成品1.定时中断子程序2.键值处理3.主函数总结前言 笔者前几年买苹果手机、IPAD配的适配器是A1443型号,这种5V1A,USB-A口、小功率的适配器,苹果…...
ansible自动化运维实战--script、unarchive和shell模块(6)
文章目录 一、script模块1.1、功能1.2、常用参数1.3、举例 二、unarchive模块2.1、功能2.2、常用参数2.3、举例 三、shell模块3.1、功能3.2、常用参数3.3、举例 一、script模块 1.1、功能 Ansible 的 script 模块允许你在远程主机上运行本地的脚本文件,其提供了一…...
LLM大模型实践18-评估(上)——存在一个简单的正确答案
准备数据 products_and_category { "电脑和笔记本": [ "TechPro 超极本", "BlueWave 游戏本", "PowerLite Convertible", "TechPro Desktop", "BlueWave Chromebook" ], "智能手机和配件": [ "…...
力扣-数组-704 二分查找
解析 经典二分,重点在于左闭右闭区间约定好后,根据定义更新边界 代码 class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){int mid (left right) / 2;if(…...
K8S 快速实战
K8S 核心架构原理: 我们已经知道了 K8S 的核心功能:自动化运维管理多个容器化程序。那么 K8S 怎么做到的呢?这里,我们从宏观架构上来学习 K8S 的设计思想。首先看下图: K8S 是属于主从设备模型(Master-Slave 架构),即有 Master 节点负责核心的调度、管理和运维,Slave…...
C#集合操作优化:高效实现批量添加与删除
在C#中,对集合进行批量操作(如批量添加或删除元素)通常涉及使用集合类型提供的方法和特性,以及可能的循环或LINQ查询来高效地处理大量数据。以下是一些常见的方法和技巧: 批量添加元素 使用集合的AddRange方法&#x…...
Unity|小游戏复刻|见缝插针1(C#)
准备 创建Scenes场景,Scripts脚本,Prefabs预制体文件夹 修改背景颜色 选中Main Camera 找到背景 选择颜色,一种白中透黄的颜色 创建小球 将文件夹里的Circle拖入层级里 选中Circle,位置为左右居中,偏上&…...
【Redis】持久化机制
目录 前言: RDB 触发RDB持久化方法有俩种: 1.手动触发 2.自动触发 RDB文件的优缺点: AOF: AOF工作机制:编辑 编辑重写机制: 前言: Redis是一个内存数据库,将数据存储在内存中&…...
AWScurl笔记
摘要 AWScurl是一款专为与AWS服务交互设计的命令行工具,它模拟了curl的功能并添加了AWS签名版本4的支持。这一特性使得用户能够安全有效地执行带有AWS签名的请求,极大地提升了与AWS服务交互时的安全性和有效性。 GitHub - okigan/awscurl: curl-like acc…...
5_高并发内存池项目内存优化、页号与Span映射关系使用基数树优化及测试性能与malloc、free比较
申请/释放 内存大小申请方式释放方式x≤256KB(32页)向ThreadCache申请释放给ThreadCache32页<x≤128页向PageCache申请释放给PageCachex>128页向堆申请释放给堆 一、解决大于256KB的大块内存申请 (一)申请大于256…...
深入剖析C++中cin的原理、应用与进阶实践
一、引言 1.1 研究背景与目的 在 C 编程领域,cin 作为标准输入流对象,扮演着举足轻重的角色,是实现程序与用户交互的关键工具。它允许程序从标准输入设备(通常是键盘)读取数据,并将其存储到程序变量中&am…...
我国的金融组织体系,还有各大金融机构的分类,金融行业的组织
中国金融组织体系介绍 中国金融组织体系是一个复杂而多层次的系统,涵盖了各种类型的金融机构和监管机构。以下是关于中国金融组织体系的详细介绍,包括一行三会等金融监管机构,各大金融机构的分类、涉及的银行以及行业组织。 (一…...
十三、数据的输入与输出(4)
数据的输出 write.table()函数 write.table()函数的基本格式如下所示。 write.table(x, file "", quote TRUE, sep "", eol "\n", na "NA", dec ".", row.names TRUE, c…...
基于Java Web的网上房屋租售网站
内容摘要 本毕业设计题目为《基于Java Web的网上房屋租售网站》,是在信息化时代下充分利用互联网对传统房屋租售方式进行创新,在互联网上进行房屋租售突破了传统方式的局限性。对于房屋租售的当事人都提供了极大的便利。本稳针对了实际用户需求…...
【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作
数据库CRUD操作 1 CRUD简介 CURD是对数据库中的记录进行基本的增删改查操作: 2. Create 新增 语法 INSERT [INTO] table_name[(column [,column] ...)] VALUES(value_list)[,(value_list)] ... # value 后面的列的个数和类型,要和表结构匹配…...
问题修复记录:Linux docker 部署 dify,无法调用宿主机本地服务
使用docker compose启动Dify后,在其中配置本地xinfrence中的模型,报错: get xinference model extra parameter failed, url: http://127.0.0.1:9997/v1/models/bge-m3, error: HTTPConnectionPool(host=‘127.0.0.1’, port=9997): Max retries exceeded with url: /v1/mo…...
【橘子ES】Kibana的分析能力Analytics简易分析
一、kibana是啥,能干嘛 我们经常会用es来实现一些关于检索,关于分析的业务。但是es本身并没有UI,我们只能通过调用api来完成一些能力。而kibana就是他的一个外置UI,你完全可以这么理解。 当我们进入kibana的主页的时候你可以看到这样的布局。…...
如何理解json和json字符串
如何理解网络传输的json到底是什么数据 网络传输的其实是对应的 json字符串 对象,前端接收后会将 json字符串 解析成 json对象 json类型字符串和json对象或者json数组是不一样的,json类型字符串本质是字符串,而json对象是json类型的数据&…...
项目上线后,是否会进行复盘?
是的,定期复盘在软件测试项目里极为关键,我会按以下步骤开展复盘工作: 复盘周期确定 短期项目:针对周期较短(如 1 - 2 个月)的项目,会在项目结束后的一周内进行复盘,确保大家对项目…...
基于 WEB 开发的手机销售管理系统设计与实现内容
标题:基于 WEB 开发的手机销售管理系统设计与实现 内容:1.摘要 摘要:随着智能手机的普及和电子商务的快速发展,手机销售行业面临着越来越多的挑战和机遇。为了提高销售效率和管理水平,本文设计并实现了一个基于 WEB 的手机销售管理系统。该系…...
SpringBoot篇 单元测试 理论篇
1.单元测试概念介绍 简单来说,单元测试是对软件中的最小可测试单元进行检查和验证。在 Java 中,单元测试的最小单元是类。Spring Boot 提供了 spring-boot-starter-test 依赖,包含了 JUnit、Mockito、Hamcrest 等常用的测试框架1。࿰…...
并发编程 - 线程同步(一)
经过前面对线程的尝试使用,我们对线程的了解又进一步加深了。今天我们继续来深入学习线程的新知识 —— 线程同步。 01、什么是线程同步 线程同步是指在多线程环境下,确保多个线程在同时使用共享资源时不会发生冲突或数据不一致问题的技术,保…...