Freeswitch-mod开发

文章目录

  • 一、Freeswitch-mod开发
    • 1.1 介绍
    • 1.2 实战
      • 1.2.1 新建一个mymod.c或者mymod.cpp
      • 1.2.2 新建一个Makefile
      • 1.2.3 编译
  • 二、Freeswitch-mod-自定义Dialplan模块
    • 2.1 介绍
    • 2.2 实战
      • 2.2.1 改造mymod.c(代码是完整的,自己做区别看一下)
      • 2.2.2 编译
      • 2.2.3 测试
  • 三、Freeswitch-mod-自定义app模块
    • 3.1 介绍
    • 3.2 实战
      • 3.2.1 改造mymod.c(代码是完整的,自己做区别看一下)
      • 3.2.2 编译
      • 3.2.3 测试
  • 四、Freeswitch-mod-自定义api模块
    • 4.1 介绍
    • 4.2 实战
      • 4.2.1 改造mymod.c(代码是完整的,自己做区别看一下)
      • 4.2.2 编译
      • 4.2.3 测试
  • 致敬读者

一、Freeswitch-mod开发

1.1 介绍

在这里插入图片描述
通过上述自定义模块的代码示例,可以看到自定义模块最少要实现2个标准接口:

模块加载

SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load)

模块卸载

SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown)

和一个申明

//模块定义名称,分别是模块加载函数、模块卸载函数
SWITCH_MODULE_DEFINITION(mod_mymod, mod_mymod_load, mod_mymod_shutdown, NULL);

1.2 实战

1.2.1 新建一个mymod.c或者mymod.cpp

#include <switch.h>

SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown);


SWITCH_MODULE_DEFINITION(mymod, mod_mymod_load, mod_mymod_shutdown, NULL);

SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load)
{
    // init module interface
    *module_interface = switch_loadable_module_create_module_interface(pool, modname);


    return SWITCH_STATUS_SUCCESS;
}

SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown) { return SWITCH_STATUS_SUCCESS; }

1.2.2 新建一个Makefile

BASE=/usr/local/src/freeswitch-1.10.5
include $(BASE)/build/modmake.rules

在这里插入图片描述

1.2.3 编译

这里注意一下编译的文件夹和自定义mod的xxx.c名称保持一致

make
make install

在这里插入图片描述
在这里插入图片描述
这就定义好了

二、Freeswitch-mod-自定义Dialplan模块

2.1 介绍

注意红色字体就好了
在这里插入图片描述

2.2 实战

2.2.1 改造mymod.c(代码是完整的,自己做区别看一下)

#include <switch.h>

SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown);


SWITCH_MODULE_DEFINITION(mymod, mod_mymod_load, mod_mymod_shutdown, NULL);



// 定义一个名为 my_dialplan_hunt的标准拨号计划处理函数
SWITCH_STANDARD_DIALPLAN(my_dialplan_hunt) 
{
    switch_caller_extension_t *extension = NULL; // 声明一个呼叫方扩展结构体指针,用于存储呼叫路由信息
    switch_channel_t *channel = switch_core_session_get_channel(session); // 获取当前呼叫的通道信息
    
    if (!caller_profile) { // 如果呼叫者配置信息为空
        caller_profile = switch_channel_get_caller_profile(channel); // 获取呼叫者的配置信息
    }
    
    // 记录日志,显示呼叫处理过程中的相关信息
    switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_INFO,
                      "Processing %s <%s> -> %s in context %s\n",
                      caller_profile->caller_id_name, caller_profile->caller_id_number,
                      caller_profile->destination_number, caller_profile->context);
    
    // 创建一个名为 "my_dialplan" 的呼叫方扩展,并将其添加到当前会话的呼叫方扩展列表中
    extension = switch_caller_extension_new(session, "my_dialplan", "my_dialplan");
    
    if (!extension) // 如果创建呼叫方扩展失败
        abort(); // 终止程序
    
    // 向呼叫方扩展添加一个应用程序,用于在日志中记录信息
    switch_caller_extension_add_application(session, extension, "log", "INFO Hey, I'm in the ,my_dialplan");
    
    return extension; // 返回创建的呼叫方扩展结构体指针
}


SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load)
{
     // 拨号计划接口指针
   switch_dialplan_interface_t *dp_interface;
    // init module interface 初始化接口
    *module_interface = switch_loadable_module_create_module_interface(pool, modname);

    //表示向名为 dp_interface 的拨号计划接口中添加一个名称为 "my_dialplan" 的自定义拨号计划,
    //并指定了处理匹配的函数为 my_dialplan_hunt。
   SWITCH_ADD_DIALPLAN(dp_interface,"my_dialplan",my_dialplan_hunt);

    return SWITCH_STATUS_SUCCESS;
}

SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown) { return SWITCH_STATUS_SUCCESS; }

2.2.2 编译

这里注意一下编译的文件夹和自定义mod的xxx.c名称保持一致

make
make install

在这里插入图片描述

2.2.3 测试


originate user/1002 9999 my_dialplan

在这里插入图片描述
在这里插入图片描述

三、Freeswitch-mod-自定义app模块

3.1 介绍

注意红色字体就好了
在这里插入图片描述

3.2 实战

3.2.1 改造mymod.c(代码是完整的,自己做区别看一下)

#include <switch.h>

SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown);


SWITCH_MODULE_DEFINITION(mymod, mod_mymod_load, mod_mymod_shutdown, NULL);

SWITCH_STANDARD_APP(myapp_function)
{
const char *name;
if (zstr(data)){
  name="No Name";
 }else{
  name =data;
}

 	switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session),SWITCH_LOG_INFO,"I'm a book, My name is %s \n", name); 
 }



SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load)
{
    // app接口指针
   switch_application_interface_t *app_interface;
    // init module interface 初始化接口
    *module_interface = switch_loadable_module_create_module_interface(pool, modname);

    //将该App向核心注册,并增加一个回调函数 book_function:

//app_interface:应用程序接口的名称,用于标识这个应用程序。
//"myapp":应用程序的命令名称,即在 FreeSWITCH 的命令行界面或配置文件中使用的名称,用于调用这个应用程序。
//"myapp example":应用程序的描述,用于在帮助文档或其他地方显示给用户,描述这个应用程序的作用。
//"myapp example":应用程序的语法描述,用于指导用户在命令行中如何正确地使用这个应用程序。
//myapp_function:应用程序的函数指针,指向实际的处理函数,当用户调用这个应用程序时,会执行该函数进行相应的处理。
//"[name]":应用程序的配置参数,这是一个应用程序参数的格式,它是一个字符串,用于指定应用程序所需参数的格式。在这个例子中,这个参数为 "[name]"。
//SAF_SUPPORT_NOMEDIA: 这是应用程序的标志(flag),用于指定应用程序的特性。在这个例子中,这个标志表示该应用程序支持无媒体处理(No-Media Processing)。
//这意味着这个应用程序可以在没有任何媒体(如音频、视频)流的情况下执行其功能。如果是SAF_NONE:应用程序的标志,表示这个应用程序没有特殊的标志,
    SWITCH_ADD_APP(app_interface,"myapp","myapp example","myapp example",myapp_function,"[name]",SAF_SUPPORT_NOMEDIA);

    return SWITCH_STATUS_SUCCESS;
}

SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown) { return SWITCH_STATUS_SUCCESS; }

3.2.2 编译

这里注意一下编译的文件夹和自定义mod的xxx.c名称保持一致

make
make install

在这里插入图片描述

3.2.3 测试

在这里插入图片描述
添加
在这里插入图片描述

F6刷新配置
在这里插入图片描述

在这里插入图片描述

四、Freeswitch-mod-自定义api模块

4.1 介绍

注意红色字体就好了
在这里插入图片描述

4.2 实战

4.2.1 改造mymod.c(代码是完整的,自己做区别看一下)

#include <switch.h>

SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown);


SWITCH_MODULE_DEFINITION(mymod, mod_mymod_load, mod_mymod_shutdown, NULL);
SWITCH_STANDARD_API(my_api_function)
{

const char *name;
 if(zstr(cmd)){
 	name="No Name";
 } else {
	name = cmd;
}

stream->write_function(stream,"I'm a developer, My name is:%s \n",name); 

return SWITCH_STATUS_SUCCESS;
}

SWITCH_MODULE_LOAD_FUNCTION(mod_mymod_load)
{
    // api接口指针
   switch_api_interface_t   *api_interface;
    // init module interface 初始化接口
    *module_interface = switch_loadable_module_create_module_interface(pool, modname);
   //SWITCH_ADD_API: 这是一个宏,用于向 FreeSWITCH 中注册一个新的 API 接口。它的语法通常是 SWITCH_ADD_API(名称, 描述, 函数名称, 参数)
		SWITCH_ADD_API(api_interface,"myapi","myapi example",my_api_function,"[name]");

    return SWITCH_STATUS_SUCCESS;
}

SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_mymod_shutdown) { return SWITCH_STATUS_SUCCESS; }

4.2.2 编译

这里注意一下编译的文件夹和自定义mod的xxx.c名称保持一致

make
make install

在这里插入图片描述

4.2.3 测试

方法一:编写拨号
在这里插入图片描述
在这里插入图片描述
方法二:直接测
在这里插入图片描述

致敬读者

  偶然的机会我接触到FreeSWITCH并进行学习和整理笔记。如有您有需要,请联系我18956043585(微信同号),我们一起学习进步。文章内容如有疑问点,我必定洗耳恭听并虚心接受,请您多多指教。感谢你的时间阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/598963.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小白入门:创建一个SpringBoot项目

前言 我们在创建SpringBoot项目时候&#xff0c;会出现不确定和报错的情况很多&#xff0c;大家可以按照我的做法来简单创建一个SpringBoot项目 1.环境配置 下载安装并配置jdk1.8下载apache mavenidea软件 2.开始创建项目 Server URL&#xff1a;初始是start.spring.io,我…

ComfyUI中的图像稀释处理

用下面的节点对图片进行稀释处理&#xff0c;如下 为0表示不变&#xff0c;我设置大一点&#xff0c;设置为0.5看看&#xff0c;如下 图像就暗淡了一些&#xff0c;但是还是有一些彩色的&#xff0c;相当于把它放在水里浸泡了一样&#xff0c;掉色了&#xff0c;这就是稀释&…

美国访问学者J1签证申请,这些关键事项一定要注意!

美国访问学者准备踏上学术探索之旅&#xff0c;申请J1签证是决定性的一步。以下是美国J1签证申请的一些关键注意事项&#xff0c;帮助你顺利通过签证流程&#xff1a; 1、签证类型&#xff1a;确认J-1签证是适合您访问学者身份的正确签证类型。 2、DS-2019表&#xff1a;在申…

2024------MySQL数据库基础知识点总结

-- 最好的选择不是最明智的&#xff0c;而是最勇敢的&#xff0c;最能体现我们真实意愿的选择。 MySQL数据库基础知识点总结 一、概念 数据库&#xff1a;DataBase&#xff0c;简称DB。按照一定格式存储数据的一些文件的组合顾名思义: 存储数据的仓库&#xff0c;实际上就是一…

工业光源环形系列一高均匀条形光源特点

产品特点 ◆可以根据检测需求随意调整照射角度&#xff1a; ◆可以根据检测需求选择光源颜色&#xff1a; ◆多个条形光源可以自由组合&#xff1a; ◆使用贴片灯珠&#xff0c;均匀性更好。

ICDE2024 |VDTuner:向量数据库自动调优技术

在CodeFuse接入实际业务的过程中&#xff0c;大模型的推理成本以及生成内容的准确性是产品规模落地的两个核心考量因素。为了降低推理成本&#xff0c;我们研发了CodeFuse-ModelCache语义缓存加速功能&#xff0c;通过引入Cache机制&#xff0c;缓存已经计算的结果&#xff0c;…

Spring Security基础教程:从入门到实战

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c…

Windows系统安装MySQL数据库详细教程

【确认本地是否安装mysql】 &#xff08;1&#xff09;按【winr】快捷键打开运行&#xff1b; &#xff08;2&#xff09;输入services.msc&#xff0c;点击【确定】&#xff1b; &#xff08;3&#xff09;在打开的服务列表中查找mysql服务&#xff0c;如果没有mysql服务&am…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第16课-跳转私信

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第16课-跳转私信 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

猫咪没精神不吃饭?这招主食冻干喂养教你让猫咪恢复食欲

猫突然不吃东西没精神是生病了吗&#xff1f;当猫咪不吃东西、精神不振时&#xff0c;可能的原因有健康问题、环境因素或食物原因。首先应进行身体检查&#xff0c;观察是否有其他并发症&#xff0c;如无则可排除健康问题。还要给猫咪提供一个舒适的环境&#xff0c;多给它们一…

Elsevier旗下双1区TOP刊,8.8分影响因子加上超低自引率,各指标领跑计算机类SCI

【SciencePub学术】 今天小编给大家带来了一本计算机类的高分优刊解读&#xff0c;隶属于Elsevier出版社&#xff0c;JCR1区&#xff0c;中科院1区TOP&#xff0c;影响因子高达8.7&#xff0c;领域相符的学者可考虑&#xff01; APPLIED SOFT COMPUTING 1 期刊概况 【期刊简…

从零开始搭建Springboot项目脚手架2:配置文件、返回值、日志等

1、多个环境与配置文件 2、统一返回值 返回值包括两种场景&#xff1a;正常controller的返回、异常发生之后返回 正常controller的返回&#xff1a;通过在controller的默认返回Response实现 异常发生之后返回&#xff1a;通过全局异常处理统一捕获返回 首先创建类StatusCode…

windows安装ElasticSearch以及踩坑

1.下载 elasticsearch地址&#xff1a;Past Releases of Elastic Stack Software | Elastichttps://www.elastic.co/cn/downloads/past-releases#elasticsearch IK分析器地址&#xff1a;infinilabs/analysis-ik: &#x1f68c; The IK Analysis plugin integrates Lucene IK…

C++:多态-重写和重载

重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;是面向对象编程中常用的两个概念&#xff0c;它们虽然都涉及到方法的定义&#xff0c;但是在实现和使用上有着不同的特点。 重写&#xff08;Override&#xff09;&#xff1a; 重写是指在子类中重…

如何把视频转成文字稿?6个软件教你快速转换视频成文字

如何把视频转成文字稿&#xff1f;6个软件教你快速转换视频成文字 将视频转换为文字稿是一种有效的方式&#xff0c;可以帮助您提取视频中的信息并进行整理、编辑。以下是六个软件和工具&#xff0c;可以帮助您快速转换视频为文字稿&#xff1a; Google文档语音输入&#xf…

05-06 周一 Shell工程目录划分和开发最佳实践

05-06 周一 Shell工程目录划分和开发最佳实践 时间版本修改人描述2024年5月6日10:34:13V0.1宋全恒新建文档2024年5月6日11:07:12V1.0宋全恒完成 简介 之前楼主曾经完成过一个shell工程的开发&#xff0c;记得当时项目名称叫做campus-shell&#xff0c;主要是用来一键完成多个模…

高刚性滚柱直线导轨有哪些应用场景?

滚柱型滚动体取代了滚珠&#xff0c;由滚柱与导轨和滑块的线接触方式&#xff0c;滚柱导轨能在高负载的情况下仍然保持刚性值和高精度。为实现超高刚性和超重负荷能力而设计&#xff0c;整体滚柱导轨达到四方向等高刚性、高负载、高精度能力的特点&#xff0c;非常适合高速自动…

麦肯锡精英高效阅读法笔记

系列文章目录 如何有效阅读一本书笔记 读懂一本书笔记 麦肯锡精英高效阅读法笔记 文章目录 系列文章目录序章 无法读书的5个理由无法读书的理由① 忙于工作&#xff0c;没时间读书无法读书的理由② 不知应该读什么无法读书的理由③ 没读完的书不断增多无法读书的理由④ 工作繁…

[华为OD]C卷 精准核算检测 100

题目&#xff1a; 为了达到新冠疫情精准防控的需要&#xff0c;为了避免全员核酸检测Q带来的浪费&#xff0c;需要精准圈定可 能被感染的人群。现在根据传染病流调以及大数据分析&#xff0c;得到了每个人之间在时间、空间上是 否存在轨迹的交叉现在给定一组确诊人员编号&…

java面向对象实现文字格斗游戏

面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是一种程序设计思想&#xff0c;它利用“对象”来封装状态和行为&#xff0c;使得代码更易于维护和扩展。 下面我们使用java中的面向对象编程&#xff0c;来实现一个文字格斗的游戏联系&#xff01; 实…
最新文章