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 系统及其应用分析
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中的核心概念之一,它可以将两个或多个通信通道连接在一起,使其能够互相通话。
桥接可以在不同的通信协议之间进行,比如SIP、PSTN和VoIP等。
通过桥接功能,用户可以实现电话的转接、电话会议和多方通话等功能。
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版)
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-相关知识与应用
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是一个开源的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体系结构目录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中并没有严格的“内线”和“外线”的概念。
Asterisk 系统及其应用分析
Asterisk 系统及其应用分析
汤秀娟
北京邮电大学计算机科学与技术学院 北京(100876)
E_mail: tangxiujuan1983@
摘 要:Asterisk是由Digium公司开发的开放源码的软件PBX,它不仅支持传统的电话业务 也支持电话会议,语音信箱,收发传真等新型的业务,并且它的通用性强,可扩展性能好, 硬件成本低,因此吸引了大量的用户和开发者,有广阔的应用前景。本文系统地介绍了 Asterisk的特点,它的内部系统结构,以及系统可动态加载的API模块的功能,并且介绍了拨 号方案的语法,给出了一个拨号方案的简单例子;此外,还对Asterisk系统的初始化流程, 呼叫流程,呼入呼出场景,以及处理呼叫时的控制流程进行了详细的分析;最后,介绍了一 种基于Asterisk的VOIP解决方案。 关键词:Asterisk, VOIP, PBX 中图分类号:TP311.52 TN916.1
Asterisk向外拨号时的场景: ⑴ Dial 创建一个 outbound PBX 通道,并且要求对应的通道驱动创建一个呼叫; ⑵ 当电话被接通,asterisk 桥接媒体流,使得第一个通道的呼叫者能够与第二路通道的
被呼叫者进行通话; 有些情况下,呼入和呼出的通道使用相同的技术方案和兼容的编解码技术,这时候就会
(3) 网络系统配置更为简单,可将现有的资源,如图形用户接口(或 IM 短信)服务于 当前的需求。
(4) 通用性强,维护简单,基于 Asterisk 的软件系统易于管理和维护。 (5) 可扩展性能好,操作十分简单,而且节约时间和费用。当需要在己有的 PBX 上扩 充多个子电话时,传统的 PBX 设备不大支持这种扩充,必须换掉内部模块,这是一笔不小 的开支。但是使用 Asterisk 来充当 PBX 的内部核心软件模块,可随时更新,由软件可替代 整体的硬件更新,既节省经费又节省时间。 (6) 使用 Asterisk 来充当 IP-PBX 还有一个非常吸引人的优点是,它可以利用其 VOIP 功能用市话价格拨打长途电话,极大节省了长途通信的费用。 除了能看到的优点,在深层次的意义上 IP-PBX 系统导致了新的真正集成化的数据、语 音应用的大量出现,甚至是当前的 IPTV,从而引起了人们日常工作模式的进步以及效率的提 高。
Asterisk基础知识
• 从功能和稳定性上,两者没有区别
asterisk和digium的板卡有何关系 和 的板卡有何关系
• 开源不代表不赚钱,开源的目的就是东方 不亮西方亮,靠硬件赚钱,那就是板卡 • 很多国外的人对digium是崇拜的,所以再贵 他们也要买digium的卡 • aserisk不是必须插板卡的,但是如果有板卡, ippbx的外部接口会更丰富 • 其它一些公司的板卡也能兼容asterisk,比 如eicon,比如yate。
asterisk 能够支持传统的线路
• tdm (time division multiplexing) • t1/ e1 pri/ pra & rbs (robbed bit signal)modes analog phone lines/ phones (pots) • isdn (integrated services digital network) both bri (basic rate)and pri (primary rate) • asterisk需要的带宽,一般为:32kb/ 线路。也 就是说每支持一条线路,只需要增32kb 的带 宽,但是需要网络质量良好
asterisk能做什么 能做什么
• asterisk,英文是“星号”的意思,设计的 初衷是,任何和电话系统有关的东西,它 都能做
– 并不是所有和电话有关的功能靠asterisk实现都 是最好的
• asterisk最擅长的就是做一个ippbx,
– 当然有人用它来做voicemail服务器、ivr服务器、 会议服务器、中继网关、sip server、发卡系统 等等
安装Asterisk-1
asterisk源码解读
Asterisk是一个开源的电话系统软件,其源码包含了大量的代码和模块,解读Asterisk源码需要一定的编程和电话系统知识。
以下是一些解读Asterisk源码的建议:了解Asterisk的基本架构和模块:Asterisk是一个模块化的软件,由多个模块组成,包括应用程序、设备驱动、协议模块等。
在解读源码之前,需要了解Asterisk的基本架构和各个模块的功能和作用。
学习C语言和编程知识:Asterisk 的源码是使用C语言编写的,因此需要具备一定的C语言和编程知识,以便更好地理解源码的结构和逻辑。
阅读代码注释和文档:Asterisk的源码中包含了大量的注释和文档,这些注释和文档可以帮助理解代码的作用和实现方式。
逐个模块阅读代码:从Asterisk的入口函数开始,逐个模块阅读代码,了解每个模块的功能和实现方式。
调试和测试:在解读源码的过程中,可以通过调试和测试来验证代码的功能和正确性。
需要注意的是,Asterisk的源码非常庞大和复杂,需要花费大量的时间和精力来解读和理解。
因此,建议在解读源码之前先了解一些基本的电话系统和编程知识,以便更好地理解和掌握Asterisk的源码。
Asterisk配置文件说明
关于AsteriskAsterisk是一款实现用户电话交换机(PBX)功能的自由软件、开源软件。
Asterisk提供完善PBX 功能,可以连接多种不同的电话终端,包括普通电话机,IP电话机,软电话等,支持多种主流的IP电话协议和系统接口。
软件名称Asterisk-星号(*),在Unix(包括Linux)和DOS操作系统中是通配符,用来在查找中适配任何字符,寓意该软件广泛的适用性。
Asterisk软件提供很多以前只有昂贵的专业PBX系统才支持的功能,比如:语音信箱,会议电话,交互式语音提示和自动电话转接等。
由于该软件开放的性质,用户可以灵活的配置方便的扩展系统的功能,甚至编程开发自己所需功能的模块。
Asterisk通常都运行在Linux操作系统下,当然它也可以在其他系统,如BSD, Windows或OS X下编译并安装。
Asterisk服务器不需要任何特殊的硬件即可提供VoIP的服务,只需服务器有网络连接即可。
它支持主流VoIP协议,包括会话发起协议(SIP)、H.323,既可作为IP电话服务器也可以作IP 电话和PSTN之间的转接。
Asterisk系统还设计了一个新协议,IAX,用于在Asterisk服务器之间维护话路通道。
如果需要连接普通电话或PSTN中继线,运行Asterisk的服务器则需要安装相应的硬件接口板。
许多厂商都生产用于连接普通电话、T1、E1中继线、ISDN等的接口板。
由于是自由软件且具有丰富的系统功能,Asterisk提供给用户一个廉价并功能强大的PBX解决方案。
它被越来越多的用于代替传统专用的PBX,或被用于跨国VoIP电话以节省长途费用。
一些国家的VoIP电话公司已经开始支持Asterisk,提供IAX2接口或允许用户的Asterisk 服务器使用SIP协议连接。
截止2008年4月22日,Asterisk的最新版本是1.4.19.1版。
Asterisk功能说明及基本呼叫流程1.Asterisk内部核心:共分为6个部分A.PBX核心交换模块B.调度和IO管理模块C.应用调用模块D.编码转换模块E.动态模块加载器模块F.CDR生成模块(即时呼叫详细记录报告)2.Asterisk基本呼叫流程(1)通过Asterisk的一个电话呼叫在一个通道驱动接口上到达,如SIP通道。
asterisk介绍
当Asterisk不是一台sip 代理服务器时,可以配置Asterisk使 用其他的软件作为sip代理服务器,最常用的软件是Sip Express Router,简称SER,SER是一个开源的、可以让 Asterisk大规模部署的sip 代理服务器软件。
Asterisk不能运行在windows上
关于这一点,有一个Asterisk工作在windows上的演示CD, 结果是,Asterisk不能运行在windows平台,Asterisk要求近 乎实时的访问系统资源,也需要连接到某些特定的资源, 由于以上原因,Asterisk只能构建于一个开源的类unix操作 系统——Linux。
Asterisk 可以被配置为一个IP或混合的PBX的核心:交换呼 叫、管理路由、使能特性,以及通过 IP、模拟线路 (POTS)、以及数字(T1/E1)的联系同外部呼叫链接在 一起。
IP PBX与传统PBX相比较的优势
将电话网与计算机网统一成一个整体; 除了能为传统的电话用户提供服务外,还能方便地为Internet用户提供服务; 全新的硬件平台和高度集成的系统功能可大幅度降低成本; 实现增值服务更加方便和容易,比如建立呼叫中心、实施VoIP等; 开放的标准,互通性强; 将专用的通讯平台搬到了大众普遍较熟悉的计算机平台上,它的通用性和实用性更强; 使用、配置和维护更加简单,甚至无需专业人员; 功能更加强大且集成度高,单一系统就可以完成使用传统PBX需外配许多设备才能完成的功 能,比如自动话务台、语音信箱等等; 由于采用了计算机平台,使系统的扩容和升级更加简单和节省投资; 应用开发方便简单。
我们可以查询通话一般有多长,平均有多长,谁打的最多等等, 这种应用还有很多。通过这些信息,我们也可以找到一些不被允 许员工拨打的长途电话,Asterisk提供了这种减少这种浪费的可能, 更重要的是,这些通话记录不会被浪费掉,这些无价值的电话, 我们可以通过建立一个通话列表,当任何人拨打这些电话时,都 要求验证密码并被检查。
asterisk系统学习文档
目录ASTERISK系统主要线程 (2)系统主控线程 (2)通道主控线程 (2)维护用户状态线程 (3)交换线程 (3)两个codec之间转换时间表 (6)系统交互命令 (7)呼叫转移 (14)呼叫停泊 (14)语音邮件 (15)语音会议 (17)Asterisk主要程序模块功能简述 (18)ASTERISK系统主要线程Asterisk系统主要是独立线程方式工作的系统,主要的独立线程有:维护注册用户状态的线程-维护各个用户在存在于系统的整个过程中的各个状态 各个通道(SIP、IAX等)主控线程-解析自己通道内的请求和响应系统主控线程-完成系统的初始化启动工作,完成后等待用户的输入和用户进行交互交换线程-由各个通道来调用启动,完成两个通道的桥接和语音交换系统主控线程Asterisk系统除了主控程序外,其它功能模块都编译成共享文件*.so类型,都采用预加载或者实时加载的方式进行协调工作,默认情况下系统启动后加载所有的模块,每个模块都有一个load_module()函数,主控找到每个模块并加载,然后调用模块内部的load_module()函数,这个函数完成模块自己对应的参数配置文件(如果有配置文件)数据的加载,并对模块进行初始化工作,初始化完成后,注册自己模块的应用方法和该模块支持的交互命令(这些是一般模块加载的流程,通道模块加载除外),模块内初始化函数调用完成后,系统继续加载下一个模块,直到所有的模块加载完成,系统主控线程等待用户的输入,完成和用户的交互,系统提供很多可以和用户交互的命令,来管理、配置、查询asterisk系统。
通道主控线程完成以上普通模块加载步骤后,建立一个该通道的主监控线程,该线程在整个系统运行期间一直运行。
每个通道(SIP通道、IAX通道等)都是在系统启动的时候,被加载进系统的,每个通道都是通过独立线程方式工作的,在各自配置的端口上监听等待接收各自通道上的请求和响应,各个通道线程独立运行,每个通道维护一个事件结构,该结构中放的是该通道中需要定时调度的事件(该事件是由该通道在解析数据的过程中,如果遇到需要隔一段时间来运行的程序则写入该结构的,比如,重发事件、销毁事件、期满事件等),每个通道共同调用三个公共的函数,一个是调度等待时间函数,一个是判断IO资源是否有数据发生的函数,一个是调度该通道事件运行的函数,调度等待时间函数每次调用返回的是需要等待调度事件的最短时间,如果没有事件,则返回-1,判断IO资源函数用这个返回时间来挂起资源,判断自己的通道上的数据发生,如果有数据发生就去调用自己注册的数据处理函数去处理请求数据,判断IO资源函数返回后,调用事件运行函数,来判断是否在该时间点有事件需要调度运行,每个通道都是如此往复的调用这三个函数循环运行判断,直到系统运行结束为止。
Asterisk 代码架构概述(译)
Asterisk 代码架构概述(译)注意:这篇文档所描述的内容,可能已经过时。
为了保证您所获取的信息是最新的,请您确保您使用的文档是从Asterisk的trunk上生成的。
运行时,Asterisk加载了许多模块。
Asterisk的模块都有具体的名称,以标识模块所提供的功能,但是,这些名称没有任何技术意义上的特殊。
Asterisk 加载一个模块时,模块向内核注册它所提供的功能。
整个流程看起来是这样的:1.启动Asterisk2.Asterisk加载模块3.模块跟内核说:嗨,Asterisk,我是一个模块,我能提供X、Y、Z三种功能,用得着的时候要记得我哦。
3抽象接口类型Asterisk提供了许多不同类型的接口,具体的模块可以实现这些接口并注册给内核调用。
任何模块,都可以注册任意多种的接口。
通常,一个模块内整合了某些相关的功能。
本节讨论接口的类型,后续将讨论各种场景下不同组件间的协作关系。
3.1 编码解释器CodecInterpreter编码解释器接口的实现,提供了两种编码间的转换能力。
Asterisk当前只有音频编码转换的能力。
这些模块不了解话务相关的任何信息,也不知为什么要调用它们进行音频转换。
它们仅需要知道音频采样率、音频的输入格式、期待的输出格式这些信息。
如果注册了多个编码解释器,那么编码A转换为编码B的过程,就可能有多种不同的转换路径。
在(编码)模块加载之后,Asterisk建立一张转换表,表中包含不同translator的转换开销评估值,因此,Asterisk能够找出A转换B的最佳路径。
在源码树中,编码模块通常在codecs/目录下。
已有编码解释器的实现列表,请参考:Module:Codecs更多编码解释器API的信息,请参考接口定义文件:include/asterisk/translate.h.内核关于编码解释器的相关实现,参考源码:main/translate.c3.2文件格式处理器File Format Handler文件格式处理器接口的实现,为Asterisk提供了读写文件的能力。
asterisk拨号方案的配置
asterisk拨号方案的配置配置文件“extensions.conf”包含了Asterisk的拨号方案(dial plan)。
它的所有操作的控制和执行流程的主要方案。
它控制呼入和呼出是如何被处理和路由。
这里是你配置连接行为的地方。
"extensions.conf"的内容以“节”的形式组织。
它可以静态设置和定义,作为上下文被执行。
设置节有general 和globals 两种形式,由系统管理员完全定义。
一种特殊类型的“contexts”是macros,由用户自定义,命名前缀是“macro-”,这是可重用的模式,如同编程语言里的“过程”。
extensions.conf中每一节都由[]中的节名开始。
这使得extensions.conf具有和windows世界里传统的ini文件非常相似的结构。
Asterisk v1.2中的新东西:默认情况下,有一个新的选项“autofallthrough”被设置成了“yes”. 这个设置改变了以前的规则使得遇忙,阻塞,挂起的呼叫被立即终止。
如果你正在为IVR 写一个extension.你必须使用“WaitExten”应用程序。
[general] extentions.conf文件的顶部,配置几个设置。
[globals] 接着,在[globals]节中,你可以定义全局变量/常量,以及他们的初始值。
Contexts 和Extensions在[general]和[globals]之后,extentions.conf文件的剩余部分就是dialplan的定义了。
dialplan是由contexts的集合组成的。
每个context是由extensions的集合组成。
Extension 模式当你在context中定义extension时,你不仅使用文字数字,字母,还要匹配extension 模式。
Context包括的内容一个extension context可以嵌套另一个,参考一下下面的范例:Context "default":Extension Description101 Mark Spencer102 Wil Meadows0 OperatorContext "local":Extension Description_9NXXXXXX Local callsinclude => "default"Context "longdistance":Extension Description_91NXXNXXXXXX Long distance callsinclude => "local"这里我们定义三种extension第一种content:default 允许拨打三个电话extension: Mark, Wil, and the Operator.第二种content:local 一个扩展模式:允许拨打7位数字号码(本地呼叫),同时也包括“default”context,这样也允许用户拨打Mark,Wil,或者是操作员。
asterisk hangup机制
asterisk hangup机制Asterisk是一种开源的电话交换软件,它被广泛应用于企业和个人的电话通讯系统中。
在Asterisk中,Hangup(挂断)是一个重要的机制,它用于结束电话通话并释放系统资源。
在本文中,我们将探讨Asterisk Hangup机制的工作原理、应用场景和配置选项。
Asterisk Hangup机制的工作原理是基于两个关键组件:通道(Channel)和软交换核心(Switch Core)。
通道是Asterisk中处理单个电话连接的抽象实体。
在Asterisk 中,有多种类型的通道可以支持不同的通信协议,例如SIP、ISDN、PSTN等。
通道在电话通话的过程中起到了桥接、监控、转接等多种作用。
当一个电话通话结束时,Asterisk需要释放与该通道相关的资源,这就是Hangup机制的主要工作。
软交换核心是Asterisk中的一个核心组件,它负责协调、管理和控制电话通话过程。
当一个电话接入Asterisk系统时,软交换核心会创建一个通道,并为其分配唯一的标识符。
通过与通道相关联的标识符,软交换核心可以跟踪和控制通话的状态和行为。
当通话结束时,软交换核心会触发Hangup机制,并通知相关的组件进行释放操作。
通常情况下,Hangup机制可以在以下几种场景中发挥作用:1.用户挂断电话:当用户主动挂断电话时,Asterisk会接收到一个挂断事件,然后触发Hangup机制来释放相关资源。
这通常是最常见的挂断场景。
2.通话时间到期:在某些情况下,电话通话可能会有时长限制。
一旦达到指定的通话时长,Asterisk将会自动触发Hangup机制来结束通话并释放资源。
3.自动化任务:Asterisk还可以通过执行自动化任务来触发Hangup机制。
例如,在某个时间点,Asterisk需要自动挂断所有正在进行的电话通话,以便进行系统维护和资源释放。
在Asterisk中,可以通过配置选项来定制Hangup机制的行为。
Asterisk开源工程分析12
Asterisk开源工程分析(1.2)曾盛金2008-4-18Asterisk开源工程分析(1.2) (1)1、序言: (3)2、asterisk的架构 (3)3、启动 (5)3、1 Ulaw初始化 (5)3、2 alaw初始化 (5)3、3 Callerid初始化 (5)3.4 、64参数表初始化 (5)3.5 、Tdd初始化 (5)3.6 处理根配置文件 (6)3.7、term的初始化 (6)3.8、配置CLI命令解释器 (6)3.9、建立管理用的socket (6)3.10、载入模块 (6)3.11、通道初始化 (6)3.12、管理器初始化 (6)3.13、cdr_engine初始化 (7)3.14、device_state初始化 (7)3.15 、rtp初始化 (7)3.16、图像管理初始化 (7)3.17、pbx初始化 (7)3.18、modules的再次初始化 (7)3.19、其他初始化 (7)4、通话流程(以sip为例) (7)4.1、通话的处理流程 (8)4.2、通话中可以使用的控制台处理函数 (9)5、asterisk的核心 (9)5.1、pbx交换模块 (9)5.1、Pbx的桥接 (11)5.2、pbx桥接的数据转换问题 (11)6、Asterisk的通道管理(channel.c) (11)6、1、通道模块有:(channels目录下) (11)6、2、通道接口应该实现的接口 (12)6、2、1通道启动 (12)6、2、2开始一个电话呼叫 (13)7、拨号方案管理 (13)8、io管理(io.c) (15)9、呼叫记录管理(cdr.c) (15)10、通信用户管理(db.c) (15)11、iax管理 (15)12、日志管理 (16)13、应用管理 (16)14、媒体流管理 (16)15、媒体文件 (17)16、软件解码文件 (17)17、asterisk的下载和安装 (17)1、序言:Asterisk是开源的IP PBX,其支持模式有:ip电话与传统电话之间的数据交换、ip电话与ip电话之间的数据交换,传统电话与传统电话之间的数据交换。
基于Asterisk的VoIP开发指南—Asterisk模块编写指南
基于Asterisk的VoIP开发指南—Asterisk模块编写指南1.开源项目概述Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上。
Asterisk可以用三种协议来实现VoIP,同时可以与目前电话使用的标准硬件进行交互通信,Asterisk在实现VoIP时,不需要任何附加硬件,本文所采用的也是这种使用方式。
但是,如果企业没有与VoIP 语音网关运营商建立合作关系,想要自己构建这样的一个平台,那么要和数字电话设备与模拟电话设备进行交互通信,Asterisk需要一个PCI硬件的支持,这个硬件生产商中最著名的是Digium平台提供的。
Asterisk 的结构基本上是十分简单,但是它不同于大多数的电话产品。
基本上,Asterisk担任的是一个中间件的功能,它连接了底层的电话技术和上层的电话应用。
所以,Asterisk 具有很大的柔韧性,特殊的API接口都围绕着PBX核心系统。
这个核心处理着PBX内部之间的相互联系。
每一部分都是清晰来自于协议、编码或内部电话使用的硬件接口的抽象。
这些抽象的接口使Asterisk可以与任何的硬件和技术以及将来的硬件和软件技术完美的结合。
从图2.5可以看出,Asterisk由内部核心和外围动态可加载模块组成。
内部核心由以下六个部分组成:PBX交换核心模块(PBX Switching Core)、调度和I/O管理模块(Scheduler and I/O Manager)、应用调用模块(Application Launcher)、编解码转换模块(Codec Translator)、动态模块加载器模块(Dynamic Module Loader)和CDR生成模块(CDR Core) 。
图1 Asterisk结构图2.Asterisk二次开发概述Asterisk是一个开源的PBX架构;但它并不是一个成品。
通常情况下,由于企业应用的多样性,很难有一个成型的PBX产品可以满足企业的各种需求。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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分支处理。