Asterisk核心框架

合集下载

《Asterisk 使用资料》

《Asterisk 使用资料》

Asterisk目录及配置文件/etc/asterisk/Asterisk主目录,包含其它关于Asterisk的配置文件;*zaptel.conf这个配置文件放在/etc,因为其它软件也可以使用Zaptel这个硬件及其驱动,所以不是放在/etc/asterisk里./usr/lib/asterisk/modules/这个目录包含所有可以加载Asterisk模块(应用程序\编辑器\格式和有用通道),在Asterisk启运时会加载这些模块(可以编辑modules.conf)./var/lib/asterisk/比较重要的是astdb文件与agi-bin目录;astdb包含Asterisk当地数据库信息.sounds/所有声音提示的文件在里面,包括Asterisk原代码中的sounds.txt文件mohmp3/如果配置了音乐保持,应用程序会在这个目录下查找mp3(用CBR从文件中去除身份标签).keys/使用公钥和私钥系统认证与一个由RSA数字签名形成的一对等连接.公钥和私钥的扩展名分别为.pub和.keyfirmware/这个目录含了很多Asterisk相兼容的设备固件,它只有iax/这个子目录,其中有Digium的IAXy的二进制固件镜像.images/只有在较多的支持并且利用图解式的图像设备被发布,这个目录将会与相应的目录有更大的关联./var/lib/asterisk/agi-bin agi-bin包含所有脚本,可以通过许多已经建立的AGI应用程序与Asterisk连接./var/spool/asteriskoutgoing/gcall/tmp/voicemail/================配置文件================/etc/asterisk/asterisk.conf主要配置文件,/etc/zaptel.conf硬件接口的基本层.修改这个配置文件要用modprobe装载Linux Kernel使用模块./etc/asterisk/zapata.conf为硬件配置Asterisk的接口./etc/asterisk/extensions.conf拨号方案./etc/asterisk/sip.conf SIP协议配置文件/etc/asterisk/iax.conf呼入和呼出IAX通道/etc/asterisk/extensions.conf拨号方案配置文件/etc/asterisk/moduprobe.conf加载模块配置文件Asterisk developer\'s documentation 翻译计划by serva今天,Asterisk已经成为一个VOIP业界使用最广泛的一个集成电信级别P BX的工具,IPPBX如今已经成为VOIP商家争夺的一块重要市场,在我们越来越熟悉使用Asterisk的同时,我们希望能够越来越深入的了解asterisk,特别是对于开发人员,如果有自己特定的需求,在复杂的asterisk文件夹和asteri sk的源代码文件中迷失了方向,不知所措。

Asterisk 系统及其应用分析

Asterisk 系统及其应用分析
Asterisk 会话建立流程(收到呼入电话然后外拨,建立会话通道的全过程)如图 4 所示。
4

图4 Asterisk 会话建立流程
呼入抵达Asterisk时的场景: ⑴ 呼叫到达监听端口,被某一类通道驱动的接口感知,比如 SIP socket; ⑵ 通道驱动为其创建一个 PBX 通道并且为这个通道开启一个 PBX 线程; ⑶ 执行拨号方案; 在这个时候至少发生下面其中之一: a.Asterisk 应答这个呼叫并且播放媒体数据或者读取媒体数据,比如 IVR 业务。 b.拨号方案促使 Asterisk 通过 dial 应用(dial application)创建一个对外呼叫。 ⑷ 桥接通道(Bridging channels)。
(1) 功能多,并且易于扩展新的增值业务。通过软件来实现基于 VOIP 的 PBX 功能意味 着无需很大开支就能实现如电话会议、电话转接、语音信箱、收发传真等诸多功能。
(2) 硬件成本低,局域网的网络拓扑可满足新办公室的布线需求,无须考虑其它电话布 线。可用标准 PC 组件来设计并部署系统,比传统方式具有更大价格优势。
1
2. Asterisk 的特点

Asterisk 是一套可以运行在 Linux 上的 VOIP 软件系统。Asterisk 的主要特性是:它提 供了由垄断到开源、由电路交换到 VOIP、由单一声音通讯到多媒体、视频和数据通讯、由 数字信号进程到媒体流进程、由集中式交换到点对点交换等的 VOIP 技术实现。通过 Asterisk, 你能与上一个世纪六十年代的脉冲拨号的电话通话,也能与最新的 VOIP 设备通话。总的来 说,用 Asterisk 来实现 IP-PBX 系统有以下几个优点[1]:
除了能看到的优点在深层次的意义上ippbx系统导致了新的真正集成化的数据语音应用的大量出现甚至是当前的iptv从而引起了人们日常工作模式的进步以及效率的提asterisk系统结构系统结构系统结构系统结构31asterisk的核心功能的核心功能的核心功能的核心功能asterisk是整个软件的核心系统中所有与用户呼叫有关的功能和管理都通过它来实现

asterisk桥接原理

asterisk桥接原理

asterisk桥接原理Asterisk桥接原理Asterisk是一款开源的通信平台,可以用于创建和管理各种通信应用,如电话系统、呼叫中心和语音转接等。

在Asterisk中,桥接是一项重要的功能,它允许将多个通信通道连接在一起,实现通话的转接和协同。

桥接是Asterisk中的核心概念之一,它可以将两个或多个通信通道连接在一起,使其能够互相通话。

桥接可以在不同的通信协议之间进行,比如SIP、PSTN和VoIP等。

通过桥接功能,用户可以实现电话的转接、电话会议和多方通话等功能。

Asterisk桥接的原理是基于虚拟通道和音频流的传输。

当用户发起通话时,Asterisk会为每个通话创建一个虚拟通道,该通道负责管理通话的状态、音频流的传输和通话的控制。

当需要桥接两个通话时,Asterisk会创建一个新的虚拟通道,将两个通话的音频流连接在一起。

通过这种方式,Asterisk实现了通话的转接和协同。

在Asterisk中,桥接是通过应用程序来实现的。

用户可以使用Asterisk提供的命令和配置文件来创建和管理桥接。

在创建桥接时,用户需要指定要桥接的通话通道和音频流的参数,如通道的类型、通道的标识和音频流的编码格式等。

通过这些参数,Asterisk可以正确地将两个通话桥接在一起,并保证音频流的传输质量。

除了基本的桥接功能,Asterisk还提供了一些高级的桥接功能,如混音、静音检测和音频录制等。

通过这些功能,用户可以实现更复杂的通话应用,如电话会议和多方通话等。

用户可以根据自己的需求,选择合适的桥接功能来实现所需的通话功能。

总结起来,Asterisk桥接原理是基于虚拟通道和音频流的传输。

通过创建虚拟通道和连接音频流,Asterisk可以实现通话的转接和协同。

桥接可以在不同的通信协议之间进行,并支持多种高级功能。

通过灵活使用Asterisk的桥接功能,用户可以创建各种通话应用,满足不同的通信需求。

asterisk入门资料

asterisk入门资料

Asterisk入门资料目录1. 概述 (3)2. 什么是asterisk?开源电话平 (3)3. 为什么使用Asterisk? (3)4. 专利技术有什么错? (3)5. 我们要Asterisk做什么? (4)6. Asterisk支持什么技术? (4)7. 比较好的Asterisk参考书? (4)8. 相关: (4)9. 组件: (4)10. 有用的网页: (5)11. 重要链接: (5)12. 重要信息: (5)13. 外部交换借口/通道接口 (6)14. 拨号计划: (6)14.1. 上下文(context) : (6)14.2. 分机以如下格式定义: (7)14.3. Applications: (7)14.4. 特别分机: (8)14.5. 这个拨号计划会: (8)14.6. 为拨号计划添加逻辑: (8)15. 载入Ubuntu: (9)16. 求助: (9)17. 本章的任务: (10)18. 备注: (20)1.概述subscriber:加入某个group,从而遵从某一个call restricionsubscriber group:可以使用1种call restriction。

call restriction:将numbering plan中各项取出,各自组成成不同的呼叫限制方案numbering plan:通用,是一个整体的计划,里面包括长途,本地,等各种形式的方案————————————————————-以上,用于拨入号码的预处理,实际上是一种过滤,下面才是真正的呼叫处理。

————————————————————–route:一种策略,根据号码匹配的模式,选择走哪个trunk。

trunk:实际上做通一个链路,供route选择。

analog的,一个POTS就是一条analog trunkanalog的数量由设备定,ip trunk没有限制数量,并且一个ip trunk连到对方IPPBX后,对方的subscriber 数量是不确定的,由那个IP PBX决定。

Asterisk权威指南(原书第5版)

Asterisk权威指南(原书第5版)

23.4 Asterisk的
未来
23.5**的未 来
作者介绍
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,暂无该书作者的介绍。
读书笔记
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,可以替换为自己的心得。
精彩摘录
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,可以替换为自己的精彩内容摘录。
5.3配置Asterisk
5.4进行测试以确保 设备已经注册成功
5.5用于设备测试的 基本dialplan
5.6透过现象看本质: 第一次通话
5.7小结
6.1 dialplan语法
6.2一个简单的 dialplan
6.3构建交互式 dialplan
6.4小结
7.1中继基础
7.2用于外线连接的 基本dialplan
15.8 ACD队列的数 据库集成
15.7存储呼叫详情 记录
15.9小结
16.1 IVR的组成
16.2 IVR设计的考 虑因素
16.3 Asterisk的 IVR模块
16.4使用CURL()创 建简单的IVR
16.6语音识别和文 本语音转换
16.5录制提示音的 IVR函数
16.7小结
1
17.1呼叫文件
10.9小结
11.2驻留和寻呼
11.3高级会议 11.4小结
12.1创建一个 1
简单的ACD队 列
2
12.2队列成员
3
12.3高级队列
4 12.4队列统计:
queue_log文 件
5
12.5小结
13.2使用hint指令 的分机状态
13.1设备状态信息

Asterisk-相关知识与应用

Asterisk-相关知识与应用

DialPlan (拨号方案)
dial : 它是Asterisk 很有价值的一功能,当来电者使用不同的通信方式时,它可以进行转换并进 行呼叫连接,如SIP电话到PSTN呼叫
Contexts : 拨号方案(DialPlan)进入部分我我们称为Contexts,每个Contexts 有一些extensions(扩展)构成,来实现一系列相关服务。
举一个例子如下: [default]
在extensions.conf 配制文件中, [default]上下文是拨号方案默认的进入部分
DialPlan (拨号方案)
goto 功能是发送呼叫到拨号方案中的其它context部分.
语法: goto(context,extension,priority)
[default] exten => 123,1,Answer() exten => 123,n,Background(main-menu) exten => 1,1,Playback(digits/1)
支持一条线路,只需要增32KB 的带宽,但是需要网络 质量良好。 Asterisk可支持成千的客户端(需要板卡与带宽支持)
asterisk 安装与启动
1从官方网站下载 asterisk-1.2.26.tar包,拷备到LINUX 下的用户目录. 2 用tar xzvf asterisk-1.2.26.tar 解压到当目录. 3 进入 asterisk 目录 执行如下命令
/usr/lib/asterisk/modules/ 这个目录包含所有可以加载Asterisk模块(应用程序\ 编辑器\格式和有用 通道),在Asterisk启运时会加载这些模块(可以编辑 modules.conf).
/var/lib/asterisk 比较重要的是astdb文件与agi-bin目录;astdb包含Asterisk当地数 据库信息. sounds/ 所有声音提示的文件在里面 mohmp3/ 如果配置了音乐保持,应用程序会在这个目录下查找mp3 keys/ 使用公钥和私钥系统认证与一个由RSA数字签名形成的一对等 连接.公钥和私钥的扩展名分别为.pub和.key

Asterisk核心框架

Asterisk核心框架

Asterisk内核框架Asterisk是一个开源的pbx系统,在公开的资料中,很难找到asterisk内核系统的详细描述。

因此,很有必要写一篇内核框架的描述文档,作为内部培训文档,相互学习提高。

本文主要从三个层面来描述asterisk内核,即asterisk内核模块、内核启动过程、基本呼叫流程。

一、asterisk内核模块Asterisk由内部核心和外围动态可加载模块组成。

内部核心由以下六个部分组成:PBX交换核心模块(PBX Switching Core)、调度和I/O管理模块(Scheduler and I/O Manager)、应用调用模块(Application Launcher)、编解码转换模块(Codec Translator)、动态模块加载器模块(Dynamic Module Loader)和CDR生成模块(CDR Core)。

外围动态可加载模块包括以App_开始的Applications、以Func_开始的Functions、以Res_开始的Resources、以Chan_开始的channels、以Codec_开始的codec编解码模块等。

1.内核模块1) PBX交换核心模块(PBX Switching Core):l pbx.cpbx.c是asterisk的核心模块,每路呼叫都需要经过它调度。

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

struct ast_app是一个关键数据结构,它定义了注册builtin applications的结构。

load_pbx函数用来注册builtin applications和一些命令行CLI命令(每个模块都有些CLI 命令)。

该函数在系统启动时被调用。

pbx_exec是Answer/BackGround/Busy/Goto/GotoIf/Hangup/Set等builtin applications的执行入口函数,它被pbx_extension_helper调用。

Asterisk权威指南中文版-第02章Asterisk体系结构

Asterisk权威指南中文版-第02章Asterisk体系结构

第二章 Asterisk体系结构目录2.1 Modules (2)2.1.1 Dialplan Applications (3)2.1.2 Bridging Modules (6)2.1.3 Call Detail Recording Modules (6)2.1.4 Channel event logging modules (7)2.1.5 Channel Drivers (7)2.1.6 Codec Translators (8)2.1.7 Format Interpreters (9)2.1.8 Dialplan Functions (10)2.1.9 PBX Modules (12)2.1.10 Resource Modules (12)2.1.11 Addon Modules (14)2.1.12 Test Modules (15)2.2 文件结构 (15)2.2.1 Configuration files (15)2.2.2 Modules (15)2.2.3 The Resource Library (15)2.2.4 The Spool (16)2.2.5 Logging (16)2.3 The Dialplan (16)2.4 硬件 (16)2.5 Asterisk版本 (17)2.5.1 以前的版本号机制 (17)2.5.2 新的版本机制 (18)2.6 结论 (18)Asterisk完全不同于其他的,更加传统的PXB系统。

在Asterisk中,dialplan基本上采用完全一样的方法处理所有呼入channel。

在传统PBX中,“内线”和“外线”在逻辑上是分开的。

举例来说,你不能把一个外部网关联接到PBX的内线分机端口上,用户也无法在不按下外线数字的情况下拨打外线(例如,很多的IP PBX拨打外线要加拨“0”)。

与此相反,在Asterisk中并没有严格的“内线”和“外线”的概念。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Asterisk内核框架Asterisk是一个开源的pbx系统,在公开的资料中,很难找到asterisk 内核系统的详细描述。

因此,很有必要写一篇内核框架的描述文档,作为内部培训文档,相互学习提高。

本文主要从三个层面来描述asterisk内核,即asterisk内核模块、内核启动过程、基本呼叫流程。

一、asterisk内核模块Asterisk由内部核心和外围动态可加载模块组成。

内部核心由以下六个部分组成:PBX交换核心模块(PBX Switching Core)、调度和I/O管理模块(Scheduler and I/O Manager)、应用调用模块(Application Launcher)、编解码转换模块(Codec Translator)、动态模块加载器模块(Dynamic Module Loader)和CDR生成模块(CDR Core)。

外围动态可加载模块包括以App_开始的Applications、以Func_开始的Functions、以Res_开始的Resources、以Chan_开始的channels、以Codec_开始的codec编解码模块等。

1.内核模块1) PBX交换核心模块(PBX Switching Core):l pbx.cpbx.c是asterisk的核心模块,每路呼叫都需要经过它调度。

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

struct ast_app是一个关键数据结构,它定义了注册builtin applications的结构。

load_pbx函数用来注册builtin applications和一些命令行CLI命令(每个模块都有些CLI命令)。

该函数在系统启动时被调用。

pbx_exec是Answer/BackGround/Busy/Goto/GotoIf/Hangup/Set等builtin applications的执行入口函数,它被pbx_extension_helper调用。

ast_pbx_start函数是每路呼叫的起点。

2) 调度和I/O管理模块(Scheduler and I/O Manager):l Channel.c:Channel.c/channel.h定义了channel操作的结构体和接口函数。

struct ast_channel_tech结构体是所有channel都要用到的关键结构体,它定义channel操作的一系列回调函数指针,如call、 hangup、answer等。

每个channel模块都会定义ast_channel_tech的实体,并将各自的回调函数赋值给它。

例如 chan_sip.c中定义如下:/*! \brief Definition of this channel for PBX channel registration */static const struct ast_channel_tech sip_tech = {.type = "SIP",.description = "Session Initiation Protocol (SIP)",.capabilities = ((AST_FORMAT_MAX_AUDIO << 1) - 1), .properties = AST_CHAN_TP_WANTSJITTER |AST_CHAN_TP_CREATESJITTER,.requester = sip_request_call,.devicestate = sip_devicestate,.call = sip_call,.hangup = sip_hangup,.answer = sip_answer,.read = sip_read,.write = sip_write,.write_video = sip_write,.indicate = sip_indicate,.transfer = sip_transfer,.fixup = sip_fixup,.send_digit_begin = sip_senddigit_begin,.send_digit_end = sip_senddigit_end,.bridge = ast_rtp_bridge,.send_text = sip_sendtext,.func_channel_read = acf_channel_read,};ast_call、ast_hangup、ast_answer等函数分别实现ast_channel_tech中的call、hangup、answer等回调函数的调用。

struct ast_channel结构体定义了channel的上下文参数,它是每个参与呼叫的channel必不可少的,都会调用ast_channel_alloc来申请ast_channel。

l io.cio.c实现了asterisk跟外部交互时的I/O管理,如chan_sip为了从外部接收SIP信令,调用ast_io_add添加IO接口,并调用ast_io_wait实现外部消息接收。

3)应用调用模块(Application Launcher):在pbx.c中定义了一系列的应用调用接口。

applications模块定义了application回调函数并注册后,在pbx.c中通过应用调用接口回调执行。

应用调用接口的关键函数是pbx_extension_helper,它执行dialplan,在cli上打印“Executing ……”,并抛出ami event事件,同时调用pbx_exec执行application回调函数。

4) 编解码转换模块(Codec Translator):Translate.c:struct ast_translator:编码转换描述结构体,它定义了编码转换的名称、回调函数、运行时选项。

struct ast_trans_pvt:编码转换上下文描述结构体。

ast_register_translator:编码转换注册接口函数,供各编码模块调用,注册struct ast_translator类型的结构体变量。

ast_unregister_translator:编码转换注销函数ast_translate:编码转换的执行函数。

codec_gsm.c/codec_...:对应各种编码的编解码执行模块,如g.711alaw/g.711ulaw/gsm等。

5)动态模块加载器模块(Dynamic Module Loader):该模块主要是Module.h。

Module.h中定义了struct ast_module_info结构,用来保存各模块的注册、注销回调函数,以及模块描述信息。

load_module、unload_module,每个应用模块的注册、注销函数,由各个模块自行定义为static函数。

AST_MODULE_INFO_STANDARD:注册接口、注销接口、模块描述信息等模块信息的登记接口。

它是一个宏定义,动态模块调用它时,首先定义类型为ast_module_info的__mod_info静态结构变量,保存模块信息,并定义__attribute__ ((constructor))__reg_module和__attribute__ ((destructor))__unreg_module,在程序启动和退出时调用。

6)CDR生成模块(CDR Core):Cdr.c:ast_cdr_register:cdr driver注册,供cdr_mysql等调用,注册话单保存的回调函数。

ast_cdr_engine_init:CDR模块初始化,注册cdr status、加载cdr.conf、启动CDR线程。

ast_cdr_detach:产生话单的接口函数,呼叫结束时被调用。

2.外围可加载模块:1)Applications以app_开始的模块,如app_dial.c、app_db.c、app_queue.c、app_record.c、app_meetme.c 等,代码保存在apps目录中。

每个application模块都定义了load_module函数和unload_module函数,分别用来注册和注销application。

load_module函数调用ast_register_application函数,注册application命令,例如app_dial模块注册Dial:res =ast_register_application(app, dial_exec, synopsis, descrip)。

unload_module函数调用ast_unregister_application函数,注销application命令。

每个application模块都会使用AST_MODULE_INFO_STANDARD宏来登记模块信息__mod_info。

AST_MODULE_INFO_STANDARD 将load_module和unload_module注册为回调函数,供module load/unload/reload调用。

2)Channel以chan_开始的模块,如chan_sip.c、chan_h323.c、chan_mgcp.c 、chan_iax2.c、 chan_zap.c等,对应代码保存在channels目录中。

channel注册、注销过程和application基本类似。

由于每个channel需要和外部交互,都会在load_module中启用do_monitor线程来侦听外部tcp/udp端口,接收外部消息。

每个channel也定义了各自的cli命令和Function命令,例如chan_sip 定义了sip debug/history/no/notify/prune/ reload/set/show等cli命令和SIP_HEADER、CHECKSIPDOMAIN、SIPPEER、SIPCHANINFO等 Function命令。

3)Functions以Fun_开始的模块,例如Fun_db.c、func_moh.c、func_cdr.c等,对应代码保存在funcs目录中。

Function注册、注销过程也和application类似。

每个Function模块也定义了各自的Function命令,例如Fun_db.c就定义了DB、DB_EXISTS、DB_DELETE等Function命令。

二、asterisk启动过程主要就main函数讲解asterisk的启动过程:1int main(int argc, char *argv[])23 {45int c;67char filename[80] = "";89char hostname[MAXHOSTNAMELEN] = "";1011char tmp[80];1213char * xarg = NULL;1415int x;1617 FILE *f;1819 sigset_t sigs;2021int num;2223int isroot = 1;2425char *buf;2627char *runuser = NULL, *rungroup = NULL;2829/*保存命令行参数(argv[]->_argv[]),以便程序重启时使用*/ 3031/* Remember original args for restart */3233if (argc > sizeof(_argv) / sizeof(_argv[0]) - 1) {3435 fprintf(stderr, "Truncating argument size to %d\n", ( (sizeof(_argv) / sizeof(_argv[0])) - 1);3637 argc = sizeof(_argv) / sizeof(_argv[0]) - 1;3839 }4041for (x=0; x<argc; x++)4243 _argv[x] = argv[x];4445 _argv[x] = NULL;4647if (geteuid() != 0)4849 isroot = 0;5051/*命令如果是rasterisk,设置AST_OPT_FLAG_NO_FORK和AST_OPT_FLAG_REMOTE标志位*/5253/* if the progname is rasterisk consider it a remote console */ 5455if (argv[0] && (strstr(argv[0], "rasterisk")) != NULL) {5657 ast_set_flag(&ast_options, AST_OPT_FLAG_NO_FORK | A 5859 }6061/*得到当前主机名,在启动时打印出来*/6263if (gethostname(hostname, sizeof(hostname)-1))6465 ast_copy_string(hostname, "<Unknown>", sizeof(hostname));6667/*获取当前的进程标识*/6869 ast_mainpid = getpid();7071/*建立mu-law和a-law转换表*/7273 ast_ulaw_init();7475 ast_alaw_init();7677/*为FFT逆变换(傅立叶逆变换)做一些初始化,用于在zaptel里进行callerid的DTMF检测*/7879 callerid_init();8081/*初始化内置命令的_full_cmd字符串,并注册常用命令,ast_builtins_init() -> ast_cli_register_multiple() -> ast_cli_register() -> __ast_cli_register() */8283 ast_builtins_init();8485/*初始化base64转换*/8687 ast_utils_init();8889/* tty/tdd初始化*/9091 tdd_init();9293/*设置用户历史命令的保存路径*/9495if (getenv("HOME"))9697 snprintf(filename, sizeof(filename), "%s/.asterisk_history 9899/* Check for options */100101/*检查命令行的输入参数,匹配参数范围是“mtThfFdvVqprRgciInx:U:G:C:L:M:”,不同的参数输入走到不同的case分支处理。

相关文档
最新文档