【HFP】深入解析蓝牙 HFP 协议中呼叫转移、呼叫建立及保持呼叫状态的机制
目录
一、核心指令概述
1.1 AT+CMER:呼叫状态更新的 “总开关”
1.2 AT+BIA:指示器的 “精准控制器”
1.3 指令对比
1.4 指令关系图示
二、+CIEV 结果码:状态传递的 “信使”
2.1 工作机制
2.2 三类核心指示器
三、状态转移流程详解
3.1 呼叫状态转移(Transfer of Call Status)
3.2 呼叫建立状态转移(Transfer of Callsetup Status)
3.3 保持呼叫状态指示(Indication of Status for Held Calls)
四、特殊场景处理
4.1 未知指示器处理
4.2 网络事件处理
4.3 多呼叫场景处理
五、实现建议
六、调试与测试方法论
6.1 测试用例设计
6.2 日志分析技巧
七、总结
在蓝牙免提协议(Hands-Free Profile, HFP)的应用开发中,通话状态管理是核心功能之一。文将围绕 HFP 协议中 呼叫转移(Transfer of Call)、呼叫建立(Call Setup)以及保持呼叫状态(Held Call Status)相关内容展开深入探讨,结合 AT 指令的运用,详细解析其工作机制与应用场景。
一、核心指令概述
1.1 AT+CMER:呼叫状态更新的 “总开关”
-
功能:在 HFP 协议体系下,AT+CMER 指令发挥着关键作用。主要功能是在 AG(音频网关,Audio Gateway)中启用 “呼叫状态指示器更新” 功能。当此功能被激活后,AG 能够实时监测自身呼叫状态的变化,并及时向 HF(免提设备,Hands - Free unit)反馈这些状态变更信息,从而确保 HF 始终能获取到最新的呼叫状态。
-
参数:
AT+CMER=<mode>
(mode=0/1) -
示例:
AT+CMER=1
开启状态通知
1.2 AT+BIA:指示器的 “精准控制器”
-
功能:AT+BIA 指令主要用途是允许 HF 对 AG 的各个指示器进行停用或重新激活操作。然而,需要特别注意的是,该指令对呼叫、呼叫建立以及保持呼叫指示器并不生效,即无法通过 AT+BIA 指令来停用这些特定的指示器。这一特性确保了与呼叫直接相关的关键状态信息始终能够稳定地传输与反馈,不受其他指示器操作的干扰。
-
限制:无法禁用呼叫 / 呼叫建立 / 保持呼叫状态指示
1.3 指令对比
表格 还在加载中,请等待加载完成后再尝试复制
1.4 指令关系图示
二、+CIEV 结果码:状态传递的 “信使”
2.1 工作机制
当 AT+CMER 功能开启后,AG 通过 +CIEV unsolicited result code(非请求结果码)实时推送状态变更:
-
触发条件:呼叫状态、呼叫建立状态、保持呼叫状态任一变化
-
传递内容:携带对应指示器(call、callsetup、callheld)及其数值
2.2 三类核心指示器
①呼叫状态(Call Status)
呼叫状态指示器用于表示AG上当前是否有呼叫存在。其值如下:
-
0
:无呼叫(无论是保持还是活动状态) -
1
:存在呼叫(活动或保持状态)
当AG上的呼叫状态发生变化时,如呼叫建立、保持、恢复或结束,AG将向HF发送包含相应呼叫状态值的+CIEV
结果代码。
②呼叫建立状态(Call Setup Status)
呼叫建立状态指示器用于表示AG上当前是否有呼叫建立过程正在进行。其值如下:
-
0
:无呼叫建立正在进行 -
1
:有入局呼叫建立正在进行 -
2
:有出局呼叫建立处于拨号状态 -
3
:有出局呼叫建立处于振铃状态
当AG的呼叫建立状态发生变化时,如接收到入局呼叫、发起出局呼叫、呼叫进入拨号或振铃状态等,AG将向HF发送包含相应呼叫建立状态值的+CIEV
结果代码。
③保持呼叫状态(Held Call Status)
保持呼叫状态指示器用于表示AG上当前是否有呼叫被保持。其值如下:
-
0
:无呼叫被保持 -
1
:有呼叫被保持或活动/保持呼叫被交换(AG同时有活动和保持呼叫) -
2
:有呼叫被保持,无活动呼叫
当AG上的保持呼叫状态发生变化时,如呼叫被保持、恢复、交换或结束等,AG将向HF发送包含相应保持呼叫状态值的+CIEV
结果代码。
三、状态转移流程详解
3.1 呼叫状态转移(Transfer of Call Status)
当音频网关(AG,如手机)的通话状态(活跃/保持的通话存在性)发生变化时,通过+CIEV
命令主动向免提设备(HF,如车载系统)同步最新状态。此机制用于实现通话状态的实时可视化(如车载屏幕显示通话图标)。
呼叫状态指示器取值定义:
关键扩展说明:
-
多方通话场景下,只要存在至少一个通话(无论活跃或保持),状态值保持为1
-
从保持状态恢复通话不会触发
call
状态变更(需结合callheld
状态判断)
执行前提条件:
-
HF已通过
AT+CMER
命令启用"Indicators status update"功能 -
AG 与 HF 设备间已建立服务级连接(Service Level Connection,蓝牙通信链路)。
典型触发场景与响应: 当 AG 中的呼叫被释放(由 AG 主动挂断、网络事件触发或 HF 操作导致),使 AG 进入无呼叫状态时,AG 需主动向 HF 发送一条非请求结果码(+CIEV),其中呼叫指示器值设为 0
。例如:
+CIEV: call,0
HF 接收到该信息后,可更新界面显示为 “空闲” 状态,或关闭与通话相关的音频提示,确保设备状态与 AG 同步。
测试用例设计参考
### 测试用例1:单通话音量挂断
**预置条件**:
- HF与AG已配对连接
- 存在活跃通话(call=1)**测试步骤**:
1. 通过手机端挂断通话
2. 观察HF日志输出**预期结果**:
- 收到`+CIEV call,0`
- 车载屏幕通话图标消失### 测试用例2:多方通话保持场景
**预置条件**:
- 存在两个通话(1个活跃,1个保持)**测试步骤**:
1. 挂断活跃通话
2. 保持通话转为活跃**预期结果**:
- call状态保持为1
- callheld状态从1变为2
3.2 呼叫建立状态转移(Transfer of Callsetup Status)
当音频网关(AG)的呼叫建立状态发生变化时,AG 需执行特定流程,将当前呼叫建立的状态变更信息通知给免提设备(HF)。实时同步呼叫建立流程的阶段性状态(如来电振铃、去电拨号等),通过+CIEV callsetup
指令实现AG(手机)与HF(车载/耳机)的交互式状态同步。该机制是来电/去电可视化提示(如屏幕闪烁、语音播报)的技术基础。
①状态值语义与触发逻辑
状态值 | 技术含义 | 触发场景示例 | 生命周期阶段 |
0 | 无进行中的呼叫建立流程 | 所有呼叫流程终止 | 稳态 |
1 | 来电等待接听(网络侧已发送呼叫请求) | 手机收到来电推送 | 呼叫建立期(被叫侧) |
2 | 去电拨号指令已发送(等待网络响应) | 用户点击拨号键 | 呼叫建立期(主叫侧) |
3 | 远端设备已振铃(网络确认呼叫建立中) | 听到回铃音 | 呼叫建立期(网络协商) |
关键特征:
-
状态单向流动:1/2/3→0(呼叫建立完成或取消)
-
互斥性:同一时间仅存在一个非零状态值
-
超时重置:若30秒未完成状态转换,AG应强制回0(防状态挂起)
②执行前提条件:
-
HF 已在 AG 中启用 “指示器状态更新” 功能(通常通过 AT 指令配置);
-
AG 与 HF 设备间已建立服务级连接(Service Level Connection,蓝牙通信链路)。
③状态流转与重置规则
-
状态更新:
-
当 AG 检测到呼入来电,发送
+CIEV: callsetup,1
至 HF; -
若 HF 发起呼出呼叫,AG 按流程依次发送
+CIEV: callsetup,2
(拨号中)→+CIEV: callsetup,3
(振铃中)。
-
-
状态重置: 一旦 AG 通过网络功能确认呼叫已达到端到端连接(即通话已接通),需将呼叫建立指示器重置为
0
,并发送+CIEV: callsetup,0
至 HF,表明当前无呼叫建立进程。例如:
④状态机示意图
⑤特殊场景处理指南
异常场景 | 现象 | 解决方案 |
状态顺序错乱 | 未经历状态2直接进入状态3 | 记录错误日志,强制重置为0 |
状态滞留 | 长时间停留在状态2/3未更新 | 启动超时定时器(建议值:30秒),主动发送AT+CLCC查询 |
跨协议冲突 | 通话已连接但未收到状态0 | 比对AT+CLCC返回的详细状态,手动修正 |
多设备干扰 | 其他设备接听导致状态不同步 | 实现设备优先级管理,高优先级设备操作后广播状态更新 |
⑥测试用例设计
基础功能测试:
### 用例ID: CS-001
**测试项**: 来电状态完整流程
**预置条件**:
- HF与AG正常连接
- 当前callsetup=0 **操作步骤**:
1. 模拟基站发送来电请求
2. 等待10秒不接听
3. 模拟网络侧取消呼叫 **预期结果**:
- 收到顺序状态: 1 → 0
- HF播放铃声后自动停止
边界条件测试:
### 用例ID: CS-005
**测试项**: 快速连续拨号
**预置条件**:
- 存在已保存的快速拨号列表 **操作步骤**:
1. 在0.5秒内连续触发3个不同号码的拨号请求
2. 观察状态变化顺序 **预期结果**:
- 状态按2→3→0顺序完整执行每个拨号流程
- 未出现状态值跳跃(如2直接跳0)
3.3 保持呼叫状态指示(Indication of Status for Held Calls)
当音频网关(AG)中处于保持状态的呼叫发生状态变更时,AG 需执行特定流程,将当前保持呼叫的状态信息通知给免提设备(HF)。
保持呼叫状态指示器取值定义:
状态值 | 技术定义 | 典型场景 | 触发条件 |
0 | 无任何保持的通话 | 所有通话释放 | 最后一条保持通话被释放 |
1 | 存在活跃+保持通话(或切换位置) | 通话保留/多方切换 | 将活跃通话转为保持,或通过AT+CHLD=4交换通话位置 |
2 | 仅存在保持的通话 | 单通话保持/多方中活跃方挂断 | 主动保持单通话,或多方通话中活跃方挂断 |
状态迁移图:
执行前提条件
-
HF 已在 AG 中启用 “呼叫状态指示器” 功能(通常通过 AT 指令配置);
-
AG 与 HF 设备间已建立服务级连接(Service Level Connection,蓝牙通信链路)。
典型状态变化与通知
场景一:活跃通话被保持
当 HF 或 AG 将某活跃通话置于保持状态,且此时 AG 同时存在活跃与保持通话(或发生通话状态互换),AG 需发送:
+CIEV: callheld,1
场景二:恢复或释放保持呼叫
-
当 HF/AG 主动释放保持呼叫,或通过网络事件导致保持呼叫结束,AG 需发送:
+CIEV: callheld,0
场景三:单通保持或活跃通话终止
-
若仅有一个通话被保持(无活跃通话),或活跃通话结束后仍有呼叫处于保持状态,AG 需发送:
+CIEV: callheld,2
特殊场景处理指南
异常场景 | 现象 | 解决方案 |
幽灵保持状态 | 显示保持状态但实际无通话 | 对比AT+CLCC返回的通话列表强制修正 |
状态震荡 | 快速切换导致状态值频繁跳变 | 增加状态变化防抖机制(建议200ms阈值) |
跨设备冲突 | 其他设备操作改变保持状态 | 实现设备操作锁机制,在关键操作期间阻止其他设备介入 |
网络延迟异常 | 保持操作后未及时收到状态更新 | 实现操作确认超时机制(建议5秒),超时后重新查询 |
测试用例矩阵
基础功能测试
### 用例ID: CH-003
**测试项**: 单通话保持/恢复
**预置条件**:
- 存在单条活跃通话(call=1, callheld=0) **操作步骤**:
1. 发送AT+CHLD=2(保持通话)
2. 等待状态更新
3. 发送AT+CHLD=2(恢复通话) **预期结果**:
- 状态顺序: callheld=2 → callheld=0
- UI显示保持图标→恢复正常通话界面
边界条件测试
### 用例ID: CH-007
**测试项**: 最大保持通话容量
**预置条件**:
- 设备支持5方会议 **操作步骤**:
1. 建立4个保持的通话
2. 尝试保持第五个通话 **预期结果**:
- 收到callheld=1(前四次)
- 第五次操作返回ERROR
- UI显示"达到最大保持数"
四、特殊场景处理
4.1 未知指示器处理
HF应能够解析+CIEV
结果代码中提供的未知指示器。虽然HF不需要为这些未知指示器提供用户界面指示,但应能够正确解析并处理它们,以确保与未来可能添加的新指示器兼容。
4.2 网络事件处理
当AG由于网络事件(如呼叫被网络挂断)导致呼叫状态变化时,AG应按照上述流程向HF发送相应的+CIEV
结果代码。HF应能够正确解析这些结果代码,并更新本地呼叫状态显示。
4.3 多呼叫场景处理
在多呼叫场景中,如AG同时有活动和保持呼叫时,AG应发送包含callheld
指示器值为1
的+CIEV
结果代码。当活动呼叫被挂断或保持呼叫被恢复时,AG应发送相应的+CIEV
结果代码以更新HF上的呼叫状态显示。
五、实现建议
①启用“呼叫状态指示器更新”功能
在HF初始化时,应通过AT+CMER
命令启用“呼叫状态指示器更新”功能,以便及时接收AG上的呼叫状态变化通知。
②解析+CIEV
结果代码
HF应实现+CIEV
结果代码的解析逻辑,根据结果代码中的指示器值和值域更新本地呼叫状态显示。同时,应能够处理未知指示器,以确保与未来协议版本的兼容性。
③处理网络事件和多呼叫场景
在实现中,应考虑网络事件和多呼叫场景对呼叫状态的影响。例如,当接收到网络挂断通知时,应正确更新本地呼叫状态显示;在多呼叫场景中,应能够正确处理活动和保持呼叫的切换和恢复操作。
④优化用户体验
为了提高用户体验,HF可以在接收到+CIEV
结果代码后,通过振动、提示音或屏幕提示等方式通知用户呼叫状态的变化。同时,应提供简洁明了的用户界面,以便用户能够轻松查看和管理当前呼叫状态。
六、调试与测试方法论
6.1 测试用例设计
状态覆盖矩阵:
测试用例ID | 初始状态 | 触发动作 | 预期输出 |
TC-001 | call=0 | 拨打电话 | +CIEV call,1 |
TC-002 | call=1, callheld=0 | 保持通话 | +CIEV callheld,1 → 2 |
6.2 日志分析技巧
关键日志模式识别:
正常流程:
[AG] Send: +CIEV call,1
[HF] Recv: AT+CLCC
[AG] Send: +CLCC: 1,1,0,0,...异常模式:
[AG] Send: +CIEV call,1
[HF] Recv: AT+CHLD=2 (未开启CMER)
七、总结
本文详细解析了蓝牙协议中与呼叫状态、呼叫建立及保持呼叫状态相关的功能,包括AT+CMER
、AT+BIA
等命令的使用以及+CIEV
结果代码的含义和作用。通过对这些协议细节的解析,我们了解到蓝牙设备之间的呼叫状态管理是一个复杂而关键的功能,它涉及多个命令和结果代码的交互。为了实现高质量的蓝牙应用,需要深入理解这些协议细节,并在实现中充分考虑各种特殊场景和用户体验优化。
相关文章:
【HFP】深入解析蓝牙 HFP 协议中呼叫转移、呼叫建立及保持呼叫状态的机制
目录 一、核心指令概述 1.1 ATCMER:呼叫状态更新的 “总开关” 1.2 ATBIA:指示器的 “精准控制器” 1.3 指令对比 1.4 指令关系图示 二、CIEV 结果码:状态传递的 “信使” 2.1 工作机制 2.2 三类核心指示器 三、状态转移流程详解 3…...
音频识别优化(FFT)
整合多频段检测、动态阈值调整和持续时长验证的完整代码实现,包含详细注释: #include "esp_dsp.h" #include "driver/i2s.h" #include "esp_log.h" #include "math.h" static const char* TAG "ADV_FRE…...
【Redis】Redis基本命令(1)
KEYS 返回所有满足样式(pattern)的key。 KEY * 返回所有key,不简易使用 性能问题:当 Redis 存储百万级键时,会消耗大量 CPU 和内存资源,Redis 是单线程模型,KEYS * 执行期间会阻塞其他所有命令…...
IDEA2024 pom.xml依赖文件包报红解决
异常: 原因: 本地的Maven Repository库中不存在对应版本的dependency依赖,所以导致报红。 解决: 方法1:找到对应项目,右键Sync Project 就可以了 方法2:修改setting中maven的自动更新…...
Qt 信号与槽复习
Qt 信号与槽复习 Qt 信号与槽(Signals and Slots)机制是 Qt 框架的核心特性之一,用于实现对象之间的通信。它提供了一种松耦合的方式,使得组件可以独立开发和复用,广泛应用于 GUI 编程、事件处理和跨模块交互。本文将…...
RestControllerAdvice 和 ControllerAdvice 两个注解的区别与联系
它们都用于实现全局的通用处理逻辑,主要应用在以下三个方面: 全局异常处理: 使用 ExceptionHandler 注解的方法。全局数据绑定: 使用 InitBinder 注解的方法。全局数据预处理: 使用 ModelAttribute 注解的方法。 联系: 核心功能相同: 两者都提供了上述…...
最快打包WPF 应用程序
在 Visual Studio 中右键项目选择“发布”,目标选“文件夹”,模式选“自包含”,生成含 .exe 的文件夹,压缩后可直接发给别人或解压运行,无需安装任何东西。 最简单直接的新手做法: 用 Visual Studio 的“…...
Java NIO Java 虚拟线程(微线程)与 Go 协程的运行原理不同 为何Go 能在低配机器上承接10万 Websocket 协议连接
什么是Java NIO? Java NIO(New Input/Output) 是Java 1.4(2002年)引入的一种非阻塞、面向缓冲区的输入输出框架,旨在提升Java在高性能和高并发场景下的I/O处理能力。它相比传统的 Java IO(java…...
C# 对列表中的元素的多个属性进行排序
目录 前言一、OrderBy、OrderByDescending、ThenBy、ThenByDescending二、Sort 前言 在开发过程中,我们经常需要 根据列表中的元素的某个属性进行排序,下面我们将简单介绍常用的排序函数。 例如此处有一个类,拥有的元素为编号和值 public …...
OpenCV颜色变换cvtColor
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 颜色变换是imgproc模块中一个常用的功能。我们生活中看到的大多数彩色图片都是RGB类型的,但是在进行图像处理时需要用到灰度图、二值图、HSV(六角锥体模型,这个模型中颜色的…...
java IO/NIO/AIO
(✪▽✪)曼波~~~~!让曼波用最可爱的赛马娘方式给你讲解吧!(⁄ ⁄•⁄ω⁄•⁄ ⁄) 🎠曼波思维导图大冲刺(先看框架再看细节哦): 📚 解释 Java 中 IO、NIO、AIO 的区别和适用场景: …...
如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系
一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体(如用户、进程)和客体(如文件、数据库、设备)的安全属性,用于标记其安全等级、权限、访问能力或受保护级别,即用于标识其安全等级、权限范围或约束…...
宜搭与金蝶互通——连接器建立
一、 进入连接器工厂 图1 连接器入口 二、 新建连接器 图2 新建连接器第一步 1、 连接器显示名,如图2中①所示; 2、 图2中②域名,是金蝶系统API接口里面的“完整服务地址”com之前的信息,不含“https”,如图3中①所示; 3、 Base Url通常为“/”,如图2…...
中间件--ClickHouse-7--冷热数据分离,解决Mysql海量数据瓶颈
在web应用中,当数据量非常大时,即使MySQL的存储能够满足,但性能一般也会比较差。此时,可以考虑使用ClickHouse存储历史数据,在Mysql存储最近热点数据的方式,来优化和提升查询性能。ClickHouse的设计初衷就是…...
1.1 设置电脑开机自动用户登录exe开机自动启动
本文介绍两个事情: 1.Windows如何开机自动登录系统(不用输密码) 2. 应用程序(.exe)如何开机自动启动 详细解释如下: 一、Windows如何开机自动登录系统(不用输密码) 设备上的工控机,如果开机后都需要操作人员输入密码&…...
vscode stm32 variable uint32_t is not a type name 问题修复
问题 在使用vscodekeil开发stm32程序时,发现有时候vscode的自动补全功能失效,且problem窗口一直在报错。variable “uint32_t” is not a type name uint32_t 定义位置 uint32_t 实际是在D:/Keil_v5/ARM/ARMCC/include/stdint.h中定义的。将D:/Keil_v5…...
动态规划与记忆化搜索的区别与联系
记忆化搜索(Memoization)和动态规划(Dynamic Programming, DP)都是解决重叠子问题的高效算法技术,但它们有着不同的实现方式和特点。 1. 基本概念 记忆化搜索(自顶向下) 本质:带有…...
html+js+clickhouse环境搭建
实验背景: 我目前有一台服务器A,和一台主机B,两台设备属于同一局域网,相互之间可以通讯。服务器A中部署着clickhouse,我在主机B中想直接通过javascript代码访问服务器中的clickhouse数据库并获取数据。 ClickHouse 服务…...
生命护航行动再启航!
温州好人陈飞携防溺水课堂,为乡村少年宫筑起安全防线 图文作者:华夏之音/李望 随着夏日热浪的滚滚而来,楠溪江畔的安全警钟再次响起。在这片如诗如画的土地上,一场旨在保护青少年生命安全的防溺水课堂活动拉开了…...
Android Compose Activity 页面跳转动画详解
下面我将全面详细地介绍在 Compose 中实现 Activity 跳转动画的各种方法,包括基础实现、高级技巧和最佳实践。 一、基础 Activity 过渡动画 1. overridePendingTransition 传统方式 这是最基础且兼容性最好的方法,适用于所有 Android 版本。 实现步骤…...
Android启动初始化init.rc详解
1. Android启动与init.rc简介 1.1 Android启动过程 一张图简单阐述一下 (网络图片,侵删) 1.2 init.rc 简介 Linux的重要特征之一就是一切都是以文件的形式存在的,例如,一个设备通常与一个或多个设备文件对应。这些…...
Linux驱动开发-①regmap②IIO子系统
Linux驱动开发-IIO驱动 一,regmap二,IIO子系统2.1初始化相关工作2.2 通道2.3 读实现 over 一,regmap 对于spi和i2c,读写寄存器的框架不同,但设备本质一样,因此就有了regmap模型来对其进行简化,提供统一的接…...
HTML5好看的水果蔬菜在线商城网站源码系列模板5
文章目录 1.设计来源1.1 主界面1.2 关于我们1.3 商品服务1.4 果蔬展示1.5 联系我们1.6 商品具体信息1.7 登录注册 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址&#…...
L2-033 简单计算器满分笔记
本题要求你为初学数据结构的小伙伴设计一款简单的利用堆栈执行的计算器。如上图所示,计算器由两个堆栈组成,一个堆栈 S1 存放数字,另一个堆栈 S2 存放运算符。计算器的最下方有一个等号键,每次按下这个键,计算器就…...
其他网页正常进入,但是CSDN进入之后排版混乱
显示不正常,排版混乱 解决方法: ①打开网络设置 ②更改适配器 ③所连接的网络 --右键 属性 然后就可以正常访问了。...
BFC详解
1.定义: FC的全称为Formatting Conttext,元素在标准流里面 块级元素的布局属于Block Formatting Context(BFC)——即block level box都是BFC中布局 行内级元素的布局属于Inline Formatting Context (IFC) 2.那么在哪些情况下会创建BFC? 根元素…...
(H3C)vlan配置实验
1.实验拓扑 2.实验配置 [S1]dis cu #version 7.1.070, Alpha 7170 #sysname S1 # vlan 10 # vlan 20 # interface GigabitEthernet1/0/1port link-mode bridgeport link-type trunkport trunk permit vlan 1 10 20combo enable fiber # interface GigabitEthernet1/0/2port li…...
idea mvn执行打包命令后控制台乱码
首先在idea中查看maven的编码方式 执行mvn -v命令 查看编码语言是GBK C:\Users\13488>mvn -v Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f) Maven home: D:\maven\apache-maven-3.6.3\bin\.. Java version: 1.8.0_202, vendor: Oracle Corporation, runt…...
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识
JSON.parse(JSON.stringify()) 与 lodash 的 cloneDeep:深度拷贝的比较与基础知识 在 JavaScript 开发中,**深拷贝(Deep Copy)**是一个常见需求,尤其是在处理复杂对象和嵌套数据结构时。JSON.parse(JSON.stringify(o…...
搭建用友U9Cloud ERP及UAP IDE环境
应用环境 Microsoft Windows 10.0.19045.5487 x64 专业工作站版 22H2Internet Information Services - 10.0.19041.4522Microsoft SQL Server 2019 - 15.0.2130.3 (X64)Microsoft SQL Server Reporing Services 2019 - 15.0.9218.715SQL Server Management Studio -18.6 laster…...
Linux 系统新磁盘分区XFS挂载
以下是Linux系统中对新硬盘进行XFS文件系统格式化和挂载的完整操作指南: 一、确认硬盘识别 查看已识别硬盘 执行 lsblk 或 fdisk -l 命令,确认新硬盘设备标识(如 /dev/sdb)。 二、硬盘分区(可选) …...
Oracle测试题目及笔记(单选)
所有题目来自于互联网搜索 当 Oracle 服务器启动时,下列哪种文件不是必须的(D)。 A.数据文件 B.控制文件 C.日志文件 D.归档日志文件 数据文件、日志文件-在数据库的打开阶段使用 控制文件-在数…...
C语言链接数据库
目录 使用 yum 配置 mysqld 环境 查看 mysqld 服务的版本 创建 mysql 句柄 链接数据库 使用数据库 增加数据 修改数据 查询数据 获取查询结果的行数 获取查询结果的列数 获取查询结果的列名 获取查询结果所有数据 断开链接 C语言访问mysql数据库整体源码 通过…...
深入浅出 Redis:核心数据结构解析与应用场景Redis 数据结构
引言:Redis 为何如此之快?数据结构是关键 Redis (Remote Dictionary Server) 作为一款高性能的内存键值数据库,凭借其闪电般的速度和丰富的功能,在缓存、消息队列、排行榜等众多场景中得到了广泛应用。除了基于内存存储这一核心优…...
告别昂贵语音合成服务!用GPT-SoVITS生成你的个性化AI语音
文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天给大家介绍一款AI语音克隆工具——GPT-SoVITS。这款由花儿不哭大佬开发的工具是一款强大的训练声音模型与音频生成工具…...
前沿要塞:Vue组件安全工程的防御体系重构与技术突围
总章数字世界的钢铁长城 在某个凌晨3点的红蓝对抗演练中,某电商平台因组件级XSS漏洞导致千万级用户数据泄露。这不是虚构的灾难场景,而是2023年某A轮企业的真实遭遇。当传统安全方案在新型攻击面前节节败退时,我们需要为Vue组件铸造全新的数字…...
吴恩达深度学习复盘(19)XGBoost简介|神经网络与决策树
XGBoost 多年来,机器学习研究人员提出了许多构建决策树的方法,目前最常用的方法是对样本或决策树的实现收费。其中,XGBoost 是一种非常快速且易于使用的开源实现,已成功用于赢得许多机器学习竞赛和商业应用。 算法原理 基本思想…...
Docker部署禅道21.6开源版本
将数据库相关环境变量分开,增加注释或空格使得命令更易读。 如果你的 MySQL 主机、端口等配置没有变化,应该确保这些信息是安全的,并考虑使用 Docker secrets 或环境变量配置来避免直接暴露敏感信息。 docker run -d -it --privilegedtrue …...
《MySQL:MySQL表结构的基本操作》
创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集,则以所在数据…...
C++解析操作mat文件方法-基于vs2019
前言 工作中需要将C#脚本转为C++,所转脚本主要功能是进行mat数据文件的解析和矩阵运算。 1.C#版本 原C#脚本主要是基于 MathNet.Numerics.data.Matlab、MathNet.Numerics.LineAlgebra.Double、 MathNet.Numerics.LineAlgebra 中的MatlabReader、DenseMatrix、Matrix进行mat文…...
OpenCV 模板匹配方法详解
文章目录 1. 什么是模板匹配?2. 模板匹配的原理2.1数学表达 3. OpenCV 实现模板匹配3.1基本步骤 4. 模板匹配的局限性5. 总结 1. 什么是模板匹配? 模板匹配(Template Matching)是计算机视觉中的一种基础技术,用于在目…...
自已实现一个远程打印方案 解决小程序或APP在外面控制本地电脑打印实现
常规通过小程序或APP在外出时控制本地电脑实现打印功能,可以结合远程桌面技术、云打印服务或开发定制化的远程打印解决方案。 但这里我们采用自已的实现方案来解决 服务器端实现 搭建一个后端socket服务,监听来自手机的打印请求。监听到打印任务后向本…...
Oracle_00000
contents 基本使用 基本使用 Oracle安装后会自动创建sys和system这两个用户。 sys用户:具有最高权限。具有sysdba角色,有create database的权限。该用户默认密码是:manager system用户:管理员用户,具有sysoper角色。没…...
深入剖析 ORM:原理、优缺点、场景及多语言框架示例
ORM 即对象关系映射(Object Relational Mapping),它是一种编程技术,其作用是在面向对象编程语言里,把对象模型和关系型数据库的数据结构之间创建起映射,这样开发者就能够使用面向对象的方式来操作数据库&am…...
ARINC818协议-持续
一、帧头帧尾 SOF 和 EOF 分别代表视频帧传输的开始与结束,它们在封装过程有多种状态,SOF 分为 SOFi 和 SOFn,EOF 分为 EOFt 和 EOFn。传输系统中的视频信息包括像素数据信 息和辅助数据信息,分别存储在有效数据中的对象 0 和对象…...
【uniapp】uni.setClipboardData 方法失效 bug 解决方案
写了一个 copy 方法,但是怎么也没有弹窗复制成功 <text click"toCopy(myInfo.id)">复制 </text> 逐步打印发现 1 正常打印,2 没有打印,说明问题出现在 setClipboardData 方法执行中 toCopy(n) {// console.log(1,ty…...
智能sc一面
智能sc一面-2025/4/17 更多完善:真实面经 Java 的异常分类 异常分为两类,一类Error,一类Execption。这两个类都是Throwable的子类,只有继承Throwable 的类才可以被throw或者catch Error: 表示严重的系统问题,通常与代码无关&am…...
SAP HANA使用命令行快速导出导入
楔子 今天折腾了接近一下午,就为了使用SAP HANA自带的命令行工具来导出数据备份。 SAP HANA(后续简称Hana)是内存数据库,性能这一方面上还真没怕过谁。 由于SAP HANA提供了Hana Studio这个桌面工具来方便运维和DBA使用…...
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比
Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比 一 基本概述对比 特性DBMS_JOB (旧版)DBMS_SCHEDULER (新版)引入版本Oracle 7 (1992年)Oracle 10g R1 (2003年)当前状态已过时但仍支持推荐使用的标准设计目的基础作业调度企业级作业调度系统 二 功能特性对比 2.1 作业定义能力 …...
【音视频】音视频FLV合成实战
FFmpeg合成流程 示例本程序会⽣成⼀个合成的⾳频和视频流,并将它们编码和封装输出到输出⽂件,输出格式是根据⽂件扩展名⾃动猜测的。 示例的流程图如下所示。 ffmpeg 的 Mux 主要分为 三步操作: avformat_write_header : 写⽂件…...