pingdouble的专栏

1.2.1 通道驱动

asterisk的通道驱动接口是最复杂也是最重要的可用接口。asteisk的通道API提供了对各种通信协议的抽象,使得asterisk的各种功能特性不必关心具体的通信协议。该组件主要是负责在asterisk通道抽象和具体的通信协议实现中的通信。

asterisk通道驱动接口的定义是ast_channel_tech接口。这个接口中定义了一些通道驱动必须要实现的方法。通道驱动首先要实现的方法是ast_channel工厂方法,即ast_channel_tech中的requester。当一个asterisk通道创建后,无论该通道是incoming方向的还是outgoing方向的,与该通道相关联的ast_channel_tech实现负责实例化和初始化该路通话对应的ast_channel。

ast_channel创建完成后,该结构中有一个创建该通道的ast_channel_tech指针。当然有很多其他的操作需要按照具体技术相关的方式来处理。图1.2中展示了asterisk中的两个通道,图1.4进行了扩展,展示了两个桥接的通道,以及通道技术如何实现的。

在ast_channel_tech中最重要的方法包括:

· requester:用于向通道驱动请求并实例化一个ast_channel对象,根据通道类型进行适当的初始化工作。

· call: 用户向ast_channel表示的终端发起一个出局呼叫。

· answer: 当asterisk决定应该对ast_channel关联的入局呼叫进行应答时调用。

· hangup: 当系统决定当前的呼叫应该挂断时调用。通道驱动需要与终端按照一定的协议进行通信。

· indicate: 通话开始后,还会产生一些其他的事件,需要将这些事件通知给终端。例如,如果设备被保持住了,这个函数就会被调用。

· send_digit_begin: 当终端设备开始向asterisk发送按键DTMF的时候,调用该函数。

· send_digit_end: 当终端设备向asterisk发送按键DTMF结束的时候,调用该函数。

· read: 当asterisk核心需要从终端读入一个ast_frame数据帧的时候调用read函数。ast_frame帧是asterisk中用来封装媒体(诸如音频或者视频)和信号的抽象结构。

· write: 使用该函数向终端设备发送一个ast_frame帧。一般是由通道驱动来完成数据的处理(采集等)和打包使得数据包能够适合所采用的通信协议,然后将打包后的数据发送到终端。

· bridge:该通道类型中的本地桥接函数。前面提到了,进行本地桥接是通道驱动为相同类型的两个通道提供了一种更高效的桥接方法,而不是将所有的信令流和媒体流都通过额外的抽象层来完成。这对于提供性能极其重要。

通话结束后,asterisk核心中的抽象通道处理代码会调用ast_channel_tech中的hangup函数,然后销毁ast_channel对象。

1.1.2 通道桥接

一个更为熟悉一点的呼叫场景是两个电话间的连接。在这个场景里,有两个电话终端与Asterisk系统连接,所以这个通话里存在两个通道。

图1.2 两个呼叫leg,代表了两个通道

展示了asterisk中的两个通道,图1.4进行了扩展,展示了两个桥接的通道,以及通道技术如何实现的。

图1.4通道技术和通道抽象层

在我们进入例子之前,让我们一起看看asterisk拨号方案中处理呼叫1234这个号码的语法。

注意,1234这个号码是随便选的。

呼叫该号码后,调用了3个拨号方案应用,

首先接听该通话,然后播放一个声音文件,最后挂断该通话。

; Define the rules forwhat happens when someone dials 1234. ;

exten =>1234,1,Answer()

same=>n,Playback(demo-congrats)

same => n,Hangup() .csharpcode, .csharpcode

pre { font-size: small; color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin:0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff;} .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color:#ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color:#ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin:0em; } .csharpcode .lnum { color: #606060; }

exten关键字是用来定义extension的。

在exten行的右侧,1234是为呼叫1234这个号码定义的呼叫规则。

接下来的规则,这里就是1234接下来的规则。

1.1.1通道

1.1.2 通道桥接

一个更为熟悉一点的呼叫场景是两个电话间的连接。在这个场景里,有两个电话终端与Asterisk系统连接,所以这个通话里存在两个通道。

图1.2 两个呼叫leg,代表了两个通道

当asterisk的通道像上面这样连接在一起的,就称之为一个通道桥接。执行通道桥接后将两个通道桥接在一起,其目的是在这两个通道间可以传递媒体信息

所有的媒体流都是通过asterisk来协商的。asterisk可以在不同的技术之间进行录音、音频操作、和转码。

节讨论。图1.3说明的是一个本地桥接的例子。

图3 本地桥接

1.1.3 帧

在asterisk代码里一个通话的通信是通过使用帧来完成的。帧是数据结构ast_frame的一个实例。

Asterisk中支持的帧类型列表是静态定义的,每种类型的帧是通过数字编码的类型(type)和子类型(subtype)标识的。完整的帧类型列表中include/asterisk/frame.h文件中,一些例子如下:

· VOICE: 这些帧携带部分语音流

· VIDEO: 这些帧携带部分视频流

生气是拿别人做错的事来惩罚自己

pingdouble的专栏

相关文章:

你感兴趣的文章:

标签云: