Bootstrap

kamailio-ACC、ACC_JSON 和 ACC_RADIUS 的区别

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
loadmodule "acc.so"
modparam("acc", "log_flag", 1)  # 启用 syslog 记录
modparam("acc", "log_level", 1) # 设置日志级别为 L_NOTICE

route {
    if (method == "INVITE") {
        setflag(1);  # 设置计费标志
        t_relay();   # 转发请求
    }
}
  • 结果:所有 INVITE 请求的计费信息会被记录到 syslog 中。

2. ACC_JSON 模块

  • 功能:ACC_JSON 模块是 ACC 的扩展模块,支持将计费信息生成 JSON 格式的文档,并通过消息队列(MQueue)推送。
  • 特点
    • 生成的 JSON 文档可以包含事务的固定属性和额外的自定义信息。
    • 适用于需要将计费信息以结构化数据(JSON)形式发送到外部系统的场景。
  • 适用场景:适用于需要将计费信息发送到消息队列或外部系统的场景。
案例:生成 JSON 并推送到消息队列
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 服务器
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 服务器:

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
# 加载 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
# 加载 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
# 加载 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 模块:
      loadmodule "tm.so"
      
  3. 配置冲突

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

总结

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