当前位置: 首页 > news >正文

FreeSwitch的mod_spandsp模块

FreeSWITCH 的 mod_spandsp 模块是一个基于 Spandsp 库 的核心模块,主要用于实现 传真(Fax)DTMF 信号处理 以及 语音编解码转换 等功能。它通过集成 SpandSP 的数字信号处理能力,使 FreeSWITCH 能够与传统通信系统(如传真机、PSTN)无缝交互,是现代 VoIP 系统中支持传统业务的关键模块。


一、核心功能

  1. 传真支持(T.30/T.38)

    • T.30 传真协议:支持传统 PSTN 传真(G.711 音频带内传输),适用于模拟线路或 VoIP 中的透传模式。
    • T.38 实时传真:通过 IP 网络直接传输传真数据包,避免语音编码(如压缩)导致的信号失真,提升可靠性。
    • 传真收发:支持生成和解析 TIFF/F 文件,实现电子传真的发送与接收。
    • 透传(Passthrough)模式:将传真信号作为音频流传输,依赖网络质量,适用于不支持 T.38 的环境。
  2. DTMF 检测与生成

    • 带内 DTMF:通过音频流检测 DTMF 号码(如按键音),适用于 RTP 流。
    • RFC 2833 和 SIP INFO:支持带外 DTMF 传输,提高识别准确性和效率。
  3. 语音处理

    • 编解码转换:支持 G.711、G.723、G.729 等编解码的实时转码。
    • 回声消除(可选):依赖 Spandsp 的 DSP 功能,需结合其他模块(如 mod_dsp)使用。

二、配置与使用

1. 模块启用
  • 编译依赖:需提前安装 libspandsp 开发库(如 apt-get install libspandsp-dev)。
  • 加载模块:在 FreeSWITCH 的 modules.conf.xml 中启用 mod_spandsp
    <load module="mod_spandsp"/>
    
2. 传真配置示例
  • 接收传真:在拨号计划中使用 fax_receive 应用:
    <action application="answer"/>
    <action application="fax_receive" data="/tmp/fax_${uuid}.tiff"/>
    
  • 发送传真:通过 API 或拨号计划触发:
    originate sofia/external/1234@gateway &txfax(/path/to/fax.tiff)
    
3. T.38 参数调整

vars.xml 中配置 T.38 参数,优化网络适应性:

<X-PRE-PROCESS cmd="set" data="fax_enable_t38=yes"/>
<X-PRE-PROCESS cmd="set" data="fax_enable_t38_request=yes"/>
<X-PRE-PROCESS cmd="set" data="fax_verbose=yes"/> <!-- 启用详细日志 -->

三、典型应用场景

  1. 企业传真服务器

    • 将 FreeSWITCH 作为传真网关,接收来自 PSTN 或 VoIP 的传真并存储为 PDF/TIFF 文件。
    • 示例:通过电子邮件自动转发接收的传真(结合 mod_cloud_storage)。
  2. 呼叫中心 DTMF 交互

    • 精确检测 IVR 中的用户按键输入,支持语音菜单导航或身份验证。
  3. 跨协议传真转换

    • 在 SIP 中继和模拟线路之间转换 T.38 与 T.30 协议,充当传真网关。

四、常见问题与解决

  1. 传真失败或丢页

    • 检查网络抖动:T.38 对丢包敏感,建议启用 UDP 冗余(通过 fax_t38_udp_redundancy 参数)。
    • 日志调试:设置 fax_verbose=yes 并分析 freeswitch.log 中的 SPANDSP 错误码。
  2. DTMF 检测不准确

    • 切换检测模式:优先使用 RFC 2833 或 SIP INFO 代替带内音频检测。
    • 调整 spandsp 的敏感度参数(如 dtmf_detect_threshold)。
  3. 模块未加载

    • 依赖检查:确认 libspandsp 已安装且版本兼容。
    • 编译选项:重新编译 FreeSWITCH 时包含 mod_spandspmake mod_spandsp-install)。

五、总结

mod_spandsp 是 FreeSWITCH 连接传统通信技术与 VoIP 的核心桥梁,尤其在企业传真、IVR 系统和高清语音处理中不可或缺。通过灵活的配置和强大的 Spandsp 库支持,它能够高效处理复杂的信号转换任务,同时提供丰富的调试工具以应对网络环境挑战。对于需要兼容传统硬件的 VoIP 部署,此模块是必选组件。


在 FreeSWITCH 中,DTMF 交互是否需要开启媒体转发取决于你使用的 DTMF 传输方式。FreeSWITCH 支持多种 DTMF 传输方式,每种方式对媒体转发的要求不同。以下是详细分析:


一、DTMF 传输方式

  1. 带内 DTMF(In-band DTMF)

    • 原理:DTMF 信号通过 RTP 音频流传输(即按键音作为音频的一部分)。
    • 是否需要媒体转发。因为 DTMF 信号嵌入在音频流中,FreeSWITCH 必须接收并处理媒体流才能检测到 DTMF。
    • 优点:兼容性强,适用于不支持带外 DTMF 的设备。
    • 缺点:容易受编解码压缩(如 G.729)影响,导致检测不准确。
  2. RFC 2833(带外 DTMF)

    • 原理:DTMF 信号通过 RTP 协议的特定载荷类型(Payload Type)传输,独立于音频流。
    • 是否需要媒体转发。RFC 2833 仍然依赖 RTP 流,但媒体流仅用于传输 DTMF 数据包,而非音频。
    • 优点:检测准确,不受编解码影响。
    • 缺点:需要双方设备支持 RFC 2833。
  3. SIP INFO(带外 DTMF)

    • 原理:DTMF 信号通过 SIP 消息(INFO 方法)传输,完全独立于 RTP 媒体流。
    • 是否需要媒体转发。SIP INFO 不依赖 RTP 流,因此无需开启媒体转发。
    • 优点:不依赖 RTP,适用于无媒体流的场景。
    • 缺点:延迟较高,且需要 SIP 对端支持。

二、媒体转发的配置

在 FreeSWITCH 中,媒体转发由 SDP 协商RTP 引擎 控制。以下是与 DTMF 相关的配置:

  1. 开启媒体转发

    • 在拨号计划或 SIP Profile 中确保媒体流正常建立:
      <action application="set" data="proxy_media=true"/> <!-- 开启媒体转发 -->
      
    • 如果使用带内 DTMF 或 RFC 2833,必须确保媒体流能够到达 FreeSWITCH。
  2. 关闭媒体转发

    • 如果使用 SIP INFO,可以关闭媒体转发以节省资源:
      <action application="set" data="proxy_media=false"/> <!-- 关闭媒体转发 -->
      
  3. DTMF 模式设置

    • 在 SIP Profile 中指定 DTMF 模式:
      <param name="dtmf-type" value="rfc2833"/> <!-- 使用 RFC 2833 -->
      <param name="dtmf-type" value="info"/>    <!-- 使用 SIP INFO -->
      <param name="dtmf-type" value="inband"/>  <!-- 使用带内 DTMF -->
      

三、典型场景与建议

  1. 场景 1:IVR 系统

    • 推荐方式:RFC 2833。
    • 是否需要媒体转发:是。
    • 原因:RFC 2833 检测准确且延迟低,适合实时交互。
  2. 场景 2:传真或录音系统

    • 推荐方式:SIP INFO。
    • 是否需要媒体转发:否。
    • 原因:传真和录音通常不需要实时媒体流,SIP INFO 更节省资源。
  3. 场景 3:兼容传统设备

    • 推荐方式:带内 DTMF。
    • 是否需要媒体转发:是。
    • 原因:传统设备可能仅支持带内 DTMF。

四、总结

  • 带内 DTMF 和 RFC 2833 需要开启媒体转发,因为 DTMF 信号依赖 RTP 流传输。
  • SIP INFO 不需要媒体转发,因为 DTMF 信号通过 SIP 消息传输。
  • 根据实际场景选择合适的 DTMF 传输方式,并确保 FreeSWITCH 的媒体转发配置与之匹配。

如果 FreeSWITCH 仅作为 B2BUA(Back-to-Back User Agent)服务器,并且 不参与媒体处理(即不转发或处理 RTP 媒体流),那么 DTMF 的传输和检测是否会受到影响,取决于你使用的 DTMF 传输方式。以下是详细分析:


一、B2BUA 模式下 FreeSWITCH 的角色

在 B2BUA 模式下,FreeSWITCH 作为中间代理,负责:

  1. 信令处理:管理 SIP 信令(如 INVITE、ACK、BYE 等),建立和拆除呼叫。
  2. 媒体协商:通过 SDP 交换媒体信息(如 IP 地址、端口、编解码等)。
  3. 媒体透传:允许 RTP 媒体流直接在两个终端之间传输,而不经过 FreeSWITCH。

如果 FreeSWITCH 不参与媒体处理,则 RTP 流会直接在两个终端之间传输,FreeSWITCH 不会处理或转发媒体数据。


二、DTMF 传输方式的影响

1. 带内 DTMF(In-band DTMF)
  • 原理:DTMF 信号通过 RTP 音频流传输(即按键音作为音频的一部分)。
  • 影响
    • 如果 FreeSWITCH 不参与媒体处理,则无法检测或处理带内 DTMF 信号。
    • DTMF 信号会直接在两个终端之间传输,FreeSWITCH 无法干预或记录。
  • 结论无法检测或处理带内 DTMF
2. RFC 2833(带外 DTMF)
  • 原理:DTMF 信号通过 RTP 协议的特定载荷类型(Payload Type)传输,独立于音频流。
  • 影响
    • 如果 FreeSWITCH 不参与媒体处理,则无法检测或转发 RFC 2833 数据包。
    • RFC 2833 数据包会直接在两个终端之间传输,FreeSWITCH 无法干预或记录。
  • 结论无法检测或处理 RFC 2833 DTMF
3. SIP INFO(带外 DTMF)
  • 原理:DTMF 信号通过 SIP 消息(INFO 方法)传输,完全独立于 RTP 媒体流。
  • 影响
    • SIP INFO 消息会经过 FreeSWITCH(因为它是信令的一部分)。
    • FreeSWITCH 可以解析、记录或转发 SIP INFO 消息中的 DTMF 信息。
  • 结论可以检测和处理 SIP INFO DTMF

三、解决方案

如果 FreeSWITCH 作为 B2BUA 且不参与媒体处理,但仍需要处理 DTMF,可以考虑以下方案:

1. 使用 SIP INFO
  • 配置:在 SIP Profile 中设置 DTMF 模式为 info
    <param name="dtmf-type" value="info"/>
    
  • 优点:完全依赖信令,不涉及媒体流。
  • 缺点:延迟较高,且需要终端支持 SIP INFO。
2. 启用媒体处理
  • 配置:在 FreeSWITCH 中启用媒体转发(proxy_media=true),以便处理 RTP 流中的 DTMF 信号。
  • 优点:支持带内 DTMF 和 RFC 2833,检测准确且延迟低。
  • 缺点:增加了 FreeSWITCH 的负载,可能影响性能。
3. 外部 DTMF 检测
  • 原理:使用外部工具(如 RTP 抓包工具)分析 RTP 流中的 DTMF 信号。
  • 优点:无需修改 FreeSWITCH 配置。
  • 缺点:实现复杂,不适合实时处理。

四、总结

  • 如果 FreeSWITCH 作为 B2BUA 且 不参与媒体处理,则只能通过 SIP INFO 方式处理 DTMF。
  • 如果需要支持 带内 DTMF 或 RFC 2833,则必须启用媒体转发(proxy_media=true),以便 FreeSWITCH 能够处理 RTP 流中的 DTMF 信号。
  • 根据实际需求选择合适的 DTMF 传输方式,并确保 FreeSWITCH 的配置与终端设备兼容。

FreeSWITCH 的 mod_spandsp 模块本身 并不直接提供回声消除(Acoustic Echo Cancellation, AEC)功能。回声消除通常由专门的模块(如 mod_dsp)或外部库(如 WebRTC 的 AEC)实现。不过,mod_spandsp 模块可以与这些工具结合使用,以增强语音处理能力。

以下是关于如何在 FreeSWITCH 中实现回声消除的详细说明:


一、回声消除的原理

回声消除的目的是消除通话中的回声,通常由以下原因引起:

  1. 声学回声:扬声器的声音被麦克风重新捕获。
  2. 线路回声:PSTN 或 VoIP 网络中的信号反射。

回声消除通过以下步骤实现:

  1. 参考信号:获取扬声器输出的音频流(参考信号)。
  2. 回声估计:根据参考信号,估计麦克风输入中的回声成分。
  3. 回声消除:从麦克风输入中减去估计的回声成分。

二、FreeSWITCH 中的回声消除实现

1. 使用 mod_dsp 模块

mod_dsp 是 FreeSWITCH 中用于实现回声消除的核心模块。它基于 Speex 库WebRTC 的 AEC 模块,提供高质量的回声消除功能。

  • 启用 mod_dsp
    modules.conf.xml 中加载 mod_dsp

    <load module="mod_dsp"/>
    
  • 配置回声消除
    在拨号计划或通道变量中启用 AEC:

    <action application="set" data="enable_echo_cancellation=true"/>
    <action application="set" data="echo_canceller=soft"/> <!-- 使用软件回声消除 -->
    
  • 参数调整
    可以通过以下参数优化回声消除效果:

    <param name="echo-cancel-delay" value="64"/> <!-- 回声延迟(毫秒) -->
    <param name="echo-cancel-aggressiveness" value="3"/> <!-- 消除强度(1-3) -->
    
2. 结合 mod_spandsp

mod_spandsp 主要用于传真和 DTMF 处理,但可以与 mod_dsp 结合使用,以增强语音处理能力。例如:

  • 在传真通话中,启用回声消除以提高语音质量。
  • 在 DTMF 检测中,减少回声对 DTMF 信号的干扰。
3. 使用外部 AEC 模块

如果需要更高质量的回声消除,可以集成外部库(如 WebRTC 的 AEC):

  • 编译 FreeSWITCH 时启用 WebRTC 支持
    在编译时添加 --enable-webrtc 选项。
  • 配置 WebRTC AEC
    autoload_configs/modules.conf.xml 中加载 mod_webrtc
    <load module="mod_webrtc"/>
    

三、回声消除的典型配置

以下是一个完整的回声消除配置示例:

  1. 启用 mod_dspmod_spandsp

    <load module="mod_dsp"/>
    <load module="mod_spandsp"/>
    
  2. 在拨号计划中启用回声消除

    <extension name="echo_cancellation"><condition field="destination_number" expression="^1234$"><action application="answer"/><action application="set" data="enable_echo_cancellation=true"/><action application="set" data="echo_canceller=soft"/><action application="set" data="echo-cancel-delay=64"/><action application="set" data="echo-cancel-aggressiveness=3"/><action application="bridge" data="user/1001"/></condition>
    </extension>
    
  3. 日志调试
    启用详细日志以监控回声消除效果:

    <param name="loglevel" value="debug"/>
    

四、常见问题与解决

  1. 回声消除效果不佳

    • 调整延迟:根据网络和设备延迟,调整 echo-cancel-delay 参数。
    • 检查参考信号:确保参考信号(扬声器输出)正确传递到回声消除模块。
  2. CPU 占用过高

    • 降低消除强度:将 echo-cancel-aggressiveness 设置为较低值(如 1 或 2)。
    • 硬件加速:使用支持硬件回声消除的设备(如 DSP 芯片)。
  3. 模块未加载

    • 检查依赖:确保 libspeexdsplibwebrtc 已安装。
    • 重新编译:重新编译 FreeSWITCH 并启用 mod_dspmod_webrtc

五、总结

  • mod_spandsp 本身不提供回声消除功能,但可以与 mod_dsp 或外部 AEC 模块结合使用。
  • 通过 mod_dsp 或 WebRTC 的 AEC 模块,FreeSWITCH 可以实现高质量的回声消除。
  • 根据实际需求调整参数(如延迟和消除强度),并结合日志调试以优化效果。

相关文章:

FreeSwitch的mod_spandsp模块

FreeSWITCH 的 mod_spandsp 模块是一个基于 Spandsp 库 的核心模块&#xff0c;主要用于实现 传真&#xff08;Fax&#xff09;、DTMF 信号处理 以及 语音编解码转换 等功能。它通过集成 SpandSP 的数字信号处理能力&#xff0c;使 FreeSWITCH 能够与传统通信系统&#xff08;如…...

【c++】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗?

【c】【Linux】【进程】线程终止/崩溃 会导致进程终止/崩溃 吗&#xff1f; 1.线程终止会导致进程终止吗&#xff1f; 在操作系统中&#xff0c;线程是进程的基本执行单元&#xff0c;一个进程可以包含一个或多个线程。 当一个子线程终止时&#xff0c;进程并不会因此自动终…...

Deepseek 怼CHATGPT实况

提示词&#xff1a; 用犀利的语言批评ChatGPT 深度思考&#xff08;R1) 嗯&#xff0c;用户让我用犀利的语言批评ChatGPT。首先&#xff0c;我需要理解他们的动机。可能他们遇到了ChatGPT的某些问题&#xff0c;比如回答不准确或者缺乏深度&#xff0c;所以想表达不满。也有…...

内核数据结构用法(2)list

list 在 Linux 内核中&#xff0c;链表操作是通过一组宏和函数来实现的&#xff0c;这些操作通常用来管理和遍历链表。以下是一些常用的链表函数和宏的具体用法。 1. 定义链表节点 首先&#xff0c;你需要定义一个包含 struct list_head 的结构体&#xff1a; #include <…...

量化自学 - 金融理论与python - Net Present Value 净现值

净现值&#xff08;Net Present Value&#xff0c;NPV&#xff09;是金融理论中用于评估投资项目价值的指标。其核心思想是将未来现金流按一定贴现率折算为当前价值&#xff0c;并减去初始投资成本。若NPV为正&#xff0c;表明项目预期收益高于成本&#xff0c;具有投资价值&am…...

Java Web开发实战与项目——用户认证与授权模块开发

Web应用中&#xff0c;用户认证与授权是至关重要的功能&#xff0c;确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架&#xff0c;支持多种认证与授权方式。在本章节中&#xff0c;我们将深入探讨三种常见的用户认证与授权方案&#xff1a;基于To…...

蓝桥杯篇---IAP15F2K61S2中断

文章目录 前言简介中断源1.外部中断2.定时器中断3.串口中断4.ADC中断5.PCA中断6.SPI中断7.PWM中断 中断优先级中断相关寄存器1.IE2.IP3.TCON4.SCON 中断使用步骤1.配置中断源2.使能中断3.设置优先级4.编写中断服务程序5.清除中断标志 示例代码&#xff1a;外部中断使用示例代码…...

django连接mysql数据库

1.下载mysqlclient第三方库 2.在settings.py里连接数据库&#xff08;提前建好&#xff09; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: 学生信息,USER: root,PASSWORD: 999123457,HOST: localhost,POST: 3306,} } 3.在models.py里创建一个类&#xff0…...

Python爬虫TLS

TLS指纹校验原理和绕过 浏览器可以正常访问&#xff0c;但是用requests发送请求失败。 后端是如何监测得呢&#xff1f;为什么浏览器可以返回结果&#xff0c;而requests模块不行呢&#xff1f; https://cn.investing.com/equities/amazon-com-inc-historical-data 1.指纹校…...

Docker 部署 MySQL 8 详细图文教程

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …...

基于Python的Diango旅游数据分析推荐系统设计与实现+毕业论文(15000字)

基于Python的Diango旅游数据分析推荐系系统设计与实现毕业论文指导搭建视频&#xff0c;带爬虫 配套论文1w5字 可定制到某个省份&#xff0c;加40 基于用户的协同过滤算法 有后台管理 2w多数据集 可配套指导搭建视频&#xff0c;加20 旅游数据分析推荐系统采用了Python语…...

网络安全java练习平台 js网络安全

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 网上学习资料一大堆&#xff0c;但如果学到的知识不成体系&#xff0c;遇到问题时只是浅尝辄止&#xff0c;不再深入研究&#xff0c;那么很难做到真正的技术提升…...

在做题中学习(90):螺旋矩阵II

解法&#xff1a;模拟 思路&#xff1a;创建相同大小的一个二维数组&#xff08;矩阵&#xff09;&#xff0c;用变量标记原矩阵的行数和列数&#xff0c;每次遍历完一行或一列&#xff0c;相应行/列数--&#xff0c;进行对应位置的赋值即可。此题是正方形矩阵&#xff0c;因此…...

Educational Codeforces Round 174 (Rated for Div. 2)(ABCD)

A. Was there an Array? 翻译&#xff1a; 对于整数数组 ​&#xff0c;我们将其相等特征定义为数组 &#xff0c;其中&#xff0c;如果数组 a 的第 i 个元素等于其两个相邻元素&#xff0c;则 &#xff1b;如果数组 a 的第 i 个元素不等于其至少一个相邻元素&#xff0c;则 …...

qemu启动aarch64 linux+ buildroot + 应用程序

1、Linux内核网址 https://www.kernel.org/ 2、安装依赖 sudo apt update sudo apt install -y build-essential qemu qemu-system gcc make bc flex bison libssl-dev libncurses5-dev libelf-dev 3、拉取kernel代码和编译kernel git clone --depth 1 https://git.ker…...

Sponge VS Spring:新兴力量与行业标准的碰撞

框架特性对比 特性SpongeSpring编程语言Go (Golang)Java设计范式低代码, 代码生成, 模块化IoC (控制反转), DI (依赖注入), AOP (面向切面编程)性能高性能, 执行速度快, 并发性好成熟的性能, 需要 JVM 调优, 启动时间可能较长成熟度与稳定性较新, 快速发展中非常成熟, 行业标准…...

推荐几款较好的开源成熟框架

一. 若依&#xff1a; 1. 官方网站&#xff1a;https://doc.ruoyi.vip/ruoyi/ 2. 若依SpringBootVueElement 的后台管理系统&#xff1a;https://gitee.com/y_project/RuoYi-Vue 3. 若依SpringBootVueElement 的后台管理系统&#xff1a;https://gitee.com/y_project/RuoYi-Cl…...

【分布式】Hadoop完全分布式的搭建(零基础)

Hadoop完全分布式的搭建 环境准备&#xff1a; &#xff08;1&#xff09;VMware Workstation Pro17&#xff08;其他也可&#xff09; &#xff08;2&#xff09;Centos7 &#xff08;3&#xff09;FinalShell &#xff08;一&#xff09;模型机配置 0****&#xff09;安…...

JavaScript 异步编程:Promise 与 await 的关联与使用

在 JavaScript 中&#xff0c;异步编程是处理耗时操作&#xff08;如网络请求、文件读写等&#xff09;的核心机制。Promise 和 await 是两种常用的异步编程工具&#xff0c;它们密切相关&#xff0c;但又有各自的特点和适用场景。本文将深入探讨它们的关联、区别以及如何在实际…...

体验用ai做了个python小游戏

体验用ai做了个python小游戏 写在前面使用的工具2.增加功能1.要求增加视频作为背景。2.我让增加了一个欢迎页面。3.我发现中文显示有问题。4.我提出了背景修改意见&#xff0c;欢迎页面和结束页面背景是视频&#xff0c;游戏页面背景是静态图片。5.提出增加更多游戏元素。 总结…...

golang常用库之-swaggo/swag根据注释生成接口文档

文章目录 golang常用库之-swaggo/swag库根据注释生成接口文档什么是swaggo/swag golang常用库之-swaggo/swag库根据注释生成接口文档 什么是swaggo/swag github&#xff1a;https://github.com/swaggo/swag 参考文档&#xff1a;https://golang.halfiisland.com/community/pk…...

【可实战】Linux 常用统计命令:排序sort、去重uniq、统计wc

在 Linux 系统中&#xff0c;有一些常用的命令可以用来收集和统计数据。 一、常用统计命令的使用场景 日志分析和监控&#xff1a;通过使用 Linux 统计命令&#xff0c;可以实时监控和分析系统日志文件&#xff0c;了解系统的运行状况和性能指标。例如&#xff0c;使用 tail 命…...

【设计模式】【创建型模式】建造者模式(Builder)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

UE5.3 C++ 通过Spline样条实现三维连线,自己UV贴图。

一.制作了基于USplineComponent的画线插件&#xff0c;就是我们常说的样条线。 直接看怎么用&#xff0c;关于插件实现细节&#xff0c;后续会更新&#xff0c;看思路就行。通过ID,管理每一条线。移除删掉上一帧的线条Mesh。第一个点&#xff0c;是本身直接放过去。第二个点是…...

每日学习Java之一万个为什么

9.Class <?> class1 Myclass.class 为什么要有通配符&#xff1f;传给谁用的&#xff1f; 首先&#xff0c;这里的class特指某个对象在JVM中的元数据集合。 有普通、接口、数组、基本类型、 void 类型、局部类、匿名类、枚举、注解 1.类型安全&#xff1a;通配符允许…...

4、IP查找工具-Angry IP Scanner

在前序文章中&#xff0c;提到了多种IP查找方法&#xff0c;可能回存在不同场景需要使用不同的查找命令&#xff0c;有些不容易记忆&#xff0c;本文将介绍一个比较优秀的IP查找工具&#xff0c;可以应用在连接树莓派或查找IP的其他场景中。供大家参考。 Angry IP Scanner下载…...

华为昇腾920b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…...

一周学会Flask3 Python Web开发-http响应状态码

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Flask程序中&#xff0c;客户端发出的请求触发相应的视图函数&#xff0c;获取返回值会作为响应的主体&#xff0c;最后生成…...

Javascript网页设计实例:通过JS实现上传Markdown转化为脑图并下载脑图

功能预览 深度与密度测试 对于测试部分&#xff0c;分别对深度和密度进行了测试&#xff1a; 注意&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;只实现了识别Markdown中的#代表的层级&#xff0c;所以不能使用其余标识符&#xff0…...

【Spring生命周期】Bean元信息配置阶段

引言 本系列将详细讲解Spring生命周期的13个阶段&#xff0c;从源码角度帮助我们更好的理解Spring框架和bean生命周期全流程 Bean信息定义4种方式 API的方式Xml文件方式properties文件的方式注解的方式 在 Spring 框架中&#xff0c;Bean 元信息配置阶段是整个 Bean 生命周…...

【iOS】SwiftUI状态管理

State ObservedObject StateObject 的使用 import SwiftUIclass CountModel: ObservableObject {Published var count: Int 0 // 通过 Published 标记的变量会触发视图更新init() {print("TimerModel initialized at \(count)")} }struct ContentView: View {State…...

ubuntu上如何查看coredump文件默认保存在哪个路径?

在 Ubuntu 系统中&#xff0c;可以通过以下几种方式来查看 coredump 文件默认保存的路径&#xff1a; 1. 查看core_pattern配置 core_pattern是一个内核参数&#xff0c;它决定了 coredump 文件的保存位置和命名规则。可以通过以下命令查看其当前值&#xff1a; cat /proc/s…...

技术总结汇总

目录 数据库 数据库系统原理 MySQL Redis Java Java 基础 Java 容器 Java 并发 Java 虚拟机 Java I/O 系统设计 系统设计基础 微服务 分布式 集群和负载均衡 灾备和故障转移 限流 降级和熔断 缓存 消息队列 设计模式 DDD领域驱动设计 开发框架和中间件…...

Java-如何将其他地方拉取的jar包导入本地maven环境

背景 公司的一个老旧二开项目&#xff0c;原项目维护方不合作了&#xff0c;提供的项目源码提供给到公司。项目中用到了一些原维护方内部的jar包&#xff0c;导致二开时依赖的这些部分全部报错。虽然在项目中直接导入此jar包可以解决报红报错问题&#xff0c;但是在使用maven打…...

Unity 聊天气泡根据文本内容适配

第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置&#xff1a;&#xff08;0&#xff0c;1&#xff09; 对齐方式&#xff1a;左上对齐 3、设置文本pivot位置和对齐方式&#xff0c;并挂上布局组件 pivot设置和对齐方式和底图一样&#…...

【组态PLC】基于博图V16和组态王六层双部电梯组态设计【含PLC组态源码 M008期】

控制要求 1&#xff09;两台电梯同时运行时&#xff0c;共同享用一套外呼按钮。 2&#xff09;当两台电梯同时去响应外呼信号时&#xff0c;两台电梯自动定向启动前往相应的楼层&#xff0c;当某一台电梯先行到达指定层楼时&#xff0c;另外一台电梯必须就近停靠平层&#xf…...

Python--数据类型(中)

1. 列表&#xff08;list&#xff09; 1.1 定义与特性 定义&#xff1a;有序、可变的容器&#xff0c;支持多种数据类型混合存储。 user_list ["奥力给", 98, True] empty_list [] # 空列表可变性&#xff1a;列表内部元素可修改&#xff0c;区别于字符串和元组。…...

学习总结2.19

首先就是对dfs和bfs的熟悉&#xff0c;dfs是一种递归函数&#xff0c;通过不断深搜来达到目的&#xff0c;通常用于寻找多少未知量&#xff0c;相较于bfs&#xff0c;编译难度更低一点&#xff1b;bfs多用于寻找最短路径之类&#xff0c;相较于dfs代码多了一部分队列的代码&…...

[Vivado报错] [Runs 36-527] DCP does not exist

一、错误原因解析 此错误表明Vivado在指定路径未找到.dcp&#xff08;Design Checkpoint&#xff09;文件&#xff0c;通常由以下原因导致&#xff1a; 路径过长或特殊字符&#xff1a;Windows系统路径长度限制&#xff08;260字符&#xff09;可能导致文件生成失败&#xff…...

深度学习的集装箱箱号OCR识别技术,识别率99.9%

集装箱箱号OCR识别技术是一项结合计算机视觉和规则校验的复杂任务&#xff0c;以下是其关键要点及实现思路的总结&#xff1a; 1、集装箱号结构&#xff1a;11位字符&#xff0c;格式为公司代码(3字母)和序列号(6数字)以及校验码(1数字)和尺寸/类型代码(可选)&#xff0c;例如…...

基于java新闻管理系统,推荐一款开源cms内容管理系统ruoyi-fast-cms

一、项目概述 1.1 项目背景 在信息高速流通的当下&#xff0c;新闻媒体行业每天都要处理和传播海量信息。传统的新闻管理模式依赖人工操作&#xff0c;在新闻采集、编辑、发布以及后续管理等环节中&#xff0c;不仅效率低下&#xff0c;而且容易出现人为失误。同时&#xff0…...

网络安全要学python 、爬虫吗

网络安全其实并不复杂&#xff0c;只是比普通开发岗位要学习的内容多一点。无论是有过编程基础还是零基础的都可以学习的。网络安全目前可就业的岗位从技术上可分为两部分&#xff1a;web安全和二进制逆向安全。web安全是网络安全的入门方向&#xff0c;内容简单&#xff0c;就…...

ChatGPT行业热门应用提示词案例-AI绘画类

AI 绘画指令是一段用于指导 AI 绘画工具&#xff08;如 DALLE、Midjourney 等&#xff09;生成特定图像的文本描述。它通常包含场景、主体、风格、色彩、氛围等关键信息&#xff0c;帮助 AI 理解创作者的意图&#xff0c;从而生成符合要求的绘画作品。 ChatGPT 拥有海量的知识…...

网络安全钓鱼邮件测试 网络安全 钓鱼

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 如今&#xff0c;网络安全是一个备受关注的话题&#xff0c;“网络钓鱼”这个词也被广泛使用。 即使您对病毒、恶意软件或如何在线保护自己一无所知&#xff0c;您…...

写一个python组件

写一个python组件 核心功能代码命令行接口打包配置安装与测试注意 写一个python组件&#xff0c;具体的&#xff1a;项目结构设计&#xff1a;定义你的项目的目录结构。编写核心功能代码&#xff1a;实现你想要的功能。创建命令行接口(CLI)&#xff1a;使用argparse或click库来…...

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线&#xff0c;试用了下阿里云和腾讯云的deepseek服务&#xff0c;在回答经典数学问题9.9和9.11谁大时&#xff0c;发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…...

DevOps自动化部署详解:从理念到实践

在软件开发日益快速迭代的今天&#xff0c;如何以高效、稳定且可重复的方式将代码变更从开发环境自动部署到生产环境成为企业竞争的重要因素。DevOps 正是在这一背景下应运而生&#xff0c;它打破开发、测试、运维之间的壁垒&#xff0c;通过自动化工具和流程&#xff0c;实现持…...

systemverilog刷题小记

1、systemverilog的队列特性 1.1队列的基础操作 方法语法时间复杂度示例结果头部插入q.push_front(item)O(1)q.push_front(5)[5, ...]尾部插入q.push_back(item)O(1)q.push_back(8)[..., 8]头部删除q.pop_front()O(1)x q.pop_front()[...]尾部删除q.pop_back()O(1)x q.pop_…...

jetbrains IDEA集成大语言模型

一、CodeGPT ‌CodeGPT‌是由CSDN打造的一款生成式AI产品&#xff0c;专为开发者量身定制。它能够提供强大的技术支持&#xff0c;帮助开发者在学习新技术或解决实际工作中的各种计算机和开发难题‌1。 idea集成 1.在线安装&#xff1a;直接在线安装 2.离线安装 JetBrains Mar…...

23. AI-大语言模型-DeepSeek赋能开发-Spring AI集成

文章目录 前言一、Spring AI 集成 DeepSeek1. 开发AI程序2. DeepSeek 大模型3. 集成 DeepSeek 大模型1. 接入前准备2. 引入依赖3. 工程配置4. 调用示例5. 小结 4. 集成第三方平台&#xff08;已集成 DeepSeek 大模型&#xff09;1. 接入前准备2. POM依赖3. 工程配置4. 调用示例…...