freeswitch实战七(话单)

使用modformatcdr模块传递json/xml进行HTTP服务接受话单

一、安装配置modformatcdr

1. 源码目录下打开vim modules.conf取消event_handlers/mod_format_cdr这一行的注释 ,如果没有,添加一行
2.源码目录下安装mod_format_cdr模块 
    make mod_format_cdr-install
3. 然后进入modules.conf.xml取消掉mod_format_cdr的注释即可自动加载
4. 加载模块load mod_format_cdr
5. 注意 安装好后建议从启freeswitch服务器,因为我使用load mod_format_cdr发现无用

二、配置接收地址和传输数据格式

1. 必须至少定义一个配置文件,配置接收地址,数据格式等:
vim autoload_configs/format_cdr.conf.xml 
<configuration name="format_cdr.conf" description="Multi Format CDR CURL logger">
    <profiles>
    <profile name="default">
        <settings>
            <param name="format" value="json"/>
            <param name="url" value="http://192.168.0.103:80/callCenter/cdr.php"/>
            <param name="encode" value="true"/>
            <param name="encode-values" value="false"/>
            <param name="log-dir" value="/media/sf_share/log/cdr"/>
            <param name="err-log-dir" value="/media/sf_share/log/cdr/error"/>
        </settings>
    </profile>
    </profiles>
</configuration>
format参数以指示该特定配置文件的所需输出格式(JSON/XML)
url:发送的http的地址话单处理文件
encode:url是否要base64编码
log-dir日志本地保存目录
err-log-dir如果使用url提交CDR失败,则模块将使用每个err-log-dir回退到文件模式,保证话单不会丢失

三、cdr.php配置

1. 引入文件操作工具文件
require_once "include/common.php";
2. 获取fs传递得话单数据并格式化,有反斜杠
 $data = trim($_POST["cdr"]);
 $obj = json_decode(qsFun::stripslashes($data));
3. 逻辑处理,整理数据插入数据库
    1.判断呼叫号码是否是分机号,判断接听号码是否是分机号
    呼叫号码是,接听号码不是,呼出
    呼叫号码是,接听号码是,内呼
    呼叫号码不是,接听号码不是,呼入
    呼叫号码不是,接听号码是,呼入
    2.根据call_uuid判断是否是一个通话,然后合为一个
    3.根据billsec是否大于0判断是否通话成功

4. 获取call_uuid查询数据库是否存在,存在更新,不存在插入,全部代码

require_once "include/common.php";

$data = trim($_POST["cdr"]);
$obj = json_decode(qsFun::stripslashes($data));

if (!empty($obj)) {
$isInsert = false;//判断是否是分机之间呼叫,不做记录
$sofia_profile_name = "I";//呼入为“I”呼出为“O”
$host='';//呼叫的地址
$rdnis='';//落地号
$call_uuid = $obj->variables->call_uuid; //统一的呼叫id
$lock = new QsLock($call_uuid); //添加锁工具,防止查询时候的同时查询,还没有查询就插入了
$i = 0;
//添加数据查询锁
while(1){
    if(!$lock->lock()){
        usleep(1000);
        if($i++ <100) continue;
    }
    break;
}

var_dump($call_uuid);
$cdrs = $sqs_db->fetch_array($sqs_db->query("select * from fs_cdr WHERE call_id ='".$call_uuid."'"));

$billsec = $obj->variables->billsec;    //计费的通话时长
$calltime = $obj->variables->start_stamp;   //通话的开始时间
$duration = $obj->variables->duration;  //通话的总时长

$caller_id_number = $obj->callflow[0]->caller_profile->caller_id_number;    //呼出号码
$destination_number = $obj->callflow[0]->caller_profile->destination_number;    //接听号码

$ringtime = $duration - $billsec;   //响铃时长
$rdnis = $obj->callflow[0]->caller_profile->rdnis;  //落地号
$originatee = $obj->callflow[0]->caller_profile->originatee;    //
$originator = $obj->callflow[0]->caller_profile->originator;

var_dump($originator);
//查询呼叫号码和接听号码是否是分机号
$query1 = $sqs_db->fetch_array($sqs_db->query("select * from fs_user WHERE username=$caller_id_number"));
$query2 = $sqs_db->fetch_array($sqs_db->query("select * from fs_user WHERE username=$destination_number"));
/*
       呼叫号码是,接听号码是,内呼
       呼叫号码是,接听号码不是,呼出
       呼叫号码不是,接听号码不是,呼入
       呼叫号码不是,接听号码是,呼入*/
var_dump($query1);
if (!empty($query2) && !empty($query1)) {
    $isInsert = false;
} else if (empty($query2) && !empty($query1)) {
    $isInsert = true;
    $sofia_profile_name = "O";
} else if (empty($query2) && empty($query1)) {
    $isInsert = true;
    $sofia_profile_name = "I";
} else if (!empty($query2) && empty($query1)) {
    $isInsert = true;
    $sofia_profile_name = "I";
}

var_dump($sofia_profile_name);
//呼入取originatee,呼出取originator,取不同的host地址
if ($sofia_profile_name == "I" && !empty($originatee)) {
$host = $obj->callflow[0]->caller_profile->network_addr;
}else if ($sofia_profile_name == "O" && !empty($originator)){
    $host = $obj->callflow[0]->caller_profile->network_addr;
}

var_dump($host);
if ($isInsert) {//判断是否是内部呼叫
    var_dump($isInsert);
    if ($cdrs){ //判断数据是否是重复的合为一条
        if (empty($host)){//判断host是否存在,如果没有就不更改
            $sqs_db->query("update fs_cdr set rdnis='$rdnis'");
        }else{
            $sqs_db->query("update fs_cdr set host='$host',rdnis='$rdnis'");
        }
    }else {
        $sqs_db->query("insert into fs_cdr(callname,destination_number,outlong,callstatus,calltime,ringtime,rdnis,host,call_id,out_group,call_group,contact)values('$caller_id_number','$destination_number','$billsec','$sofia_profile_name','$calltime','$ringtime','$rdnis','$host','$call_uuid','','','$data')");
    }
}
$lock->unlock();//关锁
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 《FreeSWITCH: VOIP实战》是一本非常好的技术书籍,它详细介绍了如何使用FreeSWITCH构建高可用性、高性能的VoIP解决方案。该书的作者是Anthony Minessale、Darren Schreiber和Michael S. Collins。 本书的目的是教读者学会使用FreeSWITCH构建功能丰富、灵活可扩展的电话系统。该书从基础概念开始,包括了FreeSWITCH的架构、模块、配置和调优等方面的内容。接着,书中介绍了如何使用FreeSWITCH来实现常见的电话功能,例如IVR、语音信箱、音频会议、呼叫中心、呼叫转移和呼叫路由等。 此外,本书还涵盖了FreeSWITCH的高级功能,例如多租户支持、安全性、彩铃、录音和统计数据收集等。书中还提供了大量的示例代码和配置文件,读者可以参考并直接应用到实际项目中。 总的来说,《FreeSWITCH: VOIP实战》是一本非常有用的技术书籍,它涵盖了FreeSWITCH的方方面面,非常适合VOIP开发人员、系统管理员和网络工程师阅读。在阅读完本书后,读者将能够熟练地使用FreeSWITCH构建高性能、高可用性的VOIP系统,从而为企业提供更好的通讯服务。 ### 回答2: 《FreeSWITCH: VoIP实战》PDF是一本介绍FreeSWITCH开源软件的VoIP技术书籍。它由Anthony Minessale、Darren Schreiber和Michael S. Collins所著。本书的读者目标是想要深入了解FreeSWITCH工作原理和使用方法的VoIP从业人员。 本书首先介绍了VoIP的基础知识和一些常用的协议和标准。接着,书中详细讲解了FreeSWITCH架构和组件,如何安装、配置和管理FreeSWITCH,以及如何使用FreeSWITCH实现呼叫控制、音频处理、录音等功能。此外,该书还介绍了FreeSWITCH的高级应用,如群组呼叫、多方会议、IVR等。 《FreeSWITCH: VoIP实战》PDF的亮点在于其深入浅出的讲解方式和丰富的案例分析。书中许多实例都是作者亲身经历的,能够帮助读者更好地理解FreeSWITCH的工作原理和解决实际问题的方法。此外,该书还在最后一章中介绍了一些FreeSWITCH的扩展和集成,如何与Asterisk、Kamailio等软交换平台交互,以及如何使用WebRTC实现浏览器间的实时音频通话等。 总之,如果您是一名VoIP从业人员,希望深入了解FreeSWITCH技术并应用于实际项目中,那么《FreeSWITCH: VoIP实战》PDF无疑是一本值得阅读的书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值