freeswitch通话记录mysql_freeswitch电话计费详单入库方法

更新时间:2023-05-18 07:00:59 阅读: 评论:0

freeswitch通话记录mysql_freeswitch电话计费详单⼊库⽅法freeswitch⽀持电话拨⼊,可以接⼊远端IPPBX实现和现⽹电话的互通。
有时候我们需要统计记录所有的电话详单,并输出到指定的数据库⽤于数据统计。
包括呼叫⽅,被叫⽅,呼叫时间,接听时间,挂断时间,通话时长,会话等等信息。
于是,这部分可以⾃⼰写⼀个freeswitch插件来完成上述功能。
英语 在线翻译
⾃⼰动⼿即可。
诀窍很简单,只要知道⼏个关键API即可。
⾸先创建⼀个插件。
SWITCH_MODULE_LOAD_FUNCTION(mod_cdr_mysql_load)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
load_config(pool);
if ((status = switch_dir_make_recursive(globals.log_dir, SWITCH_DEFAULT_DIR_PERMS, pool)) !=
SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error creating %s\n", globals.log_dir);
}
switch_core_add_state_handler(&state_handlers);
aoxing*module_interface = switch_loadable_module_create_module_interface(pool, modname);
return status;
}
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_cdr_mysql_shutdown)
{
globals.shutdown = 1;
switch_mutex_lock(globals.db_mutex);
if(globals.db_connection) {
mysql_clo(globals.db_connection);
}
switch_mutex_unlock(globals.db_mutex);
switch_mutex_destroy(globals.db_mutex);
switch_core_remove_state_handler(&state_handlers);
return SWITCH_STATUS_SUCCESS;
}
这⾥基本都是固定的写法。
这⾥有⼀个要注意⾃⼰实现的函数,就是load_config(pool);
在这个函数中,你可以实现对XML配置⽂件的读取,⽐如,对mysql的连接信息相关读取。
此后,实现⼀个函数来处理电话结束后的详单⽣成。
这⾥有⼀个核⼼函数
switch_core_add_state_handler(&state_handlers);
这⾥是告诉freesweitch,我要关⼼你的那些状态。并回调绑定对应的函数。
state_handlers包括了如下状态(各个freeswitch版本不同可能有些差异)
上农static switch_state_handler_table_t state_handlers = {
/*.on_init */ NULL,
/*.on_routing */ NULL,
diet coke/*.on_execute */ NULL,
/*.on_hangup */ NULL,
/
*.on_exchange_media */ NULL,
/*.on_soft_execute */ NULL,
/*.on_consume_media */ NULL,
/*.on_hibernate */ NULL,
/*.on_ret */ NULL,
/*.on_park */ NULL,
/*.on_reporting */ on_reporting
};
上述代码,我只关⼼on_reporting 状态。
剩下的状态,请⾃⾏⾕歌。
下⼀步,我们要绑定事件产⽣后的处理函数了。怎么做呢?看见上⾯的on_reporting没,这就是你的函数指针的名字。于是就直接写下如下代码即可。
static switch_status_t on_reporting(switch_core_ssion_t *ssion)
{
switch_channel_t *channel = switch_core_ssion_get_channel(ssion);
switch_status_t status = SWITCH_STATUS_SUCCESS;
const char *template_str = NULL;
char *expanded_vars = NULL, *sql = NULL;
建筑业统一发票char *answer_vars = NULL;
char *ur_vars = NULL;
原理图英文if (globals.shutdown) {
return SWITCH_STATUS_SUCCESS;
}
{
const char * channel_name = NULL;
const char * filter = "loopback/";
if ((channel_name = switch_channel_get_variable(channel, "channel_name"))) { if(!strncacmp(channel_name,filter, sizeof(filter))){
return SWITCH_STATUS_SUCCESS;
}
}
}
if(check_cdr_direction(ssion) != SWITCH_STATUS_SUCCESS ){
if (!((globals.legs & CDR_LEG_A) && (globals.legs & CDR_LEG_B))) {
if ((globals.legs & CDR_LEG_A)) {idiosyncratic
if (switch_channel_get_originator_caller_profile(channel)) {
return SWITCH_STATUS_SUCCESS;
}
} el {
if (switch_channel_get_originatee_caller_profile(channel)) {
return SWITCH_STATUS_SUCCESS;
}评论英文
}
}
}
if (!((globals.legs & CDR_LEG_A) && (globals.legs & CDR_LEG_B))) {
if ((globals.legs & CDR_LEG_A)) {
if (switch_channel_get_originator_caller_profile(channel)) {
return SWITCH_STATUS_SUCCESS;
}
} el {
if (switch_channel_get_originatee_caller_profile(channel)) {
return SWITCH_STATUS_SUCCESS;
}
}
}
if (globals.debug) {
switch_event_t *event;
if (switch_event_create_plain(&event, SWITCH_EVENT_CHANNEL_DATA) == SWITCH_STATUS_SUCCESS) {
char *buf;
switch_channel_event_t_data(channel, event);
switch_event_rialize(event, &buf, SWITCH_FALSE);
switch_asrt(buf);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "CHANNEL_DATA:\n%s\n", buf);
switch_event_destroy(&event);
switch_safe_free(buf);
}
}
template_str = (const char *) switch_core_hash_plate_hash, globals.default_template);
if (!template_str) {
template_str = default_template;
}
//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[my_on_reporting]template_str=%s.\n", template_str);expanded_vars = switch_channel_expand_variables(channel, template_str);
初中英语作文大全}
这⾥的⼤部分代码是固定的,直接照抄就可以。
这⾥强调两个API是你必须要会⽤的。
(1) switch_core_hash_find
这个函数是,根据你的配置模板,加载指定的配置项⽬。
简单来说,freeswitch⽀持什么参数呢?
例如:
const char *default_template =
环亚琅文
"\"${caller_id_name}\",\"${caller_id_number}\",\"${destination_number}\",\"${context}\","
"\"${start_stamp}\",\"${answer_stamp}\",\"${end_stamp}\",${duration},${billc},"
"\"${hangup_cau}\",\"${uuid}\",\"${accountcode}\"";
这些参数名都是固定的。你可以从话单中获得这些参数的值。
你可以任意缩减或者增加这些参数名,已达到话单要求的⽬的。
(2)switch_channel_expand_variables
根据参数名找到对应的数值。
返回值是⼀个静态的const char* 这个对应你上⾯给出的参数名。
剩下的就是拼装sql⼊库的代码了,这部分,就不许赘述了。

本文发布于:2023-05-18 07:00:59,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/112946.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:电话   时间   参数   函数   对应   实现   配置   状态
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图