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 ...
随机推荐
- gnome环境设置
1.gnome的环境安装sudo apt-get install gnome2.选择gdm3 开机显示不正常:could not apply the stored configuration for ...
- [c++] 面向对象课程(二)-- 带指针类的设计
class with pointer menbers string_test.cpp 1 #include "string.h" 2 #include <iostream&g ...
- 我去!爬虫遇到JS逆向AES加密反爬,哭了
今天准备爬取网页时,遇到『JS逆向AES加密』反爬.比如这样的: 在发送请求获取数据时,需要用到参数params和encSecKey,但是这两个参数经过JS逆向AES加密而来. 既然遇到了这个情况,那 ...
- python内置函数--- hasattr、setattr、getattr
1.描述 hasattr() 函数用于判断对象是否包含对应的属性. 语法 hasattr 语法: hasattr(object, name) 2.描述 setattr() 函数对应函数 getattr ...
- 第二十八篇 -- 写一个简陋的WIFI服务器界面
效果图: Dlg.cpp // WIFIWMITestDlg.cpp : implementation file // #include "stdafx.h" #include & ...
- 对一个sql的分析
select * FROM LPEdorItem a, LCCont b, LPEdorApp c WHERE a.edoracceptno = c.edoracceptno and a.ContNo ...
- Mac使用Charles抓取ios手机APP中的https请求
1.配置Http代理 Port为监听端口号,默认为8888,勾选Enable transparent HTTP proxying,接着勾选SOCKS proxy,可以监听Socks请求 2.安装Cha ...
- 每个程序员的必经之路:Hello,world!
每个程序员的必经之路:Hello,world! Java 源程序 也称源代码,是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令. 在现代程序语言中,源代码可以是以 ...
- 抄书抄博客毒害社区的Writer几时休?
曾几何时,博客园用户也渐渐分成了两类人:Writer和Coder. 何为Coder?就是认认真真写代码,平时分享工作中的一些问题.好的解决方案,或者写一些实用的原理技术文.答疑解惑的教程技术文. 何为 ...
- 表单验证插件jquery-validation以及案例
表单验证插件jquery-validation以及案例 1,获取并引入: (1)获取:官网:https://jqueryvalidation.org/ [home]->[files]->[ ...