kamailio-ACC模块介绍【kamailio6.0. X】
Acc 模块
作者
Jiri Kuthan
iptel.org
jiri@iptel.org
Bogdan-Andrei Iancu
Voice Sistem SRL
bogdan@voice-system.ro
Ramona-Elena Modroiu
rosdev.ro
ramona@rosdev.ro
编辑
Bogdan-Andrei Iancu
Voice Sistem SRL
bogdan@voice-system.ro
Sven Knoblich
1&1 Internet AG
sven.knoblich@1und1.de
版权
© 2002, 2003 FhG FOKUS
© 2004, 2006 Voice Sistem SRL
© 2011 1&1 Internet AG
目录
- 管理员指南
- 概述
1.1 通用示例 - 额外计费
2.1 概述
2.2 定义与语法
2.3 工作原理 - 多呼叫腿计费
3.1 概述
3.2 配置
3.3 记录的数据 - 呼叫数据记录生成
4.1 概述
4.2 CDR 额外信息
4.2.1 定义与语法
4.3 多呼叫腿的 CDR
4.3.1 概述
4.3.2 配置
4.3.2.1 螺旋代理示例
4.3.3 记录的数据 - 依赖
5.1 Kamailio 模块
5.2 外部库或应用程序 - 参数
6.1 early_media (整数)
6.2 failed_transaction_flag (整数)
6.3 failed_filter (字符串)
6.4 report_ack (整数)
6.5 report_cancels (整数)
6.6 detect_direction (整数)
6.7 acc_prepare_flag (整数)
6.8 acc_prepare_always (整数)
6.9 acc_extra_nullable (整数)
6.10 multi_leg_info (字符串)
6.11 log_flag (整数)
6.12 log_missed_flag (整数)
6.13 log_level (整数)
6.14 log_facility (字符串)
6.15 log_extra (字符串)
6.16 db_flag (整数)
6.17 db_missed_flag (整数)
6.18 db_table_acc (字符串)
6.19 db_table_missed_calls (字符串)
6.20 db_url (字符串)
6.21 acc_method_column (字符串)
6.22 acc_from_tag_column (字符串)
6.23 acc_to_tag_column (字符串)
6.24 acc_callid_column (字符串)
6.25 acc_sip_code_column (字符串)
6.26 acc_sip_reason_column (字符串)
6.27 acc_time_column (字符串)
6.28 db_extra (字符串)
6.29 db_insert_mode (整数)
6.30 cdr_enable (整数)
6.31 cdr_skip (字符串)
6.32 cdr_expired_dlg_enable (整数)
6.33 cdr_start_on_confirmed (整数)
6.34 cdr_facility (整数)
6.35 cdr_extra (字符串)
6.36 cdr_extra_nullable (整数)
6.37 cdr_start_id (字符串)
6.38 cdr_end_id (字符串)
6.39 cdr_duration_id (字符串)
6.40 cdr_log_enable (整数)
6.41 cdrs_table (字符串)
6.42 time_mode (整数)
6.43 time_attr (字符串)
6.44 time_exten (字符串)
6.45 time_format (字符串)
6.46 reason_from_hf (整数)
6.47 clone_msg (整数)
6.48 cdr_on_failed (整数)
6.49 acc_extra_size (整数)
6.50 cdr_extra_size (整数) - 函数
7.1 acc_log_request(comment)
7.2 acc_db_request(comment, table)
7.3 acc_request(comment, table)
- 概述
- 常见问题
1. 概述
ACC 模块用于将事务信息记录到不同的后端,如 syslog 和 SQL。通过单独的模块 acc_radius 可以启用对 RADIUS 的支持。
acc_diameter 模块中提供了对 Diameter 协议的早期支持,但未与当前 Diameter 协议保持同步。如果需要 Diameter 支持,请使用 ims_charging 模块。
要为事务计费并选择使用哪一组后端,脚本编写者只需设置一些标志(参见模块参数部分的标志定义)。如果为特定后端设置了计费标志,ACC 模块将在事务完成时报告。模块的典型用法不需要特定的脚本命令——功能通过事务处理隐式绑定。脚本编写者只需使用适当的 setflag 标记事务以进行计费。即使如此,模块仍允许脚本编写者通过某些脚本函数在特殊情况下强制计费。
默认情况下,计费模块会记录事务的一组固定属性。如果要通过添加更多信息来自定义计费,请参阅下一章关于额外计费的内容。
固定的最小计费信息包括:
- 请求方法名称
- From 头的 TAG 参数
- To 头的 TAG 参数
- Call-Id
- 最终回复的 3 位状态码
- 最终回复的原因短语
- 事务完成时的时间戳
如果请求中不存在某个值,则记录为空字符串。
注意:
- 单个 INVITE 可能会生成多个计费报告——这是由于 SIP 的分叉特性。
- 所有与计费相关的标志都需要在请求处理路由中设置——只有“missed-call”标志可以从其他类型的路由中切换。
- 如果 UA 在通话中途失败,代理将永远不会发现。通常,更好的做法是从终端设备(如 PSTN 网关)进行计费,因为它最了解呼叫状态(包括媒体状态和 PSTN 状态)。然而,基于 CDR 的日志记录可以选择记录来自过期对话的现有信息(
cdr_extra中的dlg_vars)。请参阅cdr_expired_dlg_enable参数。
SQL 后端支持已编译到模块中。
1.1 通用示例
loadmodule "modules/acc/acc.so"
modparam("acc", "log_level", 1)
modparam("acc", "log_flag", 1)if (uri=~"sip:+40") { /* 呼叫罗马尼亚 */if (!proxy_authorize("sip_domain.net", "subscriber")) {proxy_challenge("sip_domain.net", "0");exit;}if (method=="INVITE" && !check_from()) {log("from!=digest\n");sl_send_reply("403","Forbidden");}setflag(1); /* 设置计费标志 */t_relay(); /* 进入有状态模式 */
};
2. 额外计费
2.1 概述
除了静态的默认信息外,ACC 模块还允许动态选择要记录的额外信息。这允许您记录任何伪变量(AVP、请求的部分等)。
2.2 定义与语法
通过 xxx_extra 参数选择额外信息,指定要记录的附加信息的名称。这些信息通过伪变量定义,可能包括头、AVP 值或其他消息或系统值。参数语法为:
xxx_extra = extra_definition (';'extra_definition)*
extra_definition = log_name '=' pseudo_variable
支持的伪变量列表可在 Kamailio 文档 中找到。
2.3 工作原理
某些伪变量可能返回多个值(如头或 AVP)。在这种情况下,返回的值将以逗号分隔的格式嵌入单个字符串中。
3. 多呼叫腿计费
3.1 概述
由于转发操作,SIP 呼叫可能具有多个腿。例如,用户 A 呼叫用户 B,用户 B 将呼叫转发给用户 C。只有一个 SIP 呼叫,但有两条腿(A 到 B 和 B 到 C)。记录呼叫腿对于正确计费是必要的。
3.2 配置
通过一组 AVP 为每个呼叫腿存储一组值。脚本编写者必须确保正确插入这些 AVP。
3.3 记录的数据
对于每个呼叫,所有 AVP 集的值将被记录。记录方式取决于数据后端:
- syslog:所有腿集将作为一个记录字符串添加。
- 数据库:每个腿集将单独记录。
- RADIUS:所有腿集将添加到同一 RADIUS 计费消息中。
4. 呼叫数据记录生成
4.1 概述
除了基于事务的日志记录外,还可以直接从 Kamailio 生成和记录呼叫数据记录(CDR)。CDR 记录依赖于对话框模块。
4.2 CDR 额外信息
类似于事务额外信息,CDR 额外信息通过 cdr_extra 参数定义。
4.3 多呼叫腿的 CDR
与普通计费不同,CDR 日志记录使用对话框而不是事务来记录数据。
5. 依赖
5.1 Kamailio 模块
该模块依赖于以下模块:
- tm:事务管理器
- 数据库模块:如果使用 SQL 支持
- rr:记录路由,如果启用了
detect_direction参数 - dialog:对话框,如果启用了
cdr_enable参数
5.2 外部库或应用程序
无。
6. 参数
6.1 early_media (整数)
是否应记录早期媒体(任何带有正文的临时回复)?
默认值为 0(否)。
6.2 failed_transaction_flag (整数)
事务失败时(SIP 状态码 >= 300)是否应记录事务的标志。
默认值为未设置(无标志)。
6.3 failed_filter (字符串)
失败响应代码的字符串(300 到 999),用逗号分隔。即使设置了 failed_transaction_flag,如果响应代码在列表中,失败事务也不会被记录。
默认值为未设置(无过滤)。
6.4 report_ack (整数)
是否尝试记录端到端的 ACK?
默认值为 0(否)。
6.5 report_cancels (整数)
是否显式记录 CANCEL 事务?
默认值为 0(否)。
6.6 detect_direction (整数)
控制顺序请求的方向检测。
默认值为 0(禁用)。
6.7 acc_prepare_flag (整数)
事务标志,指示是否可以在稍后计费。
默认值为未设置(无标志)。
6.8 acc_prepare_always (整数)
是否始终准备所有请求以标记事务稍后计费。
默认值为未设置。
6.9 acc_extra_nullable (整数)
如果设置为 1,数据库额外字段在未定义或为 $null 时设置为 NULL。
默认值为 0。
6.10 multi_leg_info (字符串)
定义用于每条呼叫腿计费的 AVP 集。
默认值为 0(禁用)。
6.11 log_flag (整数)
请求标志,用于通过 syslog 记录事务。
默认值为未设置(无标志)。
6.12 log_missed_flag (整数)
请求标志,用于通过 syslog 记录未接呼叫。
默认值为未设置(无标志)。
6.13 log_level (整数)
记录计费消息的日志级别。
默认值为 1(L_NOTICE)。
6.14 log_facility (字符串)
记录计费消息的日志设施。
默认值为 LOG_DAEMON。
6.15 log_extra (字符串)
要记录的额外值。
默认值为 NULL。
6.16 db_flag (整数)
请求标志,用于通过数据库记录事务。
默认值为未设置(无标志)。
6.17 db_missed_flag (整数)
请求标志,用于通过数据库记录未接呼叫。
默认值为未设置(无标志)。
6.18 db_table_acc (字符串)
成功呼叫的计费表名。
默认值为 “acc”。
6.19 db_table_missed_calls (字符串)
未接呼叫的计费表名。
默认值为 “missed_calls”。
6.20 db_url (字符串)
SQL 地址。
默认值为 NULL(SQL 禁用)。
6.21 acc_method_column (字符串)
存储请求方法名称的列名。
默认值为 “method”。
6.22 acc_from_tag_column (字符串)
存储 From 头 TAG 参数的列名。
默认值为 “from_tag”。
6.23 acc_to_tag_column (字符串)
存储 To 头 TAG 参数的列名。
默认值为 “to_tag”。
6.24 acc_callid_column (字符串)
存储 Callid 值的列名。
默认值为 “callid”。
6.25 acc_sip_code_column (字符串)
存储最终回复状态码的列名。
默认值为 “sip_code”。
6.26 acc_sip_reason_column (字符串)
存储最终回复原因短语的列名。
默认值为 “sip_reason”。
6.27 acc_time_column (字符串)
存储事务完成时间戳的列名。
默认值为 “time”。
6.28 db_extra (字符串)
要记录到数据库的额外值。
默认值为 NULL。
6.29 db_insert_mode (整数)
如果设置为 1,使用 INSERT DELAYED 添加记录。
默认值为 0。
6.30 cdr_enable (整数)
启用 CDR 报告。
默认值为 0(禁用)。
6.31 cdr_skip (字符串)
跳过具有此 dlg_var 设置的对话框的 CDR 生成。
默认值为 NULL。
6.32 cdr_expired_dlg_enable (整数)
是否在对话框过期时启用 CDR 日志记录?
默认值为 0(禁用)。
6.33 cdr_start_on_confirmed (整数)
是否从对话框确认时开始计时?
默认值为 0(从对话框创建时开始)。
6.34 cdr_facility (整数)
CDR 消息的日志设施。
默认值为 LOG_DAEMON。
6.35 cdr_extra (字符串)
定义自定义 CDR 字段的伪变量集。
默认值为 NULL。
6.36 cdr_extra_nullable (整数)
自定义 CDR 字段是否可以为 NULL?
默认值为 0。
6.37 cdr_start_id (字符串)
修改用于存储开始时间的 ID。
默认值为 “start_time”。
6.38 cdr_end_id (字符串)
修改用于存储结束时间的 ID。
默认值为 “end_time”。
6.39 cdr_duration_id (字符串)
修改用于存储持续时间的 ID。
默认值为 “duration”。
6.40 cdr_log_enable (整数)
控制是否将 CDR 记录写入 syslog。
默认值为 1(启用)。
6.41 cdrs_table (字符串)
存储对话框 CDR 的数据库表名。
默认值为 “”(无数据库存储)。
6.42 time_mode (整数)
存储与事件时间相关的额外值。
默认值为 0。
6.43 time_attr (字符串)
存储事件时间的 syslog 属性或数据库列名。
默认值为未设置。
6.44 time_exten (字符串)
存储事件时间的扩展值的 syslog 属性或数据库列名。
默认值为未设置。
6.45 time_format (字符串)
指定时间格式。
默认值为 “%Y-%m-%d %H:%M:%S”。
6.46 reason_from_hf (整数)
从何处获取 sip_reason。
默认值为 0(从状态行获取)。
6.47 clone_msg (整数)
是否克隆请求结构以避免并发访问。
默认值为 1。
6.48 cdr_on_failed (整数)
是否存储失败对话框的 CDR?
默认值为 1。
6.49 acc_extra_size (整数)
设置计费记录中额外属性的最大数量。
默认值为 64。
6.50 cdr_extra_size (整数)
设置 CDR 中额外属性的最大数量。
默认值为 64。
7. 函数
7.1 acc_log_request(comment)
报告请求,例如用于报告未接呼叫。
参数:
- comment:要附加的注释,可以包含伪变量。
7.2 acc_db_request(comment, table)
将请求报告发送到数据库。
参数:
- comment:要附加的注释,可以包含伪变量。
- table:要使用的数据库表。
7.3 acc_request(comment, table)
将计费记录写入 LOG 和 DATABASE 后端。
参数:
- comment:用于生成 SIP 响应代码和文本字段的注释。
- table:要使用的数据库表。
2. 常见问题
2.1 旧的 log_fmt 参数发生了什么?
该参数已被废弃,由额外计费功能取代。
2.2 旧的 multi_leg_enabled 参数发生了什么?
该参数已被 multi_leg_info 参数取代。
2.3 旧的 src_leg_avp_id 和 dst_leg_avp_id 参数发生了什么?
这些参数已被 multi_leg_info 参数取代。
2.4 在哪里可以找到更多关于 Kamailio 的信息?
请访问 Kamailio 官方网站。
2.5 在哪里可以发布关于此模块的问题?
请查看我们的邮件列表:
- 用户邮件列表:[sr-users@lists.kamailio.org](https://lists.kamailio.org/mailman3/postorius
相关文章:
kamailio-ACC模块介绍【kamailio6.0. X】
Acc 模块 作者 Jiri Kuthan iptel.org jiriiptel.org Bogdan-Andrei Iancu Voice Sistem SRL bogdanvoice-system.ro Ramona-Elena Modroiu rosdev.ro ramonarosdev.ro 编辑 Bogdan-Andrei Iancu Voice Sistem SRL bogdanvoice-system.ro Sven Knoblich 1&1 Internet …...
数据库对象
数据库对象 数据库对象是构成数据库结构的基本单位,它们定义了数据库存储的数据类型、数据的组织方式以及数据之间的关系。在数据库中,对象可以包括表,视图,索引,触发器,存储过程,函数等多种类…...
EtherCAT主站IGH-- 27 -- IGH之globals.h文件解析
EtherCAT主站IGH-- 27 -- IGH之globals.h文件解析 0 预览一 该文件功能宏定义数据结构打印宏三 h文件翻译四 c文件翻译该文档修改记录:总结0 预览 一 该文件功能 该文件包含了一些全局定义和宏,用于 IgH EtherCAT 主站(EtherCAT Master)的实现。包括了一些超时设定、宏定义…...
2025多目标优化创新路径汇总
多目标优化是当下非常热门且有前景的方向!作为AI领域的核心技术之一,其专注于解决多个相互冲突的目标的协同优化问题,核心理念是寻找一组“不完美但均衡”的“帕累托最优解”。在实际中,几乎处处都有它的身影。 但随着需求场景的…...
15JavaWeb——Maven高级篇
Maven高级 Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中,我们已经学习了Maven。 我们讲到 Maven 是一款构建和管理 Java 项目的工具。经过前面 10 多天 web 开发的学习,相信大家对于 Maven 这款工具的基本使用应该没什…...
使用Ollama本地化部署DeepSeek
1、Ollama 简介 Ollama 是一个开源的本地化大模型部署工具,旨在简化大型语言模型(LLM)的安装、运行和管理。它支持多种模型架构,并提供与 OpenAI 兼容的 API 接口,适合开发者和企业快速搭建私有化 AI 服务。 Ollama …...
蓝桥杯刷题DAY1:前缀和
所谓刷题,讲究的就是细心 帕鲁服务器崩坏【算法赛】 “那个帕鲁我已经观察你很久了,我对你是有些失望的,进了这个营地,不是把事情做好就可以的,你需要有体系化思考的能力。” 《幻兽帕鲁》火遍全网,成为…...
【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册
🧸安清h:个人主页 🎥个人专栏:【计算机网络】【Mybatis篇】 🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。 目录 🎯项目基本介绍 🚦项…...
MINIRAG: TOWARDS EXTREMELY SIMPLE RETRIEVAL-AUGMENTED GENERATION论文翻译
感谢阅读 注意不含评估以后的翻译原论文地址标题以及摘要介绍部分MiniRAG 框架2.1 HETEROGENEOUS GRAPH INDEXING WITH SMALL LANGUAGE MODELS2.2 LIGHTWEIGHT GRAPH-BASED KNOWLEDGE RETRIEVAL2.2.1 QUERY SEMANTIC MAPPING2.2.2 TOPOLOGY-ENHANCED GRAPH RETRIEVAL 注意不含评…...
微服务入门(go)
微服务入门(go) 和单体服务对比:里面的服务仅仅用于某个特定的业务 一、领域驱动设计(DDD) 基本概念 领域和子域 领域:有范围的界限(边界) 子域:划分的小范围 核心域…...
Baklib揭示内容中台实施最佳实践的策略与实战经验
内容概要 在当前数字化转型的浪潮中,内容中台的概念日益受到关注。它不再仅仅是一个内容管理系统,而是企业提升运营效率与灵活应对市场变化的重要支撑平台。内容中台的实施离不开最佳实践的指导,这些实践为企业在建设高效内容中台时提供了宝…...
C++11新特性之lambda表达式
1.介绍 C11引入了lambda表达式。lambda表达式提供一种简洁的方式来定义匿名函数对象,使得在需要临时定义一个函数时非常方便。 2.lambda表达式用法 lambda表达式的基本用法为: [捕获列表](参数列表)->返回类型 { 函数体 …...
洛谷 P10289 [GESP样题 八级] 小杨的旅游 C++ 完整题解
一、题目链接 P10289 [GESP样题 八级] 小杨的旅游 - 洛谷 二、题目大意 n个节点之间有n - 1条边,其中k个节点是传送门,任意两个传送门之间可以 以0单位地时间相互到达。问从u到v至少需要多少时间? 三、解题思路 输入不必多讲。 cin >> …...
使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践
Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI,是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手,感觉收获还蛮多的,今天来分享下开发过程中的一些经验~ 为啥要做这个…...
JWT入门
一、初识JWT:新时代的身份认证方案 在分布式系统成为主流的今天,传统的Session认证方式逐渐显露出局限性。JWT(JSON Web Token)作为现代Web开发的认证新标准,凭借其无状态、跨域友好和安全性等特性,正在成为…...
Python - Quantstats量化投资策略绩效统计包 - 详解
使用Quantstats包做量化投资绩效统计的时候因为Pandas、Quantstats版本不匹配踩了一些坑;另外,Quantstats中的绩效统计指标非常全面,因此详细记录一下BUG修复方法、使用说明以及部分指标的内涵示意。 一、Quantstats安装及版本匹配问题 可以…...
智慧园区管理系统推动企业智能运维与资源优化的全新路径分析
内容概要 在当今快速发展的商业环境中,园区管理的数字化转型显得尤为重要。在这个背景下,快鲸智慧园区管理系统应运而生,成为企业实现高效管理的最佳选择。它通过整合互联网、物联网等先进技术,以智能化的方式解决了传统管理模式…...
【数据结构-字典树】力扣14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 示例 1: 输入:strs [“flower”,“flow”,“flight”] 输出:“fl” 示例 2: 输入:strs [“dog”,“racecar…...
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL TLS/SSL协议和应用层协议无关,它只是加密应用层协议(比如HTTP)并传递给下层的TCP。 HTTP和TLS/SSL协议组合在一起就是HTTPS, HTTPS等…...
Go学习:Go语言中if、switch、for语句与其他编程语言中相应语句的格式区别
Go语言中的流程控制语句逻辑结构与其他编程语言类似,格式有些不同。Go语言的流程控制中,包括if、switch、for、range、goto等语句,没有while循环。 目录 1. if 语句 2. switch语句 3. for语句 4. range语句 5. goto语句(不常用…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
