概述

上一章我们讲解了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的更多相关文章

  1. freeswitch新增模块

    概述 freeswitch的架构由稳定的核心模块和大量的外围插件式模块组成.核心模块保持稳定,外围模块可以动态的加载/卸载,非常灵活方便. 外围模块通过核心提供的 Public API与核心进行通信, ...

  2. Java 9 揭秘(10. 模块API)

    Tips 做一个终身学习的人. 在本章节中,主要介绍以下内容: 什么是模块 API 如何在程序中表示模块和模块描述 如何读取程序中的模块描述 如何表示模块的版本 如何使用Module和ModuleDe ...

  3. Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式

    Python第十四天 序列化  pickle模块  cPickle模块  JSON模块  API的两种格式 目录 Pycharm使用技巧(转载) Python第一天  安装  shell  文件 Py ...

  4. 第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 ...

  5. tensorflow中slim模块api介绍

    tensorflow中slim模块api介绍 翻译 2017年08月29日 20:13:35   http://blog.csdn.net/guvcolie/article/details/77686 ...

  6. RookeyFrame在线新增模块

    今天给大家演示下在线新增模块的功能,在线新增模块跟在vs中写model实体类区别不大,线上新增少了手动初始化的过程,新增后模块同样具备新增.修改.删除.查看.导入.导出.复制.批量编辑.回收站.草稿箱 ...

  7. Nginx在线服务状态下平滑升级或新增模块

    nginx在使用过程中,有时需要在不影响当前业务的情况下,进行升级或新增模块.nginx的升级有两种方法:1.半自动化升级:2.手动升级 不过都需要先查看安装的nginx版本和配置信息,然后前往官网下 ...

  8. ABP新增模块可能遇到的问题

    当我们新增一个模块时: public class SSORedisModule: AbpModule { //public override void PreInitialize() //{ // b ...

  9. freeswitch python模块

    概述 freeswitch支持多种语言的业务开发,包括C/C++,java,python,js,lua,Golang等等.freeswitch在使用python做业务开发时,有俩种接入方式,一种是ES ...

随机推荐

  1. Jenkins 进阶篇 - 参数化构建

    我们在构建任务时经常会遇到这样的情景,一个任务配置好了以后,在后面的构建过程中,又会修改一些配置.例如,我们构建项目的代码可能是拉取指定的分支或者是Tag进行构建,又或者是在构建是需要指定特定的运行平 ...

  2. shell编程-ssh免交互批量分发公钥脚本

    脚本基本原理 1.控制端免交互创建秘钥和公钥: 1 ssh-keygen -t rsa -f /root/.ssh/id_rsa -N "" 2.免交互发送公钥 1 sshpass ...

  3. Oracle导入dmp文件:ORACLE错误12899而拒绝行的问题如何解决

    原文链接:https://www.2cto.com/database/201804/736027.html

  4. vulnhub-XXE靶机渗透记录

    准备工作 在vulnhub官网下载xxe靶机 导入虚拟机 开始进行渗透测试 信息收集 首先打开kali,设置成NAT模式 查看本机ip地址 利用端口扫描工具nmap进行探测扫描 nmap -sS 19 ...

  5. 使用Maven打包可运行jar和javaagent.jar的区别

    简介 javaagent 是 Java1.5 之后引入的新特性,其主要作用是在class被加载之前对其拦截,以插入我们的字节码. java1.5 之前使用的是JVMTI(jvm tool interf ...

  6. 【阅读笔记】Java核心技术卷一 #5.Chapter7

    7 异常.断言和日志 在 Java 中,如果某个方法不能够采用正常的途径完整它的任务,就可以通过另外一个路径退出方法. 在这种情况下,将会立刻退出,并不返回任何值,而是抛出(throw)一个封装了错误 ...

  7. Thinkphp 生成的验证码不显示问题解决

    在调用验证码之前加上   ob_clean(); 将: public function verify(){                $verify = new \Think\Verify();  ...

  8. Java 线程安全的实现方法

    概述 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体, 程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和 ...

  9. 并发编程——线程中sleep(),yield(),join(),wait(),notify(),notifyAll()区别

    前言 今天简单的讲一讲线程中sleep(),join(),yield(),wait(),notify(),notifyAll()这些方法的使用以及区别. 不过在讲这些方法之前,需要简单的介绍一下锁池和 ...

  10. 040_Spring注解开发

    目录 Spring注解开发 bean注册到Spring容器中 applicationContext.xml添加包扫描注解 实体类添加注解@Component 属性注入 属性添加注解@Value(&qu ...