freeswitch新增模块API

概述
上一章我们讲解了freeswitch的源码基本结构,以及如何新增一个插件式模块。
freeswitch的架构非常适合这种业务开发模式,即以freeswitch的基本功能为开发平台,新增插件式模块来适配各种不同的业务场景,开发效率很高,学习成本相对较低。
freeswitch的许多模块具有API,freeswitch可以通过命令行、脚本或事件套接字从远程计算机接收API命令。
API命令可以做什么取决于每个单独的模块,常见的功能有数百个,包括返回状态信息(例如会议中有多少听众)或控制当前运行的应用程序(例如暂停正在播放的文件)。
可用的命令集取决于加载的模块,要查看可用API命令的列表,只需在cli中输入help或show api。
本节我们来介绍如何在新增模块中增加API接口,提供给外部命令行使用。
开发环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.8.7
GCC:4.8.5
新增模块API
新增模块的方法请参考上一节的内容,本节内容在模块mod_task的基础上修改。
mod_task.c内容如下:
#include<switch.h>
SWITCH_MODULE_LOAD_FUNCTION(mod_task_load);
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_task_shutdown);
SWITCH_MODULE_DEFINITION(mod_task,mod_task_load, mod_task_shutdown, NULL);
SWITCH_STANDARD_API(task_api_function)
{
//SWITCH_STANDARD_API have three args:(cmd, session, stream)
char *mycmd = NULL;
int argc = 0;
char *argv[16];
bzero(argv, sizeof(argv));
//split cmd and parse
if(cmd)
{
mycmd = strdup(cmd);
if (!mycmd)
{
stream->write_function(stream,"Out of memory\n");
return SWITCH_STATUS_FALSE;
}
if (!(argc = switch_split(mycmd, ' ',argv)) || !argv[0])
{
argc = 0;
switch_safe_free(mycmd);
return SWITCH_STATUS_FALSE;
}
}
//parse cmd, brach process
if(0 == strcmp("test1", argv[0]))
{
stream->write_function(stream,"task api test1, cmd:%s, session:%p", cmd, session);
}
else if(0 == strcmp("test2",argv[0]))
{
stream->write_function(stream,"task api test2, cmd:%s, session:%p", cmd, session);
}
else
{
stream->write_function(stream,"unknown cmd, cmd:%s, session:%p", cmd, session);
}
switch_safe_free(mycmd);
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MODULE_LOAD_FUNCTION(mod_task_load)
{
switch_api_interface_t* api_interface =NULL;
*module_interface =switch_loadable_module_create_module_interface(pool, modname);
switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,
"mod_task_load start\n");
// register API
SWITCH_ADD_API( api_interface,
"task",
"task api",
task_api_function,
"<cmd><args>");
//注册终端命令自动补全
switch_console_set_complete("add tasktest1 [args]");
switch_console_set_complete("add tasktest2 [args]");
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_task_shutdown)
{
switch_log_printf(SWITCH_CHANNEL_LOG,SWITCH_LOG_INFO,
"mod_task_shutdownstop\n");
return SWITCH_STATUS_SUCCESS;
}
编译安装
进入task模块目录,编译安装,在Makefile.am文件未变化的情况下,不需要重新config。
cd $(top_srcdir)/src/mod/applications/mod_task
make install
加载测试
启动freeswitch
cd /usr/local/freeswitch/bin/
./freeswitch –nonat
freeswitch启动成功后,在freeswitch命令行中输入API命令:
freeswitch@localhost.localdomain>load mod_task
2021-08-2409:04:05.554740 [INFO] mod_task.c:94 mod_task_load start
2021-08-2409:04:05.554740 [CONSOLE] switch_loadable_module.c:1540 Successfully Loaded[mod_task]
2021-08-2409:04:05.554740 [NOTICE] switch_loadable_module.c:338 Adding API Function 'task'
+OK ReloadingXML
+OK
freeswitch@localhost.localdomain>
freeswitch@localhost.localdomain>task test1 138
task api test1,cmd:test1 138, session:0
freeswitch@localhost.localdomain>task test2 139
task api test2,cmd:test2 139, session:0
freeswitch@localhost.localdomain>task test5 140
unknown cmd,cmd:test5 140, session:0
freeswitch@localhost.localdomain>
OK,今天我们这一节的新增模块API的说明就完成了。
空空如常
求真得真
freeswitch新增模块API的更多相关文章
- freeswitch新增模块
概述 freeswitch的架构由稳定的核心模块和大量的外围插件式模块组成.核心模块保持稳定,外围模块可以动态的加载/卸载,非常灵活方便. 外围模块通过核心提供的 Public API与核心进行通信, ...
- Java 9 揭秘(10. 模块API)
Tips 做一个终身学习的人. 在本章节中,主要介绍以下内容: 什么是模块 API 如何在程序中表示模块和模块描述 如何读取程序中的模块描述 如何表示模块的版本 如何使用Module和ModuleDe ...
- Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Py ...
- 第30月第11天 Xcode 9.0中新增的API版本检查@available
1.Xcode 9.0中新增的API版本检查@available https://www.jianshu.com/p/0a94baa6c3dd https://www.jianshu.com/p/b8 ...
- tensorflow中slim模块api介绍
tensorflow中slim模块api介绍 翻译 2017年08月29日 20:13:35 http://blog.csdn.net/guvcolie/article/details/77686 ...
- RookeyFrame在线新增模块
今天给大家演示下在线新增模块的功能,在线新增模块跟在vs中写model实体类区别不大,线上新增少了手动初始化的过程,新增后模块同样具备新增.修改.删除.查看.导入.导出.复制.批量编辑.回收站.草稿箱 ...
- Nginx在线服务状态下平滑升级或新增模块
nginx在使用过程中,有时需要在不影响当前业务的情况下,进行升级或新增模块.nginx的升级有两种方法:1.半自动化升级:2.手动升级 不过都需要先查看安装的nginx版本和配置信息,然后前往官网下 ...
- ABP新增模块可能遇到的问题
当我们新增一个模块时: public class SSORedisModule: AbpModule { //public override void PreInitialize() //{ // b ...
- freeswitch python模块
概述 freeswitch支持多种语言的业务开发,包括C/C++,java,python,js,lua,Golang等等.freeswitch在使用python做业务开发时,有俩种接入方式,一种是ES ...
随机推荐
- transform和tolower
transform:<algorithm> tolower:<ctype.h> transform有两种使用方法 第一种(参数): 源目标起始迭代器地址 源目标结束迭代器地址 ...
- 【小工具系列】Python + OpenCV 图片序列转换成视频
图片序列转换成视频 最近一直在找一个工具,能够将一堆图片转化成视频.网上找了一些小软件,还有 win10 的照片自带的视频制作功能,都不是很满意. 又不想下载那些专业的视频剪辑软件大材小用. 然后找到 ...
- labview系列-中级计算器开发
本例子通过对中级计算器的操练,实现对结构/字符串等基础知识的掌握和理解,为后续的编程工作提供基础. 计算器开发原理:通过按钮触发事件,再各个事件中编写相应加减乘除方法,并显示在结果中即可. 要点:临时 ...
- 接口管理效率神器Apifox
前言 你是一个测试,你们团队目前开发模式是前后端分离. 某一天,版本V1.0接口评审完,发布在了swagger上,前后端各自进行开发.此时你根据接口文档将新接口迁移到JMeter上,然后开始编写接口测 ...
- Bugku-login1(SKCTF)(SQL约束攻击)
原因 sql语句中insert和select对长度和空格的处理方式差异造成漏洞. select对参数后面的空格的处理方式是删除,insert只是取规定的最大长度的字符串. 逻辑 1.用 select ...
- Oracle数据泵导入的时候创建索引是否会使用并行?
一.疑问,Oracle数据泵导入的时候创建索引是否会使用并行? 某客户需要使用数据泵进行迁移,客户咨询导入的时间能不能加快一点. 那么如何加快导入的速度呢? 多加一些并行,那么创建索引内部的索引并行度 ...
- Flutter开发进阶学习指南Flutter开发进阶学习指南
Flutter 的起源 Flutter 的诞生其实比较有意思,Flutter 诞生于 Chrome 团队的一场内部实验, 谷歌的前端团队在把前端一些"乱七八糟"的规范去掉后,发现在 ...
- 记客户端出现Connect reset问题排查。
客户访问我们地址出现Connect reset. 网上查询说是服务端关闭,客户端还在读,就会出现Connect reset. 我们就排查为什么服务端会关闭. 网络的同事说收到了客户端的信息,但是被服务 ...
- Redis-01-基础
基本概念 1 基本概念 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库(非关系性数据库) redis运维的责任 1.保证服务不挂 2.备份数据 ...
- 【笔记】Ada Boosting和Gradient Boosting
Ada Boosting和Gradient Boosting Ada Boosting 除了先前的集成学习的思路以外,还有一种集成学习的思路boosting,这种思路,也是集成多个模型,但是和bagg ...