使用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();//关锁
}