Freeswitch使用media_bug能力实现回铃音检测
利用freeswitch的media bug能力来在智能外呼时通过websocket对接智能中心的声音检测接口,来实现回铃音检测,来判断用户当前是否已响应,拒接,关机等。
1.回铃音处理流程
2.模块源码目录结构
首先新建一个freeswitch的源码的src/application目录下新建一个子目录mod_ringback_check,目录结构如下:
mod_ringback_check:
conf/autoload_configs/ringback_check.conf.xml
mod_ringback_check.h
mod_ringback_check.cpp --主要的media_bug代码
light_websocket_client.cpp --用于websocket链接
light_websocket_client.hpp
Makefile --c++编译文件
test_ringback_press.sh -->压测脚本
3.源码解析
3.1配置文件(ringback_check.conf.xml)
首先将配置文件放置在模块的conf/autoload_configs目录下,这样安装时,会将该文件复制到freesswitch的conf/autoload_configs目录下。
<configuration name="ringback_check.conf" description="mod_ringback_check configuration">
<settings>
<param name="ai_center_url" value="wss://xxx.xxx.xxx:8080/xxxx"/>
</settings>
</configuration>
通过xml配置文件的方式,配置智能中心对应的websocket地址,加载ringback_check模块时将ai_center_url读取到对应的全局静态变量中。
3.2 头文件(ringback_check.h)
typedef struct {
CWebsocket* cli; //websocket对象
switch_core_session_t *session; //freeswitch session对象
vector<uint8_t> audio_data; //发送给智能中心的语音流数据
int data_len; //数据流长度
} ringback_check_info_t;
static struct {
char *ai_center_url; //智能中心websocket地址
} global;
定义全局struct对象
3.3回铃音media_bug处理程序(mod_ringback_check.cpp)
3.3.1 引入的头文件
#include <switch.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
#include "ringback_check.h"
#include "light_websocket_client.hpp"
using namespace ringbackcheckws;
#define RINGBACK_PRIVATE "mod_ringback_check_bug"
3.3.2读取xml文件的结构
static switch_xml_config_item_t instructions[] = {
/* parameter name type reloadable pointer default value opt