扩展Asterisk1.8.7的CLI接口

  我之前有一篇文章(http://www.cnblogs.com/MikeZhang/archive/2012/04/14/asteriskCLIAppTest20120414.html)介绍过如何扩展asterisk的cli接口,本篇是它的继续,总结下,也方便我以后查阅。

  大部分情况下,配置asterisk的拨号方案,用CLI、AMI之类的就可以满足我们的需求。可有些情况下涉及到业务的东东,需要数据库的参与(比如用sqlserve存储asterisk的录音记录等等),拨号方案那种静态的做法完全不用考虑,而原始的CLI、AMI已经不能满足需求。这时就需要考虑从源码入手,扩展asterisk了。

  asterisk是基于插件的,很容易扩展。手动编译过asterisk源码的朋友应该知道,在asterisk源码目录里有一个addons的目录,里面就是asterisk的插件(其实apps下也可以看做是插件)。

  这里有个小例子,主要演示怎么从源码扩展asterisk的CLI接口。

一、建立目录结构,配置Makefile

1、为了方便代码的管理,我决定新建立一个叫addons_test的文件夹;

2、将apps下的Makefile复制到该目录;

3、打开asterisk主目录下的Makefile文件,在MOD_SUBDIRS变量中加入addons_test(我的Makefile是在266行)。

二、编写CLI插件代码

1、在addons_test目录添加文件app_testApp20120605.c和文件app_testApp20120605.exports

说明:

app_testApp20120605.c为程序代码

app_testApp20120605.exports 为动态库导出配置

2、编写文件内容

  app_testApp20120605.exports文件简单,可以将apps目录下的任一”.exports”文件copy至本目录改名即可,这里主要介绍app_testApp20120605.c的书写。 

2.1 首先需要添加头文件: 

#include "asterisk.h"
#include "asterisk/module.h"
#include "asterisk/cli.h"

2.2 定义Application名称:

static char *app_testApp = "testApp20120605";

2.3 写模块加载函数:

static int testApp_exec(struct ast_channel *chan, const char *data)
{ast_verb(2,"testApp_exec : %s\r\n",data);return0;
}
说明:这个要用此格式,尽管chan变量没有用到,但加载模块的函数指针是这种格式。 

2.4 编写CLI接口函数:

View Code
 1 static char *handle_cli_testApp(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
 2 {
 3         struct ast_channel *chan=NULL;
 4 
 5         if(CLI_INIT == cmd) {
 6                 e->command = "testApp20120605 {print}";
 7                 e->usage =
 8                         "Usage: testApp20120605 <print> <something2print>\n"
 9                         "       Print something to test application\n"
10                         "       application when the 'print' command is used.\n";
11                 returnNULL;
12         }
13 
14         if (a->argc < 2)
15                 return CLI_SHOWUSAGE;
16 
17         if (!strcasecmp(a->argv[1], "print")) {
18                 testApp_exec(chan, a->argv[2]);
19         }else{
20                 return CLI_SHOWUSAGE;
21         }
22 
23         return CLI_SUCCESS;
24 }

2.5 编写模块加载函数:

View Code
1 static int load_module(void)
2 {
3         int res;
4         ast_cli_register_multiple(cli_testApp, ARRAY_LEN(cli_testApp));
5         res = ast_register_application_xml(app_testApp,testApp_exec);
6         return res;
7 }

2.6 编写模块卸载函数:

View Code
static int unload_module(void)
{int res;ast_cli_unregister_multiple(cli_testApp, ARRAY_LEN(cli_testApp));res = ast_unregister_application(app_testApp);return res;
}

三、测试CLI插件 

1、编译运行

执行如下命令:

make && make install && asterisk && asterisk -rvvvvvvvv 

2、测试 

启动后,执行如下命令: 

testApp20120605 print "Just a test"

运行效果: 

转载于:https://www.cnblogs.com/MikeZhang/archive/2012/06/05/asterisk187CLIAddOns.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSS中的 ',' 、''、'+'、'~'

1、群组选择器&#xff08;,&#xff09; /* 表示既h1&#xff0c;又h2 */ h1, h2 {color: red; } 2、后代选择器&#xff08;空格&#xff09; /* 表示 h1 下面的所有 span 元素&#xff0c;不管是否以 h1 为直接父元素 */ h1 span {} 3、子元素选择器&#xff08;>&#x…

避免不必要的Spring配置组件扫描

我在堆栈溢出中遇到了一个有趣的问题。 Brett Ryan有问题&#xff0c;Spring Security配置被初始化了两次。 当我查看他的代码时&#xff0c;我发现了问题所在。 让我展示显示代码。 他有相当标准的Spring应用程序&#xff08;不使用Spring Boot&#xff09;。 使用基于Spring…

正则表达式 小结

时间&#xff1a;2018年1月21日 18:29:01 用于&#xff1a;此小结是学习正则表达式的总结 正则表达式&#xff08;regular expression&#xff09;小结1. . 表示出断行外任意一个字符   ^行首   $行尾   [] 表示范围 如&#xff1a;[a-z]指a到z范围的一个字符 [\u]表…

js 之for..in、表单及事件触发

<html ><body> <script type"text/javascript">var x;var mycarsnew Array();mycars[0] "saa";mycars[1] "Va";mycars[2] "BMW";for(x in mycars)//x是变量用来指定变量&#xff0c;指定的变量可以是数组元素&…

移动端,fixed bottom问题

//不显示 .bar {position:fixed;bottom:0;z-index:99; }//显示 .bar{position:fixed;bottom:calc(90vh); /*当前屏幕高度百分比90%*/z-index:99; } 转载于:https://www.cnblogs.com/qq917937712/p/11475310.html

js 判断一个字符在字符串中出现的次数

<script type"text/javascript">var sdjh.doiwe.esd.d.ddd0sdd.d.; var n(s.split(.)).length-1; document.write(n);</script> 结果&#xff1a;6 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

Spring Boot微服务的黑匣子测试是如此简单

当我需要进行原型设计&#xff0c;概念验证或在空闲时间使用一些新技术时&#xff0c;开始新项目对于Maven来说总是有点烦人。 不得不说&#xff0c;设置Maven项目并不难&#xff0c;您可以使用Maven原型。 但是原型通常是过时的。 谁想玩旧技术&#xff1f; 因此&#xff0c;我…

sharepoint ECMAScript对象模型系列

转载&#xff1a;Sharepoint学习笔记—ECMAScript对象模型系列-- 8、组与用户操作(一) http://www.cnblogs.com/wsdj-ITtech/archive/2012/06/08/2416967.html 转载于:https://www.cnblogs.com/EricLee007/archive/2012/06/08/2541636.html

c++ static关键字的作用

名称  全局静态变量  局部静态变量   静态函数  类的静态成员类的静态函数形式  全局变量前加static局部变量前加static 函数返回类型前加static类成员前加static类成员函数前加static存储区域 静态存储区 运行期间一直存在 静态存储区 运行期间一直存在 作用域…

单片机第三季-第七课:STM32中断体系

目录 1&#xff0c;NVIC 2&#xff0c;中断和事件的区别 3&#xff0c;优先级的概念 4&#xff0c;如何实际编程使用外部中断 5&#xff0c;STM32开发板通过按键控制LED 5.1&#xff0c;打开相应GPIO模块时钟 5.2&#xff0c;NVIC设置 5.3&#xff0c;外部中断线和配套…

【学亮IT手记】angularJS select2多选下拉框实例

永远保持对大部分知识的好奇心&#xff0c;学习从不枯燥&#xff0c;也没有被逼学习一说&#xff0c;乐此不疲才是该有的心态和境界&#xff01;&#xff01;&#xff01; 引入相关js库&#xff1a; html部分代码&#xff1a; angularJS定义数据源变量&#xff1a; 更多专业前端…

虚拟主机相关业务知识介绍

什么是虚拟主机&#xff1f; 虚拟主机是使用特殊的软硬件技术&#xff0c;把一台运行在因特网上的服务器主机分成一台台“虚拟”的主机&#xff0c;每一台虚拟主机都具有独立的域名&#xff0c;具有完整的Internet服务器&#xff08;WWW、FTP、Email等&#xff09;功能&#xf…

在CXF API和拦截器中添加Gzip压缩

如今&#xff0c;由于我们在响应中发送大量数据&#xff0c;因此必须对API响应执行Gzip压缩。 它节省了网络带宽和交付时间&#xff0c;当然还节省了Internet上的空间。 CXF提供了以多种方式使用Gzip压缩的选项。 蓝图 注解 蓝图&#xff1a; <bean id"gZipInterce…

zTree树形菜单交互选项卡效果实现

1、 添加自定义属性 page 2、 为 ztree 每个树形节点&#xff0c;添加点击事件 1 <!DOCTYPE html>2 <html>3 4 <head>5 <meta charset"UTF-8">6 <title>ztree树形菜单的使用</title>7 <!-- 导入…

windows 服务部署管理

通过创建bat文件&#xff0c;能够快速的对服务进行部署和卸载。 部署的命令如下&#xff1a; $SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe [exename] Net Start [servicename] sc config [servicename] startauto 卸载的命令如下: $SystemRoot%\Microsof…

oracle中sql语句的优化(转帖)

一、执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边 表或视图: Student_info (30000条数据) Description_info (30条数据) select * from description_info di ,student_info si --学生信息表 where si.student…

Devoxx Hackergarten的企业Web应用程序原型

我已经连续10年参加DevoxxBe了 。 这是我最喜欢的Java会议&#xff0c;但是谈话时间表并不总是最佳的&#xff1a;有时我想同时看2个精彩的谈话&#xff01; 因此&#xff0c;在Devoxx的Hackergarten&#xff0c;在参加讲座之间&#xff0c;我们中的一些人开始构建Web应用程序以…

C# 加载C++的dll

[DllImport("kernel32")] private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string fileName) 转载于:https://www.cnblogs.com/sky-jyq/p/11509059.html

谈一谈Http Request 与 Http Response

谈一谈Http Request 与 Http Response   写在前面的话&#xff1a;最近帮朋友弄弄微信商城&#xff0c;对于微信的基础开发&#xff0c;基本上就是各种post、get&#xff0c;有时是微信服务器向我们的服务器post、get数据&#xff0c;有时需要我们自己的服务器向微信服务器各…

Linux常用命令和vi,gdb的使用

1.ls 命令 --------------------------------------------------------------------- ls以默认方式显示当前目录文件列表 ls -a显示所有文件包括隐藏文件 ls -l显示文件属性&#xff0c;包括大小&#xff0c;日期&#xff0c;符号连接&#xff0c;是否可读写及是否可执行 -----…