【FreeSwitch开发实践】自定义模块创建与使用

🏠 博客主页:小小马车夫的主页
🍅 所属专栏:FreeSwitch开发实践
🥝 专栏介绍:主要介绍博主在实际项目中使用FreeSwitch开发外呼类项目的一些经验心得,主要涉及FreeSwitch的基本安装编译、基本配置、ESL、WSS、录音、自定义模块、media bug、语音播放、MRCP及对接AI机器人等内容。内容在持续更新中,如果感兴趣可以对专栏进行订阅~

🎈🎈想对未来的自己说的话🎈🎈
🥑 🥑 间歇性的努力和蒙混过日子,都是对之前努力的清零🥑 🥑

请添加图片描述


前言

FreeSwitch的架构中,存在为数重多的模块或接口,在FreeSwitch中称为appapi,如果常用的接听模块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.\n");
    
    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\n");
	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\n");
    
	return;
}

一、自定义模块的加载和卸载

通过上述自定义模块的代码示例,可以看到自定义模块最少要实现3个标准接口:

  1. 模块加载
    SWITCH_MODULE_LOAD_FUNCTION(mod_myapp_load)
  2. 模块卸载
    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_intapp接口句柄
int_name`app名称
short_descriptapp短描述
long_descriptapp长描述
funcptrapp回调函数
syntax_stringapp格式字符串
app_flagsapp标志

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\n");
    
	return;
}

和上面一样先看下宏定义:

#define SWITCH_STANDARD_APP(name) static void name (switch_core_session_t *session, const char *data)

参数说明:

app_intapp接口句柄
session会话session
dataapp参数,每个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自定义模块的创建和使用。如果觉得有些帮助或觉得文章还不错,请关注一下博主,你的关注是我持续写作的动力。另外,如果有什么问题,可以在评论区留言,或者私信博主,博主看到后会第一时间回复。

  • 75
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 138
    评论
评论 138
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一马途追

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值