概述

上一章我们讲解了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. 微信小程序云开发-云存储的应用-识别营业执照

    一.准备工作 1.创建云函数identify 二.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...

  2. 分享一个自己画div的技巧

    分享一个自己画div的技巧 笔者是小白,前端不是很懂.现在想总结下自己画div布局的小技巧和思路. 先对着设计图把div给好好框选出来 我个人觉得这一步是很重要的,要先分析大局,再细节处理.一定要先决 ...

  3. 程序向informix数据库插入text类型的中文乱码问题

    部署应用的Linux服务器的编码格式为utf-8.但是数据库的编码格式为Gbk.所以导致的乱码.但是其他类型的数据中文并不乱码. 通过图片中修改编码格式,可以解决,导致的后果就是tomcat的日志输出 ...

  4. python安装pyeda库--windows版

    本页介绍了如何购买自己的PyEDA闪亮副本.PyEDA项目的主要目标是成为主流的Python软件包,并遵守社区中遵守的大多数约定. 支持平台 PyEDA支持Windows以及任何带有C编译器的平台.作 ...

  5. onclick="return doAlert()" onclick="return false"

    return false不是取bai消事件冒泡,而是取消"du浏览器默认行为".比如一个链接zhi<a href="http://zhidao.baidu.com& ...

  6. DC-4靶机

    仅供个人娱乐 靶机信息 下载地址:http://www.five86.com/downloads/DC-4.zip 一.主机扫描 arp-scan -l nmap -p 1-65535 -A -sV ...

  7. Docker 网络解读

    Docker 容器在运行时,会涉及多个容器相互连接,甚至与宿主机上的应用连接的问题.既然需要产生连接,那么就必然要依赖网络. 网络在Docker的技术体系中,是一个不容易搞清楚的要点.因此,希望您读完 ...

  8. 3个月零基础入门Python+数据分析,详细时间表+计划表分享

    ​大家好,我是白云. 今天想给大家分享的是三个月零基础入门数据分析学习计划.有小伙伴可能会说,英语好像有点不太好,要怎么办?所以今天我给大家分享的资源呢就是对国内的小伙伴很友好,还附赠大家一份三个月学 ...

  9. Ubuntu开启SSH端口并且搭建Vulhub环境

    1.下载好ubuntu.开启SSH: * sudo apt update * sudo apt install openssh-server * sudo systemctl status ssh 用 ...

  10. PHP-Audit-Labs-Day1 - in_array函数缺陷

    函数缺陷原理分析 先看一段简单的源代码 class Challenge{ const UPLOAD_DIRECTORY = './solutions/'; private $file; private ...