- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
开源应用架构之asterisk.
作者:Russell Bryant 翻译:jiazhengfeng…)
Asterisk[1]是一款GPLv2协议下的开源电话应用平台。简单来说,Asterisk是一个服务器应用,能够完成发起电话呼叫、接受电话呼叫、对电话呼叫进行定制处理。
Asterisk这个项目是由Mark Spencer于1999年开创的。Mark当时有一个名为Linux技术支持服务公司,公司需要一套电话系统来开展业务。由于Mark当时没有足够的钱购买,就决定自己研发一套。随着Asterisk逐渐流行,Linux支持服务公司逐渐将业务重点转移到Asterisk,并将公司的名字改为Digium。
Asterisk的命名是从Unix的通配符*来的,可以看出Asterisk的目标是能够做通讯里面的任何事情。为完成该目标,Asterisk现在已经支持了很多种能够发起和接受电话呼叫的技术,包括多种VoIP协议,与传统电话网络或者公用电话网络的模拟连接和数字连接。Asterisk的一个主要优势是能够让不同类型的电话呼叫可以呼入到Asterisk中,以及从Asterisk呼出到不同类型的电话。
电话呼入到asterisk或者从asterisk呼出,就具有了许多额外的特性,我们可以利用这些额外的特性来对电话进行定制处理。有些特性是经常用到的,诸如语音邮件。还有一些其他的特性可以与别的特性结合在一起用以创建和定制语音应用,诸如播放一个提示音,获取数字输入,或者语音识别等。
1.1 概念
本部分讨论对Asterisk各个部分都比较重要的结构概念,这些思想都是Asterisk体系结构的基础。
1.1.1 通道
??? Asterisk中的通道,代表了Asterisk系统与一些电话终端之间的连接(图1.1)。最通常的例子就是电话呼叫到asterisk系统中。这个连接是由一个单侧的通道来表示的。在Asterisk代码里,通道是作为ast_channel这个数据结构的实例存在。这种单侧的呼叫场景比如一个主叫用户使用Asterisk中的语音邮件服务。
??????????????????????????????????????????????????????????????????????????? 图1.1 单侧呼叫leg,用以表示一个单侧通道
1.1.2 通道桥接
一个更为熟悉一点的呼叫场景是两个电话间的连接。在这个场景里 ,有两个电话终端与Asterisk系统连接,所以这个通话里存在两个通道。
图1.2 两个呼叫leg,代表了两个通道
当asterisk的通道像上面这样连接在一起的,就称之为一个通道桥接。执行通道桥接后将两个通道桥接在一起,其目的是在这两个通道间可以传递媒体信息。媒体流最常见的是音频流。当然,也可以在呼叫中包括视频流或者文本流。即便是包含多种媒体流,也是由单个通道来处理的。在图2中,有电话A和电话B对应的通道,桥接负责从电话A向电话B传递媒体和从电话B向电话A船体媒体。所有的媒体流都是通过asterisk来协商的。asterisk可以在不同的技术之间进行录音、音频操作、和转码。
两个通道桥接在一起,可以通过如下两个方法来完成:通用桥接和本地桥接。通用桥接是不管使用什么样的通道技术均能正常工作,这种桥接是通过asterisk的抽象通道接口来传递所有的音频和信令数据。这种桥接方法是最复杂的,也是最有效的。
本地桥接是和通话所使用的技术相关的一种桥接。如果两个通道使用相同的媒体传输技术,可以使用一种更高效的方式而不用通过像不同技术那种方式要通过asterisk的抽象层来完成。例如,如果连接到电话网络中硬件是固定的,可以通过在硬件上将两个通道桥接在一起,不用放到应用层来完成。有些VoIP协议,可以让终端之间直接互发媒体信息,只让信令信息通过服务器。
决定使用通用桥接还是本地桥接是在桥接的时候通过两个通道的比较完成的。如果两个通道均支持本地桥接,则采用本地桥接,反之,则使用通用桥接。为了判断两个通道是否支持相同的本地桥接方法,可以简单的通过c函数指针的比较。这种比较方法,并不是最优雅的方法,但是我们还没有遇到不能满足我们需要的情况。关于通道的本地桥接将会在1.2节讨论。图1.3说明的是一个本地桥接的例子。
图3 本地桥接
1.1.3 帧
在asterisk代码里一个通话的通信是通过使用帧来完成的。帧是数据结构ast_frame的一个实例。帧可以是媒体帧也可以是信令帧。在一个基本的呼叫中,媒体帧流包括通过服务器的语音数据。信令帧用来发送与呼叫信令事件相关的消息,诸如,按下一个数字键,通话被保持,通话被挂断等。
??? Asterisk中支持的帧类型列表是静态定义的,每种类型的帧是通过数字编码的类型(type)和子类型(subtype)标识的。完整的帧类型
文档评论(0)