`
free_bird816
  • 浏览: 205949 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

Asterisk 源码 转

阅读更多

在www.asterisk.org上可以获得asterisk 1.4和asterisk 1.2.18两个版本。前一个是for 2.6内核,后一个是for 2.4内核。

我在Ubuntu 6.06上编译和运行了asterisk 1.4。在RH9上编译和运行了asterisk 1.2。

使用”asterisk –vvvc”命令启动了Asterisk 1.2.18后,出现了
Asterisk Ready.
*CLI>
的提示界面。这是Asterisk的console界面。当在*CLI提示符后面使用”dial”命令后,asterisk开始播放一系列的语音。Dial命令是如何工作的,在asterisk内部,dial命令的运行流程是怎样的一个过程?经过二周的断断续续的对源代码的阅读,大致了解了一些信息,特在此记录。记录的过程也可以帮助我整理一下思路。
在asterisk中,有三个重要的逻辑实体。它们完成管理员设定的各项电话功能。这三个实体是:PBX,Channel,Application。
当一个呼叫业务启动后,就会有一个PBX线程被启动,它掌控着这个呼叫业务,直到呼叫业务的结束。
Channel是完成呼叫业务基本功能的实体。这些基本功能包括:二次拨号(send_digit),挂机(hangup),摘机(answer)等。Channel有很多种:H.323,OSS,SIP,ZAP,ALSA,IAX等。每个channnel实体的代码对应于一个名为chan_xxx.c的源代码文件。比如OSS就对应于chan_oss.c。每个Channel实体被编译为.so文件,成为linux的共享对象(Shared Object)。当asterisk系统启动时,系统根据配置有选择的装入这些共享对象(类似于WINDOWS下的动态链接库)。
Application是对一个呼叫业务进行操作的动作。我觉得叫Action比较好,不清楚为什么叫application,也许我还没有了解更深入吧。这些动作有:拨号(dial),echo,answer,wait,playback等。每个application实体的代码对应于一个名为app_xxx.c的源代码文件。比如wait就对应于app_wait.c。Application类似channel也被编译成为.so。
上面介绍了三个完成asterisk系统各项电话功能的实体,下面介始asterisk系统的几个基本的配置文件。
目前,我只理解了一小部分的配置文件。对于channel,每个channel都有自已的配置文件。同样对于OSS,配置文件是oss.conf。另一个重要的配置文件是extension.conf。它确定了asterisk系统的dial plan。
下面从asterisk系统的main()开始,介绍PBX,Channel,Appliction这三者是如何关联到了一起。
Asterisk.c中的main()是系统的开始入口函数。在2363行,main()调用了load_modules()来装载各个模块(也就是共享对象)。Asterisk会装载channel oss模块,我们转到chan_oss.c文件中的load_modules()函数。在这个函数里,
首先,cfg = ast_config_load(config);装入了oss.conf文件的内容;
其次,ast_channel_register(&oss_tech);将channel的各项基本功能注册到了系统中。oss_tech是一个struct ast_channel_tech结构。它记录了channel oss完成基本功能的各个函数地址。每个channel都是这样注册到系统中的。
最后,ast_cli_register_multiple()将channel oss支持的CLI命令及其对应的回调函数注册到系统中。
这样,一个channel实体被装载了。
回到启动asterisk后的console界面上来。在提示符*CLI>后,输入dial,将听到声卡发出的声音。这个命令是如何被执行的呢?
由于channel oss将自己支持的命令在被装载时,通过ast_cli_register_multiple()注册到了系统中,因此,在系统的*CLI>提示后输入了dial后,系统在注册信息找到了channel oss支持dial这个命令,并确定了chan_oss.c中的console_dial()函数是这个命令的回调函数,这个回调函数被调用。
在console_dial()中,oss_new()被调用是最关键的地方。oss_new()的作用在doc\channel.txt中有说明。事实上,channel.txt中对channel的作用有更清晰的说明。回到oss_new上,oss_new分配了一个新的struct ast_channel c。这个c的exten在ast_channel_alloc()里被缺省赋值为”s”,这一点还是很重要的。然后,oss_new调用了ast_pbx_start()启动了一个PBX线程。这个线程在其生命期里负责处理这个channel的事件。这个线程是pbx.c中的__ast_pbx_run ()。在__ast_pbx_run()里,pbx线程通过ast_exists_extension()和ast_spawn_extension()确定了呼叫的业务流程。
业务流程是由dial plan确定的。Dial plan在extension.conf中配置。对于oss的dial(这是一个呼出),业务流程是如何确定的呢?
在oss.conf中,配置了这个channel的context和extension。对于channel oss ,它的context是local。对于context and extension这两个概念在asterisk handbook中有说明。有了channel oss的contest and extension,pbx线程从extension.conf中去寻找。在extension.conf中,对于oss 的context是这样配置的:
[local]
ignorepat => 9
include => default
include => parkedcalls
……

[default]
include => demo

[demo]
exten => s,1,Wait,1 ; Wait a second, just for fun
exten => s,n,Answer ; Answer the line
exten => s,n,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 seconds
exten => s,n,Set(TIMEOUT(response)=10) ; Set Response Timeout to 10 seconds
exten => s,n(restart),BackGround(demo-congrats) ; Play a congratulatory message
exten => s,n(instruct),BackGround(demo-instruct) ; Play some instructions
exten => s,n,WaitExten ; Wait for an extension to be dialed.

从这个配置上就可以看到,dial命令就对应于一个voice menu。当context为local时,执行demo这个context。Channel oss的extension缺省为”s”。因此,dial plan为先等待1秒,然后,应答它,通过BackGround应用,播放demo-congrats语音文件

分享到:
评论

相关推荐

    SIP服务器 Asterisk18.11.1软件包及其所需要的全部库源码

    包含:asterisk.18.11.1源码包,及其所需库的源码包libedit openssl jansson libuuid sqlite3,安装方法详见:https://blog.csdn.net/CSDN_DTEO/article/details/124051280 以下是文件目录: asterisk-18-current....

    最全Asterisk代码学习笔记

    Asterisk是一款开源的PBX(Private Branch Exchange)软件,它允许用户在IP网络上建立电话通信系统。作为Linux环境下的通信平台,Asterisk提供了丰富的功能,包括语音通话、会议、语音邮件、传真等。以下是一些核心...

    通过asterisk-java操作asterisk

    7. **源码分析**:对于标签中的“源码”,意味着你可能需要查看Asterisk-java的源代码来了解其工作原理或进行定制开发。通过阅读源代码,你可以理解其内部的工作流程,学习如何更好地利用API,甚至贡献代码到开源...

    Asterisk.NET 1.6.3 控制Asterisk

    文件"Asterisk.NET.1.6.3.1"可能是这个库的安装包或源码压缩文件,包含了必要的DLL文件和可能的示例代码,帮助开发者快速集成和测试Asterisk.NET的功能。在使用前,你需要将其解压,并根据项目需求引用相关的库文件...

    asterisk1.8安装参考录像

    3. **获取Asterisk源码** 访问Asterisk官方网站下载1.8版本的源码包。或者,如果你的Linux发行版有Asterisk 1.8的官方仓库,可以使用包管理器安装。例如,在Ubuntu上,`sudo apt-get install asterisk`可能已经包含...

    asterisk16版本安装包

    - **下载源码**:获取到asterisk-16.19.0的压缩包并解压。 - **配置**:运行`./configure`脚本来检查系统环境并生成Makefile。 - **编译**:执行`make`命令编译源代码。 - **安装**:使用`sudo make install`将...

    pbx.rar_asterisk_pbx spo_pbx 源码

    "pbx.rar_asterisk_pbx spo_pbx 源码" 提供的是与Asterisk PBX相关的源代码,对于理解Asterisk的工作原理、自定义功能或开发新的通信解决方案具有重要意义。 Asterisk PBX主要由以下几个关键部分组成: 1. **拨号...

    Ubuntu16.0.4环境下的Asterisk安装经验

    在安装完所有必要的依赖之后,进入Asterisk源码目录,执行以下命令来配置编译选项: ```bash cd /usr/src/asterisk-15-current ./configure ``` 如果一切正常,你会看到一些确认信息,表示配置成功。接下来,执行...

    asterisk 教程

    1. `gcc3.x`:C语言编译器,用于编译Asterisk源码。 2. `bison`:用于解析`extensions.conf`文件中的表达式,它作为`yacc`的替代品,同时也服务于Asterisk的CLI(命令行界面)。 3. `OpenSSL`:提供加密功能,对VoIP...

    asterisk-java-1.0.0-m2-sources.zip_asterisk

    标题中的“asterisk-java-1.0.0-m2-sources.zip_asterisk”表明这是一个关于Asterisk-Java的源码包,版本号为1.0.0-m2,主要用于与Asterisk的集成。 描述中提到的“java程序实现asterisk的AGI接口”,意味着这个库...

    asterisk 学习日志

    Asterisk是一个开源的IP电话系统,用于搭建VoIP服务器,提供电话呼叫、语音邮件、会议等通信功能。以下是对Asterisk学习日志中提到的一些关键知识点的详细解释: 1. **Asterisk调试与日志记录**: 在学习Asterisk...

    asterisk 安装教程

    总结,Asterisk的安装过程包括更新系统,安装依赖,下载并编译Asterisk源码,配置系统用户和权限,以及启动和管理服务。这只是一个基础安装,实际部署时可能需要根据具体需求进行更复杂的配置和优化。记住,持续学习...

    Asterisk 1.4 配置手册

    - 使用源码编译安装:适用于高级用户,可以根据需要选择模块。 - 使用预编译包安装:适用于大多数用户,方便快捷。 - 安装必备依赖库:确保所有必需的库都已安装。 3. **配置步骤**: - **SIP 配置**:设置 SIP...

    asterisk-1.8.32.3.tar.gz

    2. **解压源码**:使用`tar -zxvf asterisk-1.8.32.3.tar.gz`命令解压缩文件。 3. **配置编译**:进入解压后的目录,运行`./configure`进行配置,根据需要指定安装路径和选择特性。 4. **编译和安装**:执行`make`...

    asterisk-addons

    在描述中提到的“asterisk-addons是asterisk的一款插件安装源码”,这意味着这个压缩包 `asterisk-addons-1.6.2.3` 包含了 Asterisk-addons 版本为1.6.2.3的源代码。源代码的提供允许开发者深入理解其工作原理,进行...

    asterisk 最佳指导,第三册,涵盖asterisk1.8

    2. **获取源码包**:从官方网站下载 Asterisk 1.8 的源码包。 3. **编译与安装**:按照官方文档的步骤进行编译和安装。 4. **配置基本参数**:设置网络参数、时区、语言等基本信息。 5. **配置功能模块**:根据需求...

    Asterisk 1.6

    总之,Asterisk 1.6是构建先进电话系统的强大工具,其开放源码的特性、丰富的功能集和广泛的社区支持,使其成为企业通信解决方案的首选。无论是小型办公室还是大型企业,Asterisk都能提供高效、经济且可定制的通信...

    Asterisk安装.pdf

    ### Asterisk安装详解 #### 一、概述 Asterisk是一款功能强大的开源PBX系统,它支持多种语音通信协议,并且能够提供丰富的电话管理功能。本文档将详细介绍如何在Linux CentOS 5.0环境下安装Asterisk 1.6.1.20版本...

    Asterisk:The Futrue of Telephony

    3. **编译源码**:下载Asterisk源码并进行编译。 4. **配置参数**:编辑配置文件以适应特定的需求。 5. **测试连接**:完成安装后进行基本的通话测试。 #### 五、Asterisk与其他技术的结合 - **与VoIP的融合**:...

    centos下的Asterisk安装_1

    后续步骤包括安装编译工具、获取Asterisk源码、编译和安装、配置 Asterisk、启动服务以及进行测试。请注意,Asterisk 的安装和配置可能涉及复杂的网络设置和定制化需求,所以务必仔细阅读官方文档和社区资源以确保...

Global site tag (gtag.js) - Google Analytics