基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)

1 开源项目概述

Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上。Asterisk可以用三种协议来实现VoIP,同时可以与目前电话使用的标准硬件进行交互通信,Asterisk在实现VoIP时,不需要任何附加硬件,本文所采用的也是这种使用方式。但是,如果企业没有与VoIP语音网关运营商建立合作关系,想要自己构建这样的一个平台,那么要和数字电话设备与模拟电话设备进行交互通信,Asterisk需要一个PCI硬件的支持,这个硬件生产商中最著名的是Digium平台提供的。

Asterisk 的结构基本上是十分简单,但是它不同于大多数的电话产品。基本上,Asterisk担任的是一个中间件的功能,它连接了底层的电话技术和上层的电话应用。所以,Asterisk 具有很大的柔韧性,特殊的API接口都围绕着PBX核心系统。这个核心处理着PBX内部之间的相互联系。每一部分都是清晰来自于协议、编码或内部电话使用的硬件接口的抽象。这些抽象的接口使Asterisk可以与任何的硬件和技术以及将来的硬件和软件技术完美的结合。从图2.5可以看出,Asterisk由内部核心和外围动态可加载模块组成。内部核心由以下六个部分组成:PBX交换核心模块(PBX Switching Core)、调度和I/O管理模块(Scheduler and I/O Manager)、应用调用模块(Application Launcher)、编解码转换模块(Codec Translator)、动态模块加载器模块(Dynamic Module Loader)CDR生成模块(CDR Core)

     

1  Asterisk结构图

2           Asterisk二次开发概述

Asterisk是一个开源的PBX架构;但它并不是一个成品。通常情况下,由于企业应用的多样性,很难有一个成型的PBX产品可以满足企业的各种需求。传统的PBX成品,要么功能和灵活性不足,要么配置和维护复杂;而且都具有一个致命的缺点,那就是开放性、可扩展性。

 Asterisk具有传统PBX无法比拟的优点,那就是其灵活性,可扩展能力;Asterisk的扩展能力是通过开放相应的架构和接口来实现的。这就意味着Asterisk是一个组件而不是一个成型的产品,Asterisk的核心提供了一个基本的可运行环境,而外围相应的能力则可以通过加载和配置相关的插件和模块来实现。

Asterisk是一个开源的PBX架构;但它并不是一个成品。Asterisk的扩展能力是通过开放相应的架构和接口来实现的。这就意味着Asterisk是一个组件而不是一个成型的产品,Asterisk的核心提供了一个基本的可运行环境,而外围相应的能力则可以通过加载和配置相关的插件和模块来实现。

因此,使用Asterisk,一定会面临二次开发问题,这些二次开发主要围绕以下几个方面:

1)内部核心模块

开发扩展编解码能力模块

开发扩展相应的通道模块

2外围动态可加载模块

开发应用部分

开发外围管理部分

一般来说,Asterisk使用者很少需要去开发编解码能力模块和通道模块等内部核心模块;而需要开发最多的情况则是外围动态可加载模块,即外围管理部分和应用开发,本文也是指这些方面的开发。

3           Asterisk通道模型与呼叫流程

3.1 什么是asterisk通道?

Asterisk通道是指通过asterisk建立起来的一路通话。这类通话都包含一个incoming连接和一个outbound连接。每个电话都是通过一种通道驱动程序建立起来的,比如SIP,ZAP,IAX2等等。每一类的通道驱动,都拥有自己私有的通道数据结构,这些私有的结构从属于一个通用的Asterisk通道数据结构中,具体定义在channel.hchannel.c中。

3.2 基本的呼叫流程

Asterisk PBX呼叫流程如图3所示。

1)通过Asterisk的一个电话呼叫在一个通道驱动接口上到达,如SIP Socket

2)通道驱动在该通道上创建一个PBX通道并启动一个pbx线程

3)拨号方案被执行,拨号方案在一些地方通过dial应用(查看app_dial.c)

强制Asterisk创建一个呼出呼叫,一旦呼出,Asterisk会有以下两个动作将发生。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
以下是一个基于Asterisk的满意度调查功能的示例代码。该代码使用Dialplan和AGI脚本来实现满意度调查,并将结果保存到CSV文件中。您需要将以下代码添加到您的Asterisk配置文件中,并根据需要进行修改。 1. Dialplan 在您的Asterisk配置文件(如extensions.conf)中,添加以下Dialplan代码: ``` [mysurvey] exten => s,1,Answer() same => n,Playback(welcome) same => n,AGI(survey.agi) same => n,Playback(thankyou) same => n,Hangup() ``` 该Dialplan定义了一个名为“mysurvey”的上下文,当有电话呼入时,会播放欢迎语音,启动AGI脚本进行满意度调查,并在调查结束后播放感谢语音并挂断电话。 2. AGI脚本 在您的Asterisk配置文件(如extensions.conf)所在的目录中,创建名为“survey.agi”的AGI脚本文件,并添加以下代码: ``` #!/usr/bin/perl use Asterisk::AGI; use Text::CSV; my $AGI = new Asterisk::AGI; my $callerid = $AGI->get_variable('CALLERID(num)'); my $filename = "/var/spool/asterisk/surveys/${callerid}.csv"; my $csv = Text::CSV->new({binary => 1, eol => $/}) or die "Cannot use CSV: " . Text::CSV->error_diag(); my $questions = [ {id => 'q1', text => 'How satisfied are you with our service?'}, {id => 'q2', text => 'How likely are you to recommend us to others?'}, {id => 'q3', text => 'Do you have any suggestions for improvement?'}, ]; my $answers = {}; foreach my $question (@$questions) { my $answer = $AGI->exec('Playback', $question->{text}); $answers->{$question->{id}} = $answer; } open(my $fh, '>>', $filename) or die "Cannot open $filename: $!"; $csv->print($fh, [$callerid, $answers->{q1}, $answers->{q2}, $answers->{q3}]) or die "Cannot write to $filename: $!"; close($fh); ``` 该AGI脚本定义了一个名为“survey.agi”的AGI脚本,用于执行满意度调查并将结果保存到CSV文件中。该脚本首先获取来电号码,并根据号码生成CSV文件名。 然后,脚本定义了一个问题数组,用于存储要问的问题和问题ID。在调查过程中,脚本会遍历问题数组,并使用AGI命令“Playback”播放每个问题的语音,并等待来电者的回答。回答将存储在一个答案哈希表中。 最后,脚本将来电号码和答案存储到CSV文件中。如果文件不存在,则会创建一个新文件。如果文件已存在,则会在文件末尾添加新行。 3. 配置文件 在您的Asterisk配置文件中,添加以下内容以启用满意度调查功能: ``` [general] autofallthrough=yes [surveys] exten => _X.,1,Goto(mysurvey,s,1) ``` 该配置定义了一个名为“surveys”的上下文,用于匹配所有满意度调查呼叫。当有电话呼入时,该配置会将呼叫路由到之前定义的Dialplan“mysurvey”中。 需要注意的是,您需要根据您的Asterisk系统和需要进行适当的修改。例如,您可能需要更改CSV文件的路径和命名方式,或者修改问题数组中的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值