当前位置:网站首页>【FreeSwitch开发实践】自定义模块创建与使用
【FreeSwitch开发实践】自定义模块创建与使用
2022-07-29 13:30:00 【web18224617243】
?? 博客主页:的主页
?? 所属专栏:FreeSwitch开发实践
?? 专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内容。内容在持续更新中,如果感兴趣可以对专栏进行订阅~???想对未来的自己说的话???
?? ?? 间歇性的努力和蒙混过日子,都是对之前努力的清零?? ??
文章目录
前言
在FreeSwitch
的架构中,存在为数重多的模块或接口,在FreeSwitch中称为app
和api
,如果常用的接听模块answer
、挂断模块hangup
、睡眠模块sleep
、回音模块echo
等,数量非常之多,这些app和api共同组成了FreeSwitch的核心。然而,FreeSwitch还提供了自定义模块的功能,开发者可以按照标准接口自己实现一个app,然后在通话中使用,极大地拓展FreeSwitch的能力,也方便在实际业务中实现特定的功能。
> 在介绍`FreeSwitch`自定义模块之前,先看一个完整的`自定义模块`示例,然后针对代码示例对自定义模块进行介绍:
#include <switch.h>
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_myapp_shutdown);
SWITCH_MODULE_LOAD_FUNCTION(mod_myapp_load);
//模块定义,分别是模块加载、模块卸载
SWITCH_MODULE_DEFINITION(mod_myapp, mod_myapp_load, mod_myapp_shutdown, NULL);
SWITCH_STANDARD_APP(myapp_function);
//模块加载
SWITCH_MODULE_LOAD_FUNCTION(mod_myapp_load)
{
switch_application_interface_t *app_interface;
*module_interface = switch_loadable_module_create_module_interface(pool, modname);
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "myapp mod loaded.
");
SWITCH_ADD_APP(app_interface, "myapp", "myapp", "myapp", myapp_function, "", SAF_NONE);
return SWITCH_STATUS_SUCCESS;
}
//模块卸载
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_myapp_shutdown)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "myapp shutdown
");
return SWITCH_STATUS_SUCCESS;
}
//myapp 执行函数
SWITCH_STANDARD_APP(myapp_function)
{
switch_status_t status;
if (session == NULL)
return;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "myapp function start
");
return;
}
一、自定义模块的加载和卸载
通过上述自定义模块的代码示例,可以看到自定义模块最少要实现3个标准接口:
- 模块加载
SWITCH_MODULE_LOAD_FUNCTION(mod_myapp_load)
- 模块卸载
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_myapp_shutdown)
其中宏定义如下:
所以模块加载和卸载的完整定义如下:
模块加载
switch_status_t mod_myapp_load(switch_loadable_module_interface_t **module_interface, switch_memory_pool_t *pool)
模块卸载
switch_status_t mod_myapp_unload(void)
二、自定义模块"app"的创建
这里是关键,真正的可使用的app是这个接口实现的:
switch_application_interface_t *app_interface;
SWITCH_ADD_APP(app_interface, "myapp", "myapp", "myapp", myapp_function, "", SAF_NONE);
和模块的创建和卸载一样,app接口也是一个宏定义:
参数说明:
app_int
app接口句柄
int_name`
app名称
short_descript
app短描述
long_descript
app长描述
funcptr
app回调函数
syntax_string
app格式字符串
app_flags
app标志
app回调函数
SWITCH_STANDARD_APP(myapp_function)
{
switch_status_t status;
if (session == NULL)
return;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "myapp function start
");
return;
}
和上面一样先看下宏定义:
#define SWITCH_STANDARD_APP(name) static void name (switch_core_session_t *session, const char *data)
参数说明:
session
会话session
data
app参数,每个app都可以传递参数
app回调函数可以实现业务特定功能,如:
- 启动业务线程
- 添加media bug,获取通话语音流
- 实现业务循环,比如启动ASR/TSS
三、在拨号计划中加入自定义模块app
将如下代码加入到 FreeSwitch目录conf/dialplan/default.xml
<extension name="myapp-diaplan">
<condition field="destination_number" expression="^123$">
<action application="answer"/>
<action application="myapp"/>
<action application="echo" data=""/>
<action application="hangup" data=""/>
</condition>
</extension>
说明:
destination_number
拨号计划表达式字符串,即拨打“123”号码,就可以进行condition拨号配置answer
接听
-myapp
这就是前面我们创建的自定义模块里面的app
-echo
回音app,由于myapp不是阻塞函数,所以要用echo程序以阻塞通话,达到通话不中断目的
-hangup
挂断
四、通话测试
启动FreeSwitch,使用Yate注册1000号码,先看下自定义模块myapp
加载输出:
拨号命令:
originate user/1000 123
123
是前面拨号计划配置表达字符串
输出:
最后
以上就是今天的内容,详细介绍了FreeSwitch自定义模块的创建和使用。如果觉得有些帮助或觉得文章还不错,请关注一下博主,你的关注是我持续写作的动力。另外,如果有什么问题,可以在评论区留言,或者私信博主,博主看到后会第一时间回复。
边栏推荐
猜你喜欢
【pytorch】1.6 tensor 基本运算
MySQL基础篇(三)-- 数据类型
从零开发一款相机APP, Day03: Camera 常用api和最新框架介绍
BOM系列之Location对象
TAP 文章系列-10 | 从应用感知能力谈 TAP 的约定服务
The new technical director, who is in the form of a isXxx Boolean type definition, tomorrow need not come!
电子游戏的核心原理
MLX90640 红外热成像仪测温传感器模块开发笔记(九)
推荐几款2022年好用的设备管理系统(软件)
中国电信首发全新加密通话产品!有效防止网络监听
随机推荐
[Numpy] 创建数组
【MySQL】ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘
每日优鲜解散疑云:生鲜电商们苦渡生死劫
1124. 骑马修栅栏
深度解析C语言文件操作以及常见问题
The most classic special effects scenes in 25 years
gdb调试常用概念整理
IJCAI 2022 outstanding papers published, China won two draft in 298 the first author
IJCAI 2022杰出论文公布,大陆作者中稿298篇拿下两项第一
蚂蚁三面滑铁卢!遭分布式截胡,靠这些笔记潜修30天,挺进京东
开关电源-LLC基本原理
human pose estimation-DEKR2021CVPR
用TypeScript类型系统编程实现斐波那契数列
线程池面试汇总
[Numpy] np.select
3555. 二叉树
HCIP第十三天笔记(BGP的路由过滤、BGP的社团属性、MPLS)
Leetcode66. 加一
【C#】WCF和TCP消息通信练习,实现聊天功能
【个人收藏】一些比较有用的链接