kamailio-ACC、ACC_JSON 和 ACC_RADIUS 的区别

embedded/2025/2/2 7:26:09/

ACC、ACC_JSON 和 ACC_RADIUS 的区别

ACC、ACC_JSON 和 ACC_RADIUS 都是 Kamailio 中用于计费(Accounting)的模块,但它们的功能和后端支持有所不同。以下是它们的区别及案例说明:


1. ACC 模块

  • 功能:ACC 模块是 Kamailio 的核心计费模块,支持将计费信息记录到多种后端,包括 syslog 和 SQL 数据库。
  • 特点
    • 支持基本的计费功能,记录事务的固定属性(如方法、Call-ID、状态码等)。
    • 可以通过 log_extradb_extra 参数记录额外的自定义信息。
    • 支持多呼叫腿计费(Multi Call-Legs Accounting)。
  • 适用场景:适用于需要将计费信息记录到 syslog 或 SQL 数据库的场景。
案例:记录到 syslog
kamailio">loadmodule "acc.so"
modparam("acc", "log_flag", 1)  # 启用 syslog 记录
modparam("acc", "log_level", 1) # 设置日志级别为 L_NOTICEroute {if (method == "INVITE") {setflag(1);  # 设置计费标志t_relay();   # 转发请求}
}
  • 结果:所有 INVITE 请求的计费信息会被记录到 syslog 中。

2. ACC_JSON 模块

  • 功能:ACC_JSON 模块是 ACC 的扩展模块,支持将计费信息生成 JSON 格式的文档,并通过消息队列(MQueue)推送。
  • 特点
    • 生成的 JSON 文档可以包含事务的固定属性和额外的自定义信息。
    • 适用于需要将计费信息以结构化数据(JSON)形式发送到外部系统的场景。
  • 适用场景:适用于需要将计费信息发送到消息队列或外部系统的场景。
案例:生成 JSON 并推送到消息队列
kamailio">loadmodule "acc_json.so"
modparam("acc_json", "log_flag", 1)  # 启用 JSON 记录
modparam("acc_json", "log_extra", "ua=$hdr(User-Agent);uuid=$avp(i:123)")  # 记录额外信息route {if (method == "INVITE") {setflag(1);  # 设置计费标志t_relay();   # 转发请求}
}
  • 结果:所有 INVITE 请求的计费信息会生成 JSON 文档,并通过消息队列推送。例如:
{"method": "INVITE","from_tag": "abc123","to_tag": "xyz456","callid": "12345","sip_code": "200","sip_reason": "OK","time": "2025-02-01 12:34:56","ua": "SomeUserAgent/1.0","uuid": "12345"
}

3. ACC_RADIUS 模块

  • 功能:ACC_RADIUS 模块是 ACC 的扩展模块,支持将计费信息发送到 RADIUS 服务器。
  • 特点
    • 使用 RADIUS 协议将计费信息发送到 RADIUS 服务器。
    • 适用于需要与 RADIUS 服务器集成的场景(如运营商计费系统)。
  • 适用场景:适用于需要将计费信息发送到 RADIUS 服务器的场景。
案例:记录到 RADIUS 服务器
kamailio">loadmodule "acc_radius.so"
modparam("acc_radius", "radius_flag", 1)  # 启用 RADIUS 记录
modparam("acc_radius", "radius_config", "/etc/radiusclient-ng/radiusclient.conf")  # RADIUS 配置文件route {if (method == "INVITE") {setflag(1);  # 设置计费标志t_relay();   # 转发请求}
}
  • 结果:所有 INVITE 请求的计费信息会通过 RADIUS 协议发送到 RADIUS 服务器。

区别总结

模块后端支持数据格式适用场景
ACCsyslog、SQL 数据库文本或数据库记录需要记录到本地日志或数据库的场景
ACC_JSON消息队列(MQueue)JSON 格式需要将计费信息发送到外部系统的场景
ACC_RADIUSRADIUS 服务器RADIUS 协议需要与 RADIUS 服务器集成的场景

综合案例

假设我们需要将计费信息同时记录到 syslog、生成 JSON 推送到消息队列,并发送到 RADIUS 服务器:

kamailio">loadmodule "acc.so"
loadmodule "acc_json.so"
loadmodule "acc_radius.so"# ACC 配置
modparam("acc", "log_flag", 1)  # 启用 syslog 记录
modparam("acc", "log_level", 1) # 设置日志级别# ACC_JSON 配置
modparam("acc_json", "log_flag", 1)  # 启用 JSON 记录
modparam("acc_json", "log_extra", "ua=$hdr(User-Agent);uuid=$avp(i:123)")  # 记录额外信息# ACC_RADIUS 配置
modparam("acc_radius", "radius_flag", 1)  # 启用 RADIUS 记录
modparam("acc_radius", "radius_config", "/etc/radiusclient-ng/radiusclient.conf")  # RADIUS 配置文件route {if (method == "INVITE") {setflag(1);  # 设置计费标志t_relay();   # 转发请求}
}
  • 结果
    • 计费信息会同时记录到 syslog。
    • 生成 JSON 文档并推送到消息队列。
    • 通过 RADIUS 协议发送到 RADIUS 服务器。

通过以上案例,可以看出 ACC、ACC_JSON 和 ACC_RADIUS 的主要区别在于支持的计费后端和数据格式。根据实际需求选择合适的模块或组合使用多个模块。

在 Kamailio 中,ACC_JSONACC_RADIUSACC 模块的扩展模块,但它们的设计是独立的,不需要显式加载 ACC 模块。也就是说,你可以直接加载并使用 ACC_JSONACC_RADIUS,而不需要先加载 ACC 模块


原因

  1. 模块独立性

    • ACC_JSONACC_RADIUS 是独立的模块,它们内部已经包含了必要的 ACC 功能。
    • 它们通过 Kamailio 的核心接口与事务管理器(TM 模块)交互,不需要依赖 ACC 模块。
  2. 功能分离

    • ACC 模块专注于 syslog 和 SQL 数据库的计费功能。
    • ACC_JSON 专注于生成 JSON 格式的计费信息并推送到消息队列。
    • ACC_RADIUS 专注于将计费信息发送到 RADIUS 服务器。
  3. 避免冲突

    • 如果同时加载 ACCACC_JSONACC_RADIUS,可能会导致重复计费或配置冲突。因此,通常建议根据需要选择加载其中一个模块。

使用示例

1. 单独使用 ACC_JSON
kamailio"># 加载 ACC_JSON 模块
loadmodule "acc_json.so"# 配置 ACC_JSON
modparam("acc_json", "log_flag", 1)  # 启用 JSON 记录
modparam("acc_json", "log_extra", "ua=$hdr(User-Agent);uuid=$avp(i:123)")  # 记录额外信息route {if (method == "INVITE") {setflag(1);  # 设置计费标志t_relay();   # 转发请求}
}
  • 结果:所有 INVITE 请求的计费信息会生成 JSON 文档并推送到消息队列。

2. 单独使用 ACC_RADIUS
kamailio"># 加载 ACC_RADIUS 模块
loadmodule "acc_radius.so"# 配置 ACC_RADIUS
modparam("acc_radius", "radius_flag", 1)  # 启用 RADIUS 记录
modparam("acc_radius", "radius_config", "/etc/radiusclient-ng/radiusclient.conf")  # RADIUS 配置文件route {if (method == "INVITE") {setflag(1);  # 设置计费标志t_relay();   # 转发请求}
}
  • 结果:所有 INVITE 请求的计费信息会通过 RADIUS 协议发送到 RADIUS 服务器。

3. 同时使用 ACC_JSON 和 ACC_RADIUS
kamailio"># 加载 ACC_JSON 和 ACC_RADIUS 模块
loadmodule "acc_json.so"
loadmodule "acc_radius.so"# 配置 ACC_JSON
modparam("acc_json", "log_flag", 1)  # 启用 JSON 记录
modparam("acc_json", "log_extra", "ua=$hdr(User-Agent);uuid=$avp(i:123)")  # 记录额外信息# 配置 ACC_RADIUS
modparam("acc_radius", "radius_flag", 1)  # 启用 RADIUS 记录
modparam("acc_radius", "radius_config", "/etc/radiusclient-ng/radiusclient.conf")  # RADIUS 配置文件route {if (method == "INVITE") {setflag(1);  # 设置计费标志t_relay();   # 转发请求}
}
  • 结果
    • 计费信息会生成 JSON 文档并推送到消息队列。
    • 同时通过 RADIUS 协议发送到 RADIUS 服务器。

注意事项

  1. 避免重复加载 ACC 模块

    • 如果加载了 ACC 模块,同时加载 ACC_JSONACC_RADIUS,可能会导致重复计费或配置冲突。
    • 建议根据需要选择加载其中一个模块。
  2. 依赖关系

    • ACC_JSONACC_RADIUS 依赖于事务管理器(TM 模块),因此需要确保加载了 TM 模块:
      kamailio">loadmodule "tm.so"
      
  3. 配置冲突

    • 如果同时使用多个计费模块,确保它们的配置(如 log_flagradius_flag 等)不会冲突。

总结

  • ACC_JSONACC_RADIUS 是独立的模块,不需要先加载 ACC 模块
  • 根据需求选择加载 ACC_JSONACC_RADIUS,或者同时加载它们。
  • 避免同时加载 ACC 模块,以防止重复计费或配置冲突。

http://www.ppmy.cn/embedded/158844.html

相关文章

深度学习练手小例子——cifar10数据集分类问题

CIFAR-10 是一个经典的计算机视觉数据集,广泛用于图像分类任务。它包含 10 个类别的 60,000 张彩色图像,每张图像的大小是 32x32 像素。数据集被分为 50,000 张训练图像和 10,000 张测试图像。每个类别包含 6,000 张图像,具体类别包括&#x…

Qt 5.14.2 学习记录 —— 이십일 Qt网络和音频

文章目录 1、UDP带有界面的Udp服务器(回显服务器) 2、TCP回显服务器 3、HTTP客户端4、音频 和Linux的网络一样,Qt封装了Linux的网络API,即Socket API。网络编程是在应用层写,需要传输层支持,传输层有UDP和T…

应用层协议 HTTP 讲解实战:从0实现HTTP 服务器

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 HTTP 协议 🦋 认识 URL🦋 urlencode 和 urldecode 二:🔥 HTTP 协议请求与响应格式 🦋 HTTP 请求…

Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

开发技巧,vue 中的动态组件的引用 component + is

在项目中很多时候有切换 tab 的场景&#xff0c;一般来说都是用 v-if 或者 v-show 然后根据各种条件来控制显示隐藏。 其实我们可以使用 vue 中的动态组件&#xff0c;也能实现这个效果 <!-- currentTab 改变时组件也改变 --> <component :is"currentTab"…

递归练习七(floodfill 算法)

一、floodfill 算法介绍 本质就是找性质相同的联通块。所以与之前的决策树暴搜不同的是回溯时走过的不会再走。 二、例题 1、图像渲染 733. 图像渲染 - 力扣&#xff08;LeetCode&#xff09; 2、岛屿数量 200. 岛屿数量 - 力扣&#xff08;LeetCode&#xff09; 3、岛屿最…

Kotlin函数式API

Kotlin函数式API 1.maxBy val list listOf("Apple","Banana", "Orange","pear","Grape","Watermelon") val maxLengthFruit list.maxBy {it.length} println(maxLengthFruit) 2.map 集合中zhi的map函数是最…

Electricity Market Optimization 探索系列(一)

​ 本文参考链接&#xff1a;Linear Programming Mini Example 先从一个线性规划的例子说起&#xff1a; 问题背景&#xff1a; 现在需要使用两台发电机满足用户的用电需求&#xff0c;发电机一的发电功率上限是 6MW&#xff0c;发电机二的发电功率上限是 4MW&#xff0c;发电…