概述

上一章我们讲解了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. 基于小熊派Hi3861鸿蒙开发的IoT物联网学习【三】

    软件定时器:是基于系统Tick时钟中断且由软件来模拟的定时器,当经过设定的Tick时钟计数值后会触发用户定义的回调函数.定时精度与系统Tick时钟的周期有关. 定时器运行机制: cmsis_os2的A ...

  2. js中==和===的区别以及总结

    js中==和===的区别以及总结 学习js时我们会遇到 == 和 === 两种符号,现做总结如下 两种符号的定义 "==" 叫做相等运算符 "===" 叫做严格 ...

  3. Scrapy+splash报错 Connection was refused by other side

    报错信息如下: Traceback (most recent call last):   File "/usr/local/lib/python3.7/site-packages/scrap ...

  4. flutter 解决无法安装或者安装依赖慢的问题

    配置以下两个系统环境变量 右击计算机 --> 属性 --> 高级系统设置 --> 环境变量 PUB_HOSTED_URL : https://pub.flutter-io.cn FL ...

  5. SpringBoot自动装配-源码分析

    1. 简介 通过源码探究SpringBoot的自动装配功能. 2. 核心代码 2.1 启动类 我们都知道SpringBoot项目创建好后,会自动生成一个当前模块的启动类.如下: import org. ...

  6. Jenkins配置下拉菜单联动效果

    在使用Jenkins集成时,经常需要配置一些环境信息,由于测试.线上.预发布需要切换环境和域名,需要在Jenkins中配置下拉菜单联动效果. 首先选择参数化构建过程,然后首先配置环境,环境分为:测试环 ...

  7. HttpRunner3源码阅读:7.响应后处理 response.py

    response 上一篇说的client.py来发送请求,这里就来看另一个response.py,该文件主要是完成测试断言方法 可用资料 jmespath[json数据取值处理]: https://g ...

  8. 【python与机器学习实战】感知机和支持向量机学习笔记(一)

    对<Python与机器学习实战>一书阅读的记录,对于一些难以理解的地方查阅了资料辅以理解并补充和记录,重新梳理一下感知机和SVM的算法原理,加深记忆. 1.感知机 感知机的基本概念 感知机 ...

  9. 墙裂推荐!2020Android阿里&腾讯&百度&字节&美团校招面试汇总

    基本情况 2021届硕士生,Android开发岗 此文主要是2020年年初春招实习的面试和正式校招面试经验汇总,最终校招拿到了腾讯,百度,美团等offer 主要包括阿里4面,腾讯实习4面和校招4面,字 ...

  10. 【odoo】【知识点】生成pdf文件时缺少样式的问题

    欢迎转载,但需标注出处,谢谢! 背景 近期在客户的项目中发现在自定义报表样式的时候,存在渲染为html正常,但是在生成pdf的时候,缺少样式的情况. 分析 涉及到的odoo源码中的ir_actions ...