当前位置: 首页 > article >正文

kamailio-ACC_JSON模块详解

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.kler.cn/a/528599.html

相关文章:

  • tf.Keras (tf-1.15)使用记录3-model.compile方法
  • android Camera 的进化
  • FFmpeg工具使用基础
  • lstm代码解析1.2
  • Day31-【AI思考】-深度学习方法论全解析——科学提升学习效率的终极指南
  • C#方法(练习)
  • 【算法设计与分析】实验7:复杂装载及0/1背包问题的回溯法设计与求解
  • 快速了解Java虚拟机(JVM)以及常见面试题(持续更新中
  • python学习——常用的内置函数汇总
  • 2025年1月30日(Matlab 总结 `rm = 0:0.1:10;`)
  • 分析伏羲万年历
  • 4.攻防世界Web_php_include
  • 使用真实 Elasticsearch 进行高级集成测试
  • deep generative model stanford lecture note1 --- introduction
  • 8645 归并排序(非递归算法)
  • 工业相机如何获得更好的图像色彩
  • 常见数据丢失问题类型及解决方案
  • 前端 | 深入理解Promise
  • 蓝桥杯备赛经验帖
  • 图书管理系统 Axios 源码 __删除图书功能
  • Linux命令(144)之diff
  • [CVPR 2022]Cross-view Transformers for real-time Map-view Semantic Segmentation
  • Spring Boot项目如何使用MyBatis实现分页查询
  • 90,【6】攻防世界 WEB Web_php_unserialize
  • python-leetcode-完全二叉树的节点个数
  • webrtc协议详细解释