`
sun4love
  • 浏览: 230604 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入浅出asterisk(五):pbx.c代码分析

    博客分类:
  • VOIP
阅读更多

pbx.c主要实现了builtin applications,也就是内置的应用,比如最常见的Answer,Hangup, Background,Wait等等。

/main/asterisk.c中有一段代码调用load_pbx()负责加载builtin applications

02895    if (load_pbx()) {
02896       printf(term_quit());
02897       exit(1);
02898    }

这个load_pbx()函数就是实现在pbx.c中,它的主要任务是遍历全局数组builtins中每个application信息,调用ast_register_application()注册application的各自入口函数。

06046    /* Register builtin applications */
06047    for (x=0; x<sizeof(builtins) / sizeof(struct pbx_builtin); x++) {
06048       if (option_verbose)
06049          ast_verbose( VERBOSE_PREFIX_1 "[%s]\n", builtins[x].name);
06050       if (ast_register_application(builtins[x].name, builtins[x].execute, builtins[x].synopsis, builtins[x].description)) {
06051          ast_log(LOG_ERROR, "Unable to register builtin application '%s'\n", builtins[x].name);
06052          return -1;
06053       }
06054    }

比如Hangup应用的入口函数就是pbx_builtin_hangup()

00364    { "Hangup", pbx_builtin_hangup,
00365    "Hang up the calling channel",
00366    "  Hangup([causecode]): This application will hang up the calling channel.\n"
00367    "If a causecode is given the channel's hangup cause will be set to the given\n"
00368    "value.\n"
00369    },

 

 

下面我们分析一下pbx_builtin_hangup()函数,这个函数查看参数data调用ast_str2cause()获取挂断码,如果没有获取到,则设置chan->hangupcause

AST_CAUSE_NORMAL_CLEARING,也就是0

05448 /*!
05449  * \ingroup applications
05450  */
05451 static int pbx_builtin_hangup(struct ast_channel *chan, void *data)
05452 {
05453    if (!ast_strlen_zero(data)) {
05454       int cause;
05455       char *endptr;
05456 
05457       if ((cause = ast_str2cause(data)) > -1) {
05458          chan->hangupcause = cause;
05459          return -1;
05460       }
05461       
05462       cause = strtol((const char *) data, &endptr, 10);
05463       if (cause != 0 || (data != endptr)) {
05464          chan->hangupcause = cause;
05465          return -1;
05466       }
05467          
05468       ast_log(LOG_NOTICE, "Invalid cause given to Hangup(): \"%s\"\n", (char *) data);
05469    }
05470 
05471    if (!chan->hangupcause) {
05472       chan->hangupcause = AST_CAUSE_NORMAL_CLEARING;
05473    }
05474 
05475    return -1;
05476 }

看看pbx_exec()函数,这个函数是所有application被调用的入口处。它首先保存channel的两个变量,appldata,分别表示正在调用的application名和参数。然后调用app->execute(c, data)进入真正的处理,完后恢复appldata的值,有点像堆栈的管理

00507 /*
00508    \note This function is special. It saves the stack so that no matter
00509    how many times it is called, it returns to the same place */
00510 int pbx_exec(struct ast_channel *c,       /*!< Channel */
00511         struct ast_app *app,     /*!< Application */
00512         void *data)        /*!< Data for execution */
00513 {
00514    int res;
00515 
00516    const char *saved_c_appl;
00517    const char *saved_c_data;
00518 
00519    if (c->cdr &&  !ast_check_hangup(c))
00520       ast_cdr_setapp(c->cdr, app->name, data);
00521 
00522    /* save channel values */
00523    saved_c_appl= c->appl;
00524    saved_c_data= c->data;
00525 
00526    c->appl = app->name;
00527    c->data = data;
00528    /* XXX remember what to to when we have linked apps to modules */
00529    if (app->module) {
00530       /* XXX LOCAL_USER_ADD(app->module) */
00531    }
00532    res = app->execute(c, data);
00533    if (app->module) {
00534       /* XXX LOCAL_USER_REMOVE(app->module) */
00535    }
00536    /* restore channel values */
00537    c->appl = saved_c_appl;
00538    c->data = saved_c_data;
00539    return res;
00540 }
 

分享到:
评论

相关推荐

    pbx.rar_asterisk_pbx spo_pbx 源码

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

    最全Asterisk代码学习笔记

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

    asterisk-1.8.32.3.tar.gz

    标题中的"asterisk-1.8.32.3.tar.gz"是指Asterisk的一个特定版本——1.8.32.3,这是一个源代码压缩包,适用于Linux操作系统。通过下载此资源并进行编译安装,用户可以在自己的服务器上搭建功能丰富的电话系统。 ...

    asterisk-1.8.8.0.tar.gz

    Asterisk是一款开源的IP电话系统软件,广泛用于构建VoIP网络基础设施,如PBX(Private Branch Exchange)、软交换和VoIP网关。这个压缩包"Asterisk-1.8.8.0.tar.gz"包含了Asterisk 1.8.8.0版本的源代码,供开发者和...

    深入浅出asterisk代码

    asterisk 代码分析, sip_chan

    Asterisk.NET.1.6.3.1.zip

    总结起来,Asterisk.NET 1.6.3.1是.NET开发者构建VoIP应用的强大工具,它简化了与Asterisk PBX的交互,并提供了丰富的功能集,使得开发者能够快速构建出功能丰富的通信解决方案。通过深入学习和实践,开发者可以掌握...

    asterisk-11.0.1.tar.gz

    Asterisk是一款开源的IP电话系统,用于构建VoIP(Voice over ...学习和掌握Asterisk涉及到深入理解VoIP技术、网络协议以及编程接口。通过不断实践和学习,你可以创建出功能丰富的通信解决方案,适应各种业务场景。

    ASTERISK 14 g729.so g723.so编码 直接可用

    ASTERISK 14是 Asterisk VoIP 电话系统的第14个主要版本,这是一个开源的IP电话系统,广泛用于构建PBX(Private Branch Exchange)系统。Asterisk提供了丰富的功能,包括语音通话、会议、语音邮件等,并支持多种编码...

    asterisk-1.8.10.1.tar.gz

    通过这种格式,我们可以将Asterisk源代码及其相关文件打包成一个易于管理和传输的单一文件。在解压后,我们得到的将是名为“asterisk-1.8.10.1”的完整目录结构,包含了编译和运行Asterisk所需的所有文件。 ...

    Asterisk 代码学习笔记,深入浅出asterisk,asterisk通道,呼叫情景(call scenario)

    本文将深入剖析Asterisk的核心概念,包括通道(Channel)、呼叫情景(Call Scenario)、桥接通道(Bridging Channels)以及植入通道(Masquerading Channels),并通过具体代码实例来解释这些概念的应用。...

    Asterisk系统的安装与配置

    Asterisk系统的安装与配置 Asterisk是开源的通讯服务器软件,提供了丰富的通讯功能,包括语音、视频、即时消息等。下面是Asterisk系统的安装与配置指南。 一、安装DAHDI DAHDI是Asterisk管理硬件的插件(中间件)...

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

    包含:asterisk.18.11.1源码...asterisk-18-current.tar.gz libedit_3.1-20210910.orig.tar.gz openssl-1.1.1.tar.gz jansson-2.11.tar.gz sqlite-autoconf-3380200.tar.gz pjproject-2.10.tar.gz libuuid-1.0.3.tar.gz

    使用Asterisk作为SIP.2 H.323网关配置

    Asterisk是一个开源的PBX(Private Branch Exchange)系统,允许您创建一个功能强大的电话交换系统。安装Asterisk非常简单,只需下载相应的安装包并按照指令進行安装。 下载并编译OH323.SO模块 下一步,我们需要...

    asterisk安装与配置.pdf

    Asterisk 是一个开源的、基于 Unix 的PBX 电话系统,具有强大的呼叫处理能力和灵活的配置能力。本文档将指导您安装和配置 Asterisk,以便您快速上手使用这个强大的通信系统。 安装所需套件 在安装 Asterisk 之前,...

    asterisk 教程

    Asterisk是一款开源的IP电话系统,用于搭建VoIP服务器,支持多种通信协议,如SIP、IAX等。...不过,Asterisk的功能非常丰富,涉及PBX、IVR、会议、录音等多个方面,深入学习和配置需要更多实践和研究。

    Asterisk Build Your Own PBX

    本文将深入探讨如何利用开源软件Asterisk和一些可能已经拥有的硬件来构建一个功能齐全、成本低廉的PBX系统。 #### 一、什么是PBX? PBX是一种内部电话网络,可以连接到公共电话网络,并允许组织内的电话进行内部...

    asterisk:Alpine Linux上的Docker中的Asterisk PBX。 最小的星号! ;)

    带有Asterisk PBX的最小Docker镜像 该映像基于Alpine Linux映像,该映像仅为5MB映像,并且包含 。 该图像的latest标签(基于Alpine linux)的总大小为: 对于debian-stretch-slim-15-current 。 自定义UID / GID ...

    Asterisk 系统的g.729, g.723编解码模块安装指南

    Asterisk是一个开源的IP电话系统,用于构建VoIP网络基础设施。它支持多种编解码技术,其中G.729和G.723是两种常用的语音编码标准,尤其适用于压缩语音数据以减少带宽需求。在Asterisk系统中安装这两个编解码模块,...

    asterisk-16.0.0.jar

    asterisk-16.0.0.jar 呼叫中心的jar包 基于asteriter

    asterisk-1.6.2.6-2来电显示的bug修复以及asterisk-1.6.2.6-2 rpm重新打包

    修复这个bug通常包括对源代码进行分析,找出导致来电显示问题的代码段,然后通过补丁(如 `chan_dahdi.c.patch`)来修改或优化这部分代码。`chan_dahdi.c.patch` 文件很可能就是用于修复这个问题的源代码补丁,它...

Global site tag (gtag.js) - Google Analytics