kamailio-ACC、ACC_JSON 和 ACC_RADIUS 的区别

ops/2025/2/5 16:02:32/

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/ops/155914.html

相关文章

深度学习 Pytorch 神经网络的学习

本节将从梯度下降法向外拓展,介绍更常用的优化算法,实现神经网络的学习和迭代。在本节课结束将完整实现一个神经网络训练的全流程。 对于像神经网络这样的复杂模型,可能会有数百个 w w w的存在,同时如果我们使用的是像交叉熵这样…

数据库开发常识(10.6)——SQL性能判断标准及索引误区(1)

10.6. 数据库开发常识 作为一名专业数据库开发人员,不但需要掌握数据库开发相关的语法和功能实现,还要掌握专业数据库开发的常识。这样,才能在保量完成工作任务的同时,也保质的完成工作任务,避免了为应用的日后维护埋…

7、怎么定义一个简单的自动化测试框架?

定义一个简单的自动化测试框架可以从需求理解、框架设计、核心模块实现、测试用例编写和集成执行等方面入手,以下为你详细介绍: 1. 明确框架需求和范围 确定测试类型:明确框架要支持的测试类型,如单元测试、接口测试、UI 测试等…

TGT-HC:一种用于无线时间敏感网络的时隙感知整形MAC方案的调研、设计与评估

论文标题 中文标题:TGT-HC:一种用于无线时间敏感网络的时隙感知整形MAC方案的调研、设计与评估 英文标题:Survey, Design and Evaluation of TGT-HC: A Time-Aware Shaper MAC for Wireless TSN 作者信息 Raymond J. Jayabal(I…

kamailio-ACC_JSON模块详解【后端语言go】

要确认 ACC_JSON 模块是否已经成功将计费信息推送到消息队列(MQueue),以及如何从队列中取值,可以按照以下步骤进行操作: 1. 确认 ACC_JSON 已推送到队列 1.1 配置 ACC_JSON 确保 ACC_JSON 模块已正确配置并启用。以下…

STM32-时钟树

STM32-时钟树 时钟 时钟

基于FPGA的BT1120编解码

BT1120与BT656 类似 BT1120与BT656同类属于一个视频协议,两者无论从组成、协议、同步码以及传输过程都是十分相似: 1、两者都是以F(场)、V(帧)、H(消隐)、D(有效)来区分数据的内容。 2、两者的传输数据都采用一样的方式,即内同步传输数据。 3、两者都传输的数据都是…

算法设计-哈夫曼树(C++)

一、详细代码 算法原理&#xff1a; Huffman编码是一种用于数据压缩的算法&#xff0c;它通过为出现频率较高的字符分配较短的编码&#xff0c;而为出现频率较低的字符分配较长的编码&#xff0c;从而实现数据的压缩。 #include <iostream> #include <queue> #in…