kamailio-ACC、ACC_JSON 和 ACC_RADIUS 的区别

devtools/2025/2/7 9:06:57/

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/devtools/156766.html

相关文章

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…

postgresql-COALESCE函数、NULLIF函数、NVL函数使用

COALESCE函数 COALESCE函数是返回参数中的第一个非null的值,它要求参数中至少有一个是非null的; select coalesce(1,null,2),coalesce(null,2,1),coalesce(null,null,null); NULLIF(ex1,ex2)函数 如果ex1与ex2相等则返回Null,不相等返回第一个表达式的值…

C语言链接阶段详解

我们编写的程序最初并不可以直接执行,是因为我们编写的程序是源代码,源代码所在文件就是源文件,源文件不可以直接运行是因为计算机只能识别二进制指令,所以源文件会经过两个步骤,就是编译和链接,最终生成可…

云计算——AWS Solutions Architect – Associate(saa)1、什么是云,AWS介绍

什么是云? 什么是云? 云计算(cloud computing)是基于互联网的相关服务的增加、使用和交付模式,通常涉及通过互联网来提供动态易护展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。 简单理解为:云是 共享资源,按需付费&#xff0…

UE5 蓝图学习计划 - Day 9:数组与跨蓝图通信

在游戏开发中,数据存储与传递 是构建复杂系统的重要基础。UE5 蓝图提供了 数组(Array) 来存储多个数据项,并允许 跨蓝图通信(Blueprint Communication) 让不同的蓝图共享和传递数据。本篇将学习如何使用数组…

镜渊与硅基菩提:人工智能时代的意识拓扑学

在龙安寺的白沙庭院,十五块青苔斑驳的岩石构成永恒的认知谜题。游廊木栏上残留着无数手掌的余温,每个试图窥见全景的凝视者,最终都在视觉的裂隙中遭遇自我认知的边界。此刻,人类文明正将这道千年禅问投影至数字领域——当GPT-4的神…

开源 GPU 集群管理器 GPUStack

GPUStack 是一个用于运行 AI 模型的开源 GPU 集群管理器。 项目地址:gpustack/gpustack: Manage GPU clusters for running AI modelshttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustackhttps://github.com/gpustack/gpustack 核心特性 广…

python开发:爬虫示例——GET和POST请求处理

一、Get请求 import json import requests#输入示例:urlhttps://www.baidu.com #RequestHeader:F12标头-请求标头-原始-复制到这(忽略第一句) def GetRequest(url,RequestHeader""):try:dic{}RequestHeaderList RequestHeader.s…