kamailio-ACC_JSON模块详解

devtools/2025/2/3 3:18:39/

ACC_JSON 模块

作者
Julien Chavanton
jchavanton@gmail.com
Julien Chavanton
flowroute.com
jchavanton@gmail.com

编辑
Julien Chavanton
flowroute.com
jchavanton@gmail.com

版权
© 2018 Flowroute.com


目录

  1. 管理员指南
    1. 概述
    2. 依赖
      2.1 Kamailio 模块
      2.2 外部库或应用程序
    3. 参数
      3.1 acc_flag(整数)
      3.2 acc_missed_flag(整数)
      3.3 acc_extra(字符串)
      3.4 acc_json_pre_encoded_prefix(字符串)
      3.5 acc_time_mode(整数)
      3.6 acc_time_format(字符串)
      3.7 acc_output_mqueue(整数)
      3.8 acc_output_syslog(整数)
      3.9 acc_log_facility(整数)
      3.10 acc_log_level(整数)
      3.11 cdr_enable(整数)
      3.12 cdr_extra(字符串)
      3.13 cdr_pre_encoded_prefix(字符串)
      3.14 cdr_expired_dlg_enable(字符串)
      3.15 cdr_output_mqueue(整数)
      3.16 cdr_output_syslog(整数)
      3.17 cdr_log_facility(整数)
      3.18 cdr_log_level(整数)

1. 概述

ACC_JSON 模块用于将事务信息以 JSON 字典的形式记录。它绑定到 ACC 模块的 API,并使用与其他后端相同的计费机制。

它可以将 JSON 字典输出到 MQUEUE 或 SYSLOG(即使 Kamailio 未使用 syslog)。


2. 依赖

2.1 Kamailio 模块

该模块依赖于以下模块(即以下模块必须在此模块之前加载):

  • acc:计费模块。
  • mqueue:消息队列模块(可选)。
2.2 外部库或应用程序

在运行 Kamailio 之前,必须安装以下库或应用程序:

  • jansson:用于编码、解码和操作 JSON 数据的 C 库。
    官网:http://www.digip.org/jansson/

3. 参数

3.1 acc_flag(整数)

请求标志,用于标记需要计费的事务。参见 acc_output_mqueueacc_output_syslog
默认值为未设置(无标志)。

示例 1.1. acc_flag 示例

modparam("acc_json", "acc_flag", 2)

3.2 acc_missed_flag(整数)

请求标志,用于标记需要计费的未接呼叫。参见 acc_output_mqueueacc_output_syslog
默认值为未设置(无标志)。

示例 1.2. acc_missed_flag 示例

modparam("acc_json", "acc_missed_flag", 3)

3.3 acc_extra(字符串)

要添加到 JSON 字典中的额外值。
默认值为 NULL。

示例 1.3. acc_extra 示例

modparam("acc_json", "acc_extra", "via=$hdr(Via[*]); email=$avp(s:email)")

3.4 acc_json_pre_encoded_prefix(字符串)

用于标识已预先编码为 JSON 的值的前缀。
默认值为 NULL。

示例 1.4. acc_json_pre_encoded_prefix 示例

modparam("acc_json", "acc_extra", "json_data=$avp(json_data);")
modparam("acc_json", "acc_json_pre_encoded_prefix", "json_")
...
$avp(json_data) = '{"b":2, "c":3}';

3.5 acc_time_mode(整数)

存储与事件时间相关的额外值。
可选值:

  • 0:默认值,仅保存 Unix 时间戳(syslog)或日期时间(数据库)。
  • 1:保存秒数到 time_attr,微秒数到 time_exten
  • 2:保存秒数.毫秒数到 time_attr
  • 3:根据 time_format 参数保存格式化时间(使用 localtime() 输出)。
  • 4:根据 time_format 参数保存格式化时间(使用 gmtime() 输出)。

示例 1.5. acc_time_mode 示例

modparam("acc_json", "acc_time_mode", 1)

3.6 acc_time_format(字符串)

指定时间格式(用于 time_mode 为 3 或 4 时)。
默认值为 %Y-%m-%d %H:%M:%S

示例 1.6. acc_time_format 示例

modparam("acc_json", "acc_time_format", "%Y/%m/%d %H:%M:%S")

3.7 acc_output_mqueue(整数)

需要 mqueue 模块。ACC 模块会将 JSON 计费事件排队到指定的消息队列中。可以使用 rtimer 模块的 exec 访问队列并处理事件。
默认值为未设置(不启用消息队列)。

示例 1.7. acc_output_mqueue 使用示例

modparam("mqueue", "mqueue", "name=acc_events;size=100000")
modparam("acc_json", "acc_output_mqueue", "acc_events")
modparam("acc_json", "acc_flag", 2)
modparam("acc_json", "acc_extra", "caller_ip_port=$avp(caller_ip_port);")
modparam("rtimer", "timer", "name=nsqt;interval=1;mode=1;")
modparam("rtimer", "exec", "timer=nsqt;route=RUN_CDR_PUBLISH")
modparam("http_client", "keep_connections", 1)
modparam("http_client", "httpcon", "nsqd=>http://localhost:4151/pub?topic=acc")route[RUN_ACC_PUBLISH] {$var(count) = 0;while (mq_fetch("acc_events")) {$var(q_size) = mq_size("acc_events");$var(count) = $var(count) + 1;xinfo("[RUN_ACC_PUBLISH][$var(q_size)][$var(count)][$mqk(acc_events)][$mqv(acc_events)]\n");$var(res) = http_connect_raw("nsqd", "", "application/json", $mqv(acc_events), "$var(nsq_res)");if ($var(res) < 0) {xerr("[RUN_ACC_PUBLISH][$var(res)] http_connect_raw: timeout or error !\n");mq_add("acc_events", "acc_key", "$mqv(acc_events)");} else if ($var(res) < 200 || $var(res) > 299) {xerr("[RUN_ACC_PUBLISH][$var(res)] http unexpected response code !\n");mq_add("acc_dead_letter_queue", "acc_key", "$mqv(acc_events)");return;}}if ($var(count) > 0 ) {xinfo("[RUN_CDR_PUBLISH]done count[$var(count)]\n");}
}

3.8 acc_output_syslog(整数)

控制是否将 ACC JSON 输出发送到 syslog。即使 Kamailio 未以守护进程模式运行或日志输出到 stdout/stderr,也可以使用 syslog。
默认值为未设置(无标志)。

示例 1.8. acc_output_syslog 示例

modparam("acc_json", "acc_output_syslog", 1)
modparam("acc_json", "acc_log_level", 2)
modparam("acc_json", "acc_log_facility", "LOG_DAEMON")

3.9 acc_log_facility(整数)

指定 syslog 的日志设施。
默认值为 LOG_DAEMON

示例 1.9. acc_log_facility 示例

modparam("acc_json", "acc_log_facility", "LOG_LOCAL0")

3.10 acc_log_level(整数)

指定 syslog 的日志级别。
默认值为 1(L_NOTICE)。

示例 1.10. acc_log_level 示例

modparam("acc_json", "acc_log_level", 2) # 设置为 2(L_INFO)

3.11 cdr_enable(整数)

启用 CDR 报告,每个呼叫生成一条记录,依赖于对话框模块。
可选值:

  • 0:关闭(默认)。
  • 1:启用。

示例 1.11. cdr_enable 示例

modparam("acc_json", "cdr_enable", 1)

3.12 cdr_extra(字符串)

定义自定义 CDR 字段的伪变量集。
默认值为 NULL。

示例 1.12. cdr_extra 示例

modparam("acc_json", "cdr_extra", "ci=$dlg_var(call_id);ft=$dlg_var(from_tag)")

3.13 cdr_pre_encoded_prefix(字符串)

用于标识已预先编码为 JSON 的值的前缀。
默认值为 NULL。

示例 1.13. cdr_pre_encoded_prefix 示例

modparam("acc_json", "cdr_extra", "json_data=$avp(json_data);")
modparam("acc_json", "cdr_pre_encoded_prefix", "json_")
...
$avp(json_data) = '{"b":2, "c":3}';

3.14 cdr_expired_dlg_enable(字符串)

是否在对话框过期时启用 CDR 日志记录?
可选值:

  • 0:关闭(默认)。
  • 1:启用。

示例 1.14. cdr_expired_dlg_enable 示例

modparam("acc_json", "cdr_expired_dlg_enable", 1)

3.15 cdr_output_mqueue(整数)

需要 mqueue 模块。ACC 模块会将 JSON CDR 事件排队到指定的消息队列中。可以使用 rtimer 模块的 exec 访问队列并处理事件。
默认值为未设置(不启用消息队列)。

示例 1.15. cdr_output_mqueue 使用示例

modparam("mqueue", "mqueue", "name=cdr_events;size=100000")
modparam("acc_json", "cdr_enable", 1)
modparam("acc_json", "cdr_output_mqueue", "cdr_events")
modparam("acc_json", "cdr_extra", "ci=$dlg_var(call_id)")
modparam("rtimer", "timer", "name=nsqt;interval=1;mode=1;")
modparam("rtimer", "exec", "timer=nsqt;route=RUN_CDR_PUBLISH")
modparam("http_client", "keep_connections", 1)
modparam("http_client", "httpcon", "nsqd=>http://localhost:4151/pub?topic=acc")route[RUN_CDR_PUBLISH] {$var(count) = 0;while (mq_fetch("cdr_events")) {$var(q_size) = mq_size("cdr_events");$var(count) = $var(count) + 1;xinfo("[RUN_CDR_PUBLISH][$var(q_size)][$var(count)][$mqk(cdr_events)][$mqv(cdr_events)]\n");$var(res) = http_connect_raw("nsqd", "", "application/json", $mqv(cdr_events), "$var(nsq_res)");if ($var(res) < 0) {xerr("[RUN_CDR_PUBLISH][$var(res)] http_connect_raw: timeout or error !\n");mq_add("cdr_events", "cdr_key", "$mqv(cdr_events)");} else if ($var(res) < 200 || $var(res) > 299) {xerr("[RUN_CDR_PUBLISH][$var(res)] http unexpected response code !\n");mq_add("cdr_dead_letter_queue", "cdr_key", "$mqv(cdr_events)");return;}}if ($var(count) > 0 ) {xinfo("[RUN_CDR_PUBLISH]done count[$var(count)]\n");}
}

3.16 cdr_output_syslog(整数)

ACC 模块会将 JSON CDR 事件记录到 syslog。


3.17 cdr_log_facility(整数)

指定 syslog 的日志设施。
默认值为 LOG_DAEMON

示例 1.16. cdr_log_facility 示例

modparam("acc_json", "cdr_log_facility", "LOG_LOCAL0")

3.18 cdr_log_level(整数)

指定 syslog 的日志级别。
默认值为 1(L_NOTICE)。

示例 1.17. cdr_log_level 示例

modparam("acc_json", "cdr_log_level", 2) # 设置为 2(L_INFO)

总结

通过以上参数和示例,可以灵活配置 ACC_JSON 模块,将计费信息以 JSON 格式输出到消息队列或 syslog,并支持自定义字段和时间格式。


http://www.ppmy.cn/devtools/155606.html

相关文章

蓝桥杯刷题DAY1:前缀和

所谓刷题&#xff0c;讲究的就是细心 帕鲁服务器崩坏【算法赛】 “那个帕鲁我已经观察你很久了&#xff0c;我对你是有些失望的&#xff0c;进了这个营地&#xff0c;不是把事情做好就可以的&#xff0c;你需要有体系化思考的能力。” 《幻兽帕鲁》火遍全网&#xff0c;成为…

软件测试—— 接口测试(HTTP和HTTPS)

软件测试—— 接口测试&#xff08;HTTP和HTTPS&#xff09; HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头&#xff08;Request Headers&#xff09;示例请求标头 响应标头&#xff08;Response Header…

【Java异步编程】CompletableFuture实现:异步任务的合并执行

文章目录 一. 合并两个异步任务的结果1. thenCombine()&#xff1a;组合两个异步任务的结果2. runAfterBoth()&#xff1a;在两个任务完成后执行无返回值操作3. thenAcceptBoth()&#xff1a;消费两个任务的结果 二. allOf()&#xff1a;等待所有任务完成 如果某个任务同时依赖…

计算机视觉和图像处理

计算机视觉与图像处理的最新进展 随着人工智能技术的飞速发展&#xff0c;计算机视觉和图像处理作为其中的重要分支&#xff0c;正逐步成为推动科技进步和产业升级的关键力量。 一、计算机视觉的最新进展 计算机视觉&#xff0c;作为人工智能的重要分支&#xff0c;主要研究如…

MATLAB中extractAfter函数用法

目录 语法 说明 示例 选择子字符串后的文本 使用模式提取路径后的文件名 选择指定位置后的子字符串 选择字符向量中位置之后的文本 extractAfter函数的用法是提取指定位置后的子字符串。 语法 newStr extractAfter(str,pat) newStr extractAfter(str,pos) 说明 new…

《DeepSeek手机版:开启AI移动新时代》

DeepSeek 手机版爆火&#xff1a;现象与背景 在当今数字化时代&#xff0c;AI 技术的发展日新月异&#xff0c;如同一股汹涌澎湃的浪潮&#xff0c;深刻地改变着我们的生活。而在这股浪潮中&#xff0c;DeepSeek 手机版宛如一颗璀璨的新星&#xff0c;迅速崛起&#xff0c;引发…

【Linux】从硬件到软件了解进程

个人主页~ 从硬件到软件了解进程 一、冯诺依曼体系结构二、操作系统三、操作系统进程管理1、概念2、PCB和task_struct3、查看进程4、通过系统调用fork创建进程&#xff08;1&#xff09;简述&#xff08;2&#xff09;系统调用生成子进程的过程〇提出问题①fork函数②父子进程关…

git:恢复纯版本库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…