概述

freeswitch是一款简单好用的VOIP开源软交换平台。

在语音呼叫的过程中,话单是重要的计价和结算依据,话单的产生需要稳定可靠,可回溯。

fs中基本的话单模块mod_cdr_csv,可以满足大部分话单要求。

环境

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

freeswitch:v1.10.7

GCC:4.8.5

模块介绍

mod_cdr_csv模块默认编译安装,并有加载。

检查conf/autoload_configs/modules.conf.xml文件。

<load module="mod_cdr_csv"/>

cdr_csv模块会在通话结束后写入话单记录到文本文件,话单的格式根据配置的模板确定。

检查conf/autoload_configs/cdr_csv.conf.xml文件,默认配置如下。

<configuration name="cdr_csv.conf" description="CDR CSV Format">

<settings>

<!-- 'cdr-csv' will always be appended to log-base -->

<!--<param name="log-base" value="/var/log"/>-->

<param name="default-template" value="example"/>

<!-- This is like the info app but after the call is hung up -->

<!--<param name="debug" value="true"/>-->

<param name="rotate-on-hup" value="true"/>

<!-- may be a b or ab -->

<param name="legs" value="a"/>

<!-- Only log in Master.csv -->

<!-- <param name="master-file-only" value="true"/> -->

</settings>

<templates>

<template name="sql">INSERT INTO cdr VALUES ("${caller_id_name}","${caller_id_number}","${destination_number}","${context}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${uuid}","${bleg_uuid}", "${accountcode}");</template>

<template name="example">"${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>

<template name="linksys">"${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}","${sip_p_rtp_stat}"</template>

<template name="asterisk">"${accountcode}","${caller_id_number}","${destination_number}","${context}","${caller_id}","${channel_name}","${bridge_channel}","${last_app}","${last_arg}","${start_stamp}","${answer_stamp}","${end_stamp}","${duration}","${billsec}","${hangup_cause}","${amaflags}","${uuid}","${userfield}"</template>

<template name="opencdrrate">"${uuid}","${signal_bond}","${direction}","${ani}","${destination_number}","${answer_stamp}","${end_stamp}","${billsec}","${accountcode}","${userfield}","${network_addr}","${regex('${original_caller_id_name}'|^.)}","${sip_gateway_name}"</template>

</templates>

</configuration>

默认配置中,fs使用“example”模板写话单文件“log/cdr_csv/Master.csv”。

其中几个比较有用的配置项解释如下。

<param name="debug" value="true"/>

debug参数在调试时比较有用,作用是通话结束后通过“info“命令打印出AB路的全部通道变量,这样就可以更容易知道在话单模板中应该如何设置自己需要的字段。

2023-07-05 10:48:13.704735 [INFO] mod_cdr_csv.c:219 CHANNEL_DATA:

Channel-State: [CS_REPORTING]

Channel-Call-State: [HANGUP]

Channel-State-Number: [11]

Channel-Name: [sofia/external4080/13712345678@10.55.55.138:5090]

Unique-ID: [5d7f96d0-1ade-11ee-a6e6-ef73ce267dbc]

Call-Direction: [outbound]

2023-07-05 10:48:13.724676 [INFO] mod_cdr_csv.c:219 CHANNEL_DATA:

Channel-State: [CS_REPORTING]

Channel-Call-State: [HANGUP]

Channel-State-Number: [11]

Channel-Name: [sofia/external/10011@10.55.55.138]

Unique-ID: [5d7e804c-1ade-11ee-a6dd-ef73ce267dbc]

Call-Direction: [inbound]

<param name="legs" value="ab"/>

话单记录可以选择写入“a“、”b“和”ab“,分别表示A路话单,B路话单,AB路双话单。

"10011","10011","13712345678","out_to_in_public","2023-07-05 10:48:04","2023-07-05 10:48:09","2023-07-05 10:48:13","9","4","NORMAL_CLEARING","5d7f96d0-1ade-11ee-a6e6-ef73ce267dbc","","","","","outbound","16","recv_bye","sip:200","10.55.55.138",""

"10011","10011","13712345678","out_to_in_public","2023-07-05 10:48:04","2023-07-05 10:48:09","2023-07-05 10:48:13","9","4","NORMAL_CLEARING","5d7e804c-1ade-11ee-a6dd-ef73ce267dbc","5d7f96d0-1ade-11ee-a6e6-ef73ce267dbc","","","","inbound","16","send_bye","","10.55.55.138",""

<param name="master-file-only" value="true"/>

当我们需要根据“accountcode”来区分客户的话单模板格式时,fs默认会根据模板名称产生多个csv文件,该参数设置话单记录只写入Master.csv文件。

自定义话单模板

修改conf/autoload_configs/cdr_csv.conf.xml文件,配置如下。

<template name="example">"${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}","${direction}","${hangup_cause_q850}","${sip_hangup_disposition}","${proto_specific_hangup_cause}","${network_addr}","${rtp_audio_in_mos}"</template>

模板中的字段如果不能满足实际需求,可以通过debug模式查看AB路所有的通道变量。

多模板场景的话单

某些情况下,我们需要对不同的场景输出不同的话单格式。

fs提供通道变量“accountcode”来区分模板场景。

修改dialplan拨号计划如下。

<action application="export" data="accountcode=asterisk" />

在log/cdr_csv目录下产生两个文件“Master.csv”和”asterisk.csv”。

cat asterisk.csv

"asterisk","10011","13712345678","out_to_in_public",""10011" <10011>","sofia/external4080/13712345678@10.55.55.138:5090","","","","2023-07-05 15:30:34","2023-07-05 15:30:38","2023-07-05 15:30:55","21","17","NORMAL_CLEARING","","d44d3fe8-1b05-11ee-a6a1-875ed88826f8",""

"asterisk","10011","13712345678","out_to_in_public",""10011" <10011>","sofia/external/10011@10.55.55.138","","bridge","{sip_h_Route=<sip:10.55.55.138:5090;lr>,sip_invite_call_id=abaa3d90-95a8-123c-7ebf-b6fcd7842446,sip_invite_domain=test01.9999.com,sip_cid_type=pid}{}sofia/external4080/sip:13712345678@10.55.55.138:5090","2023-07-05 15:30:34","2023-07-05 15:30:38","2023-07-05 15:30:55","21","17","NORMAL_CLEARING","","d44c4570-1b05-11ee-a697-875ed88826f8",""

cat Master.csv

"10011","10011","13712345678","out_to_in_public","2023-07-05 15:30:34","2023-07-05 15:30:38","2023-07-05 15:30:55","21","17","NORMAL_CLEARING","d44d3fe8-1b05-11ee-a6a1-875ed88826f8","","asterisk","","","outbound","16","recv_bye","sip:200","10.55.55.138",""

"10011","10011","13712345678","out_to_in_public","2023-07-05 15:30:34","2023-07-05 15:30:38","2023-07-05 15:30:55","21","17","NORMAL_CLEARING","d44c4570-1b05-11ee-a697-875ed88826f8","d44d3fe8-1b05-11ee-a6a1-875ed88826f8","asterisk","","","inbound","16","send_bye","","10.55.55.138",""

话单文件分割

mod_cdr_csv模块提供了一个api命令“cdr_csv rotate“,可以根据实际需要来分割话单文件。

freeswitch@pxy137> cdr_csv rotate

+OK

2023-07-05 14:55:21.524681 [NOTICE] mod_cdr_csv.c:127 Rotated CDR logfile ../log/cdr-csv/Master.csv

-rw-r--r--. 1 root root    0 Jul  5 14:55 Master.csv

-rw-r--r--. 1 root root 5914 Jul  5 10:48 Master.csv.2023-07-05-14-55-21

总结

freeswitch的基本话单模块mod_cdr_csv,输出稳定高效,配置灵活,字段选择多。

空空如常

求真得真

freeswitch的mod_cdr_csv模块的更多相关文章

  1. freeswitch的话单模块

    概述 最近因为业务需要,在看freeswitch中话单相关的一些模块. 在voip的使用过程中,话单是重要的基础模块,涉及到计费和问题查找. 呼叫话单最重要的一点是稳定,不能有错误或遗漏. 本章对fs ...

  2. FreeSWITCH 加载模块过程解读

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

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

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

  4. freeswitch的mod_curl模块

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

  5. freeswitch使用mod_shout模块播放mp3

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

  6. freeswitch编译mod_av模块

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

  7. 《FreeSWITCH: VoIP实战》:SIP 模块 - mod_sofia

    SIP 模块是 FreeSWITCH 的主要模块,所以,值得拿出专门一章来讲解. 在前几章时里,你肯定见过几次 sofia 这个词,只是或许还不知道是什么意思.是这样的,Sofia-SIP 是由诺基亚 ...

  8. freeswitch新增模块API

    概述 上一章我们讲解了freeswitch的源码基本结构,以及如何新增一个插件式模块. freeswitch的架构非常适合这种业务开发模式,即以freeswitch的基本功能为开发平台,新增插件式模块 ...

  9. Freeswitch 添加可转码的G729编码

    默认情况下Freeswitch自带的G729模块是pass-through-并不支持转码. 不过我们依然有个好奇的心, 所以我们决定添加一个支持G729转码的模块到Freeswitch. 1. 下载m ...

  10. Freeswitch配置之sofia

    SIP模块 - mod_sofia SIP 模块是 FreeSWITCH的主要模块. 在 FreeSWITCH中,实现一些互联协议接口的模块称为 Endpoint.FreeSWITH支持很多的 End ...

随机推荐

  1. 【SSM项目】尚筹网(五)项目改写:使用前后端分离的SpringSecurityJWT认证

    在项目中加入SpringSecurity 1 加入依赖 <!-- SpringSecurity --> <dependency> <groupId>org.spri ...

  2. Matlab蚁群算法求解旅行商问题

    目录 问题展现 解决代码 代码1 输出结果 代码2 输出结果 代码3 输出结果 问题展现 假设有一个旅行商人要拜访全国 31 个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且 ...

  3. boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续)

    boot-admin整合flowable官方editor-app源码进行BPMN2-0建模(续) 书接上回 项目源码仓库github 项目源码仓库gitee boot-admin 是一款采用前后端分离 ...

  4. Python LOG-日志

    LOG https://www.cnblogs.com/yyds/p/6901864.html logging logging模块提供模块级别的函数记录日志 包括四大组件 1. 日志相关概念 日志 日 ...

  5. 数据结构(DataStructure)-03

    数据结构-03 **数据结构-03笔记** **递归** **二叉树** **广度遍历 - 二叉树** **深度遍历 - 二叉树** **二叉树练习一** **二叉树练习二** **二叉排序树练习一* ...

  6. #PowerBi 1分钟学会,powerbi中行列值拼接(COMBINEVALUES与CONCATENATEX)

    在日常的工作中,我们往往需要对表格数据的拼接,用来生成一些复合数据列,如下图类似场景. 其实,在powerbi中,我们同样也可以对表格文本进行拼接.今天我们就介绍两个DAX函数,COMBINEVALU ...

  7. Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting、Self-Consistency等;项目实战搭建知识库内容机器人

    Prompt learning 教学[进阶篇]:简介Prompt框架并给出自然语言处理技术:Few-Shot Prompting.Self-Consistency等:项目实战搭建知识库内容机器人 1. ...

  8. 2020-10-31:java中LinkedTransferQueue和SynchronousQueue有什么区别?

    福哥答案2020-11-01:SynchronousQueue:线程A使用put将数据添加到队列,如果没有其他线程使用take去获取数据,那么线程A阻塞,直到数据被其他线程获取,同理 如果线程B从队列 ...

  9. 2022-06-02:一开始在0位置,每一次都可以向左或者向右跳, 第i次能向左或者向右跳严格的i步。 请问从0到x位置,至少跳几次可以到达。 来自字节。 力扣754. 到达终点数字。

    2022-06-02:一开始在0位置,每一次都可以向左或者向右跳, 第i次能向左或者向右跳严格的i步. 请问从0到x位置,至少跳几次可以到达. 来自字节. 力扣754. 到达终点数字. 答案2022- ...

  10. Jenkins - 页面汉化

    Jenkins - 页面汉化 前言 对于不懂英文的人来讲,尤其是第一次使用Jenkins环境,看全英文的Jenkins页面是十分困难的: Jenkins对于不懂英文的用户有做汉化的插件包,但是汉化的不 ...