概述

最近因为业务需要,在看freeswitch中话单相关的一些模块。

在voip的使用过程中,话单是重要的基础模块,涉及到计费和问题查找。

呼叫话单最重要的一点是稳定,不能有错误或遗漏。

本章对fs的话单模块做整体梳理和简单介绍。

环境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.8.7

GCC:4.8.5

话单模块

freeswitch中CDR相关模块较多,粗略列一下。

mod_cdr_csv

mod_cdr_mongodb

mod_cdr_pg_csv

mod_cdr_sqlite

mod_format_cdr

mod_json_cdr

mod_odbc_cdr

mod_radius_cdr

mod_xml_cdr

其中,mod_cdr_csv模块是默认编译和启动加载的cdr模块,其他模块需要用户自己根据需要编译和加载。

上面列出的模块,大部分可以根据名字猜测出模块的主要功能,比如,“mod_cdr_csv”模块表示把CDR话单写入CSV文件,“mod_cdr_mongodb”模块表示把CDR话单写入mongodb数据库。

每个模块都有自己单独的配置文件。

根据项目需求,这里主要关注CDR话单写入文件的模块,其他写数据库的模块暂时先略过。

mod_cdr_csv

freeswitch默认CDR模块,自动编译、安装、加载。

模块对应配置文件为“/usr/local/freeswitch/autoload_configs/cdr_csv.conf.xml”。

配置文件中可以设置多个CDR模板,并根据通道变量“accountcode”的值来对应模板名出话单。

CDR模板中可以使用fs会话的所有通道变量,并根据需求设置模板格式。

修改配置文件“/usr/local/freeswitch/autoload_configs/cdr_csv.conf.xml”。

<template name="example">{"data":{"ACCOUNTCODE":"${ACCOUNTCODE}","channel_va_test":"${channel_va_test}","${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}","${accountcode}","${read_codec}","${write_codec}"}}</template>

<template name="snom">"${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}","${read_codec}","${write_codec}","${sip_user_agent}","${call_clientcode}","${sip_rtp_rxstat}","${sip_rtp_txstat}","${sofia_record_file}"</template>

设置通道变量“ACCOUNTCODE”为“snom”,呼叫测试。

呼叫结束之后,可以在“/usr/local/freeswitch/log/cdr-csv/Master.csv”文件中找到话单如下。

{"data":{"ACCOUNTCODE":"snom","channel_va_test":"","Outbound Call","1001","1001","ext_test","2022-06-23 14:36:25","2022-06-23 14:36:27","2022-06-23 14:36:33","8","6","ALLOTTED_TIMEOUT","cdbb0266-f2be-11ec-b928-a1f80b63cfc8","","snom","PCMA","PCMA"}}

同时,在“/usr/local/freeswitch/log/cdr-csv/snom.csv”文件中找到话单如下。

"Outbound Call","1001","1001","ext_test","2022-06-23 14:36:25","2022-06-23 14:36:27","2022-06-23 14:36:33","8","6","ALLOTTED_TIMEOUT","cdbb0266-f2be-11ec-b928-a1f80b63cfc8","", "snom","PCMA","PCMA","FreeSWITCH-mod_sofia/1.6.19+git~20220408T073647Z~f81cb238da~64bit","","","",""

mod_json_cdr

mod_json_cdr模块默认不编译,不安装,不加载。

进入“freeswitch-1.6.19_master/src/mod/event_handlers/mod_json_cdr”目录,编译安装。

make install

cd /usr/local/freeswitch/mod

ll -tr

-rwxr-xr-x. 1 root root  122096 Jul  6 16:00 mod_json_cdr.so

-rwxr-xr-x. 1 root root    1289 Jul  6 16:00 mod_json_cdr.la

cd  /usr/local/freeswitch/mod/autoload_configs

vi modules.conf.xml

<load module="mod_json_cdr"/>

模块对应配置文件“/usr/local/freeswitch/conf/autoload_configs/json_cdr.conf.xml”。

呼叫测试。

呼叫结束之后,可以在“/usr/local/freeswitch/log/json_cdr/49704084-fd13-11ec-8158-19509e341d8a.cdr.json”文件中找到话单如下。

{

"core-uuid":"3e74f030-fd13-11ec-8155-19509e341d8a",

"switchname":"localhost.localdomain",

"channel_data":{

"state":"CS_REPORTING",

"direction":"outbound",

"state_number":"11",

"flags":"0=1;1=1;2=1;20=1;37=1;38=1;40=1;43=1;53=1;60=1;95=1;112=1;113=1;122=1",

"caps":"1=1;2=1;3=1;4=1;5=1;6=1"

},

"callStats":Object{...},

"variables":Object{...},

"app_log":Object{...},

"callflow":Array[2]

}

mod_format_cdr

mod_format_cdr模块默认不编译,不安装,不加载。

进入“freeswitch-1.6.19_master/src/mod/event_handlers/mod_format_cdr”目录,编译安装。

make install

cd /usr/local/freeswitch/mod

ll -tr

-rwxr-xr-x. 1 root root  122096 Jul  6 16:00 mod_format_cdr.so

-rwxr-xr-x. 1 root root    1289 Jul  6 16:00 mod_format_cdr.la

cd  /usr/local/freeswitch/mod/autoload_configs

vi modules.conf.xml

<load module="mod_format_cdr"/>

模块对应配置文件“/usr/local/freeswitch/autoload_configs/format_cdr.conf.xml”

呼叫测试。

呼叫结束之后,可以在“/usr/local/freeswitch/log/format_cdr”目录找到俩个话单文件。

cat  a_49704084-fd13-11ec-8158-19509e341d8a.cdr.json

{

"core-uuid":"3e74f030-fd13-11ec-8155-19509e341d8a",

"switchname":"localhost.localdomain",

"channel_data":Object{...},

"callStats":Object{...},

"variables":Object{...},

"app_log":Object{...},

"callflow":Array[2]

}

cat  a_49704084-fd13-11ec-8158-19509e341d8a.cdr.xml

<?xml version="1.0"?>

<cdr core-uuid="3e74f030-fd13-11ec-8155-19509e341d8a" switchname="localhost.localdomain">

<channel_data>

...

</channel_data>

<call-stats>

...

</call-stats>

<variables>

...

</variables>

<app_log>

...

</app_log>

<callflow dialplan="XML" unique-id="4b39417c-fd13-11ec-815a-19509e341d8a" clone-of="4970484a-fd13-11ec-8159-19509e341d8a" profile_index="2">

...

</callflow>

</cdr>

总结

mod_cdr_csv模块是fs的基础话单模块。

mod_format_cdr模块的功能包含了mod_json_cdr和mod_xml_cdr俩个模块的功能,是后二者的超集,具有替换作用。

空空如常

求真得真

freeswitch的话单模块的更多相关文章

  1. FreeSWITCH 加载模块过程解读

    今天来学习FreeSWITCH 加载模块过程. 哪些模块需要编译,是由源码下的 modules.conf 文件决定的. 哪些模块在程序启动时自动加载,是由 freeswitch/conf/autolo ...

  2. freeswitch插件式模块接口实现方式

    概述 freeswitch的外围模块是插件式的,可以动态的加载和卸载,使用起来非常的灵活和方便. 如果我们自己来设计一个开源的代码框架,相信这种插件式的模块结构是非常适合多人合作的模式. 本文对fs的 ...

  3. freeswitch的mod_curl模块

    概述 有时候,我们需要在呼叫的过程中,或过程后调用web api接口. freeswitch的mod_curl模块可以很方便的实现web api的接口调用. mod_curl模块默认不安装,需要进入模 ...

  4. freeswitch使用mod_shout模块播放mp3

    概述 freeswitch 在对VOIP语音通话中,可以通过playback命令播放IVR语音文件. 默认情况下,freeswitch支持wav文件,也可以直接播放VOIP中常见编解码的G711文件. ...

  5. layui---form表单模块

    虽然对layui比较熟悉了,但是今天有时间还是将layui的form表单模块重新看一下. https://www.layui.com/doc/modules/form.html 一.更新渲染 layu ...

  6. freeswitch编译mod_av模块

    需要先编译libav库 编译libav下载:git clone https://freeswitch.org/stash/scm/sd/libav.git cd libav ./configure - ...

  7. getFieldDecorator用法(二)——封装表单模块

    后台管理系统经常用到表单查询,因此做了个封装 myorder.js import React from 'react'; import { Card, Button, Table, Form, Sel ...

  8. coding++ :Layui-form 表单模块

    虽然对layui比较熟悉了,但是今天有时间还是将layui的form表单模块重新看一下. https://www.layui.com/doc/modules/form.html 1):更新渲染 lay ...

  9. 表单模块 layui-form

    使用 layui针对各种表单元素做了比较全面的Ui支持,在Ui渲染只要求一点.,在表单体所在父元素加上class="layui-form" 监听事件 提交按钮监听,注意需要加·la ...

随机推荐

  1. 在centos 7 中 conda 环境和Python2.7 中安装远程jupyter

    折腾了半天,为了能够方便学习TensorFlow,搞了远程的jupyter,方便在本地使用它,今天填了不少坑. 装完后截图: 下面是一些步骤: 检查 Python 环境 CentOS 7.2 中默认集 ...

  2. 用浏览器快速开启Docker的体验之旅

    互联网科技发展创造了很多奇迹,比如我今天要提到的 docker 技术就是其一.我很早就关注它(在2015年写过这方面的博客),那会儿还只是一个开源项目,现在已经是一个行业事实标准了,它推动了云原生的变 ...

  3. 『现学现忘』Git基础 — 22、Git中文件重命名

    目录 1.用学过的命令进行文件重命名 2.使用git mv命令进行文件重命名 我们这篇文章来说说在Git中如何进行文件重命名. 提示一下,下面所说明的是对已经被Git管理的文件进行重命名,未被Git追 ...

  4. 关于 MyBatis-Plus 分页查询的探讨 → count 都为 0 了,为什么还要查询记录?

    开心一刻 记得上初中,中午午休的时候,我和哥们躲在厕所里吸烟 听见外面有人进来,哥们猛吸一口,就把烟甩了 进来的是教导主任,问:你们干嘛呢? 哥们鼻孔里一边冒着白烟一边说:我在生气 环境搭建 依赖引入 ...

  5. Glide源码解析二---into方法

    转载请标明出处,维权必究: https://www.cnblogs.com/tangZH/p/12543154.html Glide作为一个强大的图片加载框架,已经被android官方使用,所以,明白 ...

  6. Asp.Net Core 7 preview 4 重磅新特性--限流中间件

    前言 限流是应对流量暴增或某些用户恶意攻击等场景的重要手段之一,然而微软官方从未支持这一重要特性,AspNetCoreRateLimit这一第三方库限流库一般作为首选使用,然而其配置参数过于繁多,对使 ...

  7. 用js给闺女做了一个加减乘除的html

    下班回家用二十分钟给闺女做了一个加减乘除的页面,顺便记录下代码,时间仓促,后期再来修改吧 目录结构 -yq --menu.html --yq.html --yq50.html --yq70.html ...

  8. arts-week9

    Algorithm 521. Longest Uncommon Subsequence I - LeetCode Review 如何搭建一个私有的CDN? 大部分情况下,我们使用市场上现有的 CDN ...

  9. CSS基础学习(二)

    11.CSS背景 ①设置背景颜色(颜色值通常可以用十六进制(如#000000)或者颜色名称(如red)来表示) 属性:background-color 例: body { background-col ...

  10. 【SpringCloud原理】Ribbon核心组件以及运行原理万字源码剖析

    大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码.本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果 ...