asterisk学习笔记


Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 1 页 作者 Manager 评审人员 / / / / / / / / / / / 审核人员 / 批准 / Asterisk 学习笔记 文件编号: 20161203-V1.0 当前版本: V1.0 页数: 23 页 发布日期: 2016-12-03 文件状态:初版 评审通过 正式发布 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 2 页 修订详细记录 版本 修订内容详述 编制/修订人 批准人 修订日期 V1.0 新建 20161203 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 3 页 目录 目录 ............................................................................................................................................................ 3 第 1 章 Asterisk 简介 ............................................................................................................................... 5 1.1 Asterisk 简介 .......................................................................................................................... 5 1.2 Centos 系统............................................................................................................................. 5 1.3 VOIP 协议 .............................................................................................................................. 6 1.4 FreeSwitch .............................................................................................................................. 6 1.5 FreePBX .................................................................................................................................. 6 1.6 IPPBX ..................................................................................................................................... 6 1.7 相关产品 ................................................................................................................................. 7 第 2 章 B2BUA ......................................................................................................................................... 8 2.1 B2BUA 简介........................................................................................................................... 8 2.2 SIP 呼叫 .................................................................................................................................. 8 2.2.1 SIP 简介 ...................................................................................................................... 8 2.2.2 请求和响应消息 ......................................................................................................... 8 2.2.3 会话构成 ..................................................................................................................... 9 2.2.4 SIP 呼叫建立 .............................................................................................................. 9 第 3 章 Asterisk 体系架构 ..................................................................................................................... 12 3.1 模块 ....................................................................................................................................... 12 3.1.1 应用程序 ................................................................................................................... 12 3.1.2 桥接模块 ................................................................................................................... 12 3.1.3 电话详单记录模块 ................................................................................................... 12 3.1.4 信道事件日志模块 ................................................................................................... 12 3.1.5 信道驱动 ................................................................................................................... 13 3.1.6 编码解码器 ............................................................................................................... 13 3.1.7 格式转换器 ............................................................................................................... 13 3.1.8 拨号计划函数 ........................................................................................................... 13 3.1.9 PBX 模块 .................................................................................................................. 13 3.1.10 资源模块 ................................................................................................................... 13 3.1.11 附加模块 ................................................................................................................... 13 3.1.12 测试模块 ................................................................................................................... 14 3.2 文件结构 ............................................................................................................................... 14 3.2.1 配置文件 ................................................................................................................... 14 3.2.2 模块 ........................................................................................................................... 14 3.2.3 资源库 ....................................................................................................................... 14 3.2.4 Spool ......................................................................................................................... 14 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 4 页 3.2.5 Logging ..................................................................................................................... 15 3.2.6 Dailplan ..................................................................................................................... 15 3.3 结论 ....................................................................................................................................... 15 第 4 章 Asterisk 核心框架 ..................................................................................................................... 16 4.1 asterisk 内核模块 ................................................................................................................. 16 4.1.1 PBX 交换核心模块(PBX Switching Core) .............................................................. 16 4.1.2 调度和 I/O 管理模块(Scheduler and I/O Manager) ................................................. 16 4.1.3 应用调用模块(Application Launcher) ..................................................................... 17 4.1.4 编解码转换模块(Codec Translator) ......................................................................... 17 4.1.5 动态模块加载器模块(Dynamic Module Loader) .................................................... 18 4.1.6 CDR 生成模块(CDR Core) ...................................................................................... 18 4.2 外围可加载模块 ................................................................................................................... 18 4.2.1 Applications .............................................................................................................. 18 4.2.2 Channel ..................................................................................................................... 18 4.2.3 Functions ................................................................................................................... 19 第 5 章 Asterisk 基本呼叫流程 ............................................................................................................. 20 5.1 Asterisk 呼叫流程 ................................................................................................................ 20 5.2 呼入 ....................................................................................................................................... 22 5.3 呼出 ....................................................................................................................................... 22 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 5 页 第1章 Asterisk 简介 1.1 Asterisk 简介 Asterisk 是将普通的计算机变为语音通信服务器的软件。例如会议服务器等功能。它被 广泛用于呼叫中心、会议系统等产品,服务器与企业,部门,政府机关单位。Asterisk 是自 由和开源的。 Asterisk 是当今最流行的开源电话项目。下图是一般呼叫中心信息交换流程图。 其中 Asterisk 软件为 web 服务器提供了本地语言服务接口。Web 服务器则实现了用户访问及 语音转发。 最近开发 Asterisk 的公司 Digium 现在也开始推出自己的类似产品—AsteriskNOW, AsteriskNOW 是一根定制的 linux 发行软件工具,它包含了 AsteriskGUI 以及 Asterisk 系统所需要 的所有其他软件。作为世界上先进的开源电话引擎及工具集,Asterisk 现在可以很容易用图形界 面来配置。AsteriskNOW 包含了所有的 linux 组件以运行、调试、构建 Asterisk。从 1.5 版本起 AsteriskNOW 基于 Centos 系统。 1.2 Centos 系统 Centos 是 linux 系统的一个发行版,也就是 linux 系统中的一个版本而已。它是基于 linux 红 帽版本制作的,红帽版因为是商业版,所以很多东西是要钱的,但是 centos 全完免费。主要用作 服务器的搭建。 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 6 页 1.3 VOIP 协议 Voip 是指在网络上使用 IP 协议以数据包的方式传输语音,即网络电话。通过对语音信号的 模数转换、压缩编码和打包分组,以 Internet 作为传输媒介,从而实现语音通信业务。 Voip 的数据处理流程: 1.4 FreeSwitch FreeSwitch 和 Astersik 是兄弟,也是一种电话的软交换解决方案,包括一个软电话和软交换 机用以提供语音和聊天的产品驱动。freeSwitch 可以用作交换机引擎、PBX、多媒体网关以及多 媒体服务器等。 目前 FreeSwitch 版本为 2012 年 08 月 09 日,官方发布 FreeSWITCH 1.2 正式版。 FreeSwitch 是一个跨平台的开源电话交换平台,具有很强的伸缩性,旨在为音频、视频、文字或其他 的媒体,提供路由和互联通信协议。 FreeSwitch 是一个开源的电源交换平台,从一个简单的软电话客户端到运营商及的软交换设备 1.5 FreePBX FreePBX 是一个强大的 GUI 配置 Asterisk 工具(就是一个提供可以通过网页去配置 Asterisk 服务器工具)。它提供标准传统电话系统能够做的任何事情,加入大量的新功能。 1.6 IPPBX 首先先了解一下 PBX。 PBX 是一种专用电话呼叫系统,是公司/集团内部电话系统,能只能在一个“局域网内部”进 行呼叫。 IPPBX 则是一种基于 IP 的电话系统,可以完全将语音通信集成到公司的数据网络中,从而建 立能够连接分布在全球各地办公地点和员工的统一语音和数据网络。 IPPBX 网络系统内个电话中断采用 IP 方式进行数据通信,不经能进行通话,还能实现文本,, 数据,图像的传输,将电话网和 Internet 网统一成一个整体,实现局域网类的电子办公。特别是 在远距离协作商务、电子版本中将会充分发挥其强大的资源优势,而商业合作,工作重组带来便 捷。 IP PBX 局域网内的控制中心可根据局内外的具体情况,对计算机网络、电话网络进行有效地 管理,达到资源共享。不同地区的 IP PBX 网间借助 Internet 网,可实现远距离通信、电子办公和 电子商务。 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 7 页 1.7 FXS 和 FXO 物理接口。 1.8 相关产品 Asteriks 相关产品在市面上比较多,大体分为两类。  呼叫中心 呼叫中心相对来说是 Asterisk 的简单应用,这类产品逻辑也非常清晰。比如 10086 呼叫 中心。  会议系统 会议系统相较呼叫中心,是 Asteriks 应用非常复杂的,不但融合了呼叫中心的部分功能 (比如呼叫,呼叫转移),而且需要处理多组呼叫,群呼叫等复杂功能。甚至处理视频。 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 8 页 第2章 B2BUA 2.1 B2BUA 简介 B2BUA(Back-to-Back-User-Agent,背靠背用户代理)是通讯网络中,使用 SIP 实现绘画的一种 逻辑实体。B2BUA 作为 SIP 呼叫两端的用户代理,负责处理呼叫两端的所有 SIP 信令,从呼叫确 立到终止全过程跟踪每个呼叫。 允许 B2BUA 的操作者来提供值附加特征到这个呼叫。对 SIP 用户,B2BUA 在一边担当用户 代理服务器(UAS),在另一边(背靠背)担当用户代理客户端(UAC)。 Asterisk 是一个 B2BUA 代理,相当于一个中间代理人。比如:A 用户和 B 用户同时注册到 Asterisk 上,当 A 用户呼叫 B 用户,这时 A 用户其实是向 Asterisk 发起呼叫,被叫号码是 B 用户, 当 Asterisk 收到 A 用户的呼叫请求后,查询 B 用户的注册信息,然后 Asterisk 自己冒充 A 用户的 身份向 B 用户发起呼叫,当 B 用户接通,Asterisk 就会将两条通话桥接,区别在于 A 用户到 Asterisk 是呼入,Asterisk 到 B 用户是呼出。 2.2 SIP 呼叫 2.2.1 SIP 简介 SIP(Session initial Protocol,会话初始协议)是有 IETF(Internet Engineering Task Force,英 特网工程任务组)制定的多媒体通信协议。它是基于文本的应用层协议,用户创建、修改和释放 一个或多个参与者的会话。广泛应用于 NGN(Next Generation Network,下一代网络)以及 IMS (IP Multimedia Subsystem,ip 多媒体子协议)的网络中,可以支持用户语音、视屏、数据等多媒 体业务,同时也可以应用于 Presence(呈现),InstantMessage(即时消息)等特色业务。可以说, 有 ip 网络的地方就有 SIP 协议的存在。 Sip 协议类似于 HTTP。SIP 可以减少应用特别是高级应用的开发时间。由于基于 IP 协议的 SIP 利用了 IP 网络,固定网络运营商也会渐渐认识到 SIP 技术对于他们的深远意思。 会话的参与者可以通过组播,网状单播进行通信。 2.2.2 请求和响应消息 SIP 协议是一个 Client/Server 协议,因此 SIP 信息分为两种:请求信息和应答消息。请求信息 是 SIP 客户端为了激活特定操作而发给服务器端的消息。 1、 常用的 SIP 请求信息如下  INVITE:表示主叫用户发起会话请求,邀请其他用户加入一个会话。也可以用在呼叫建 立后用户更新会话(Re-invite)。  ACK:客户端向服务器端证实一收到了对 INVITE 请求的最终响应。  PRACK:表示对 xx 响应消息的确认请求消息。  BYE:表示终止一个已经建立的呼叫。  CANCEL: 表示在收到对请求的最终响应之前取消该请求,对于已完成的请求则无影响。  REGISTER:表示客户端向 SIP 服务器端注册在 TO 字段中的地址信息。  OPTIONS:表示查询被叫的相关信息和功能。 Asterisk 学习笔记 内部公开 知 识 产 权 属 私 人 所有 第 9 页 SIP 协议中的响应信息用于对请求信息进行响应,指示呼叫的成功或失败状态。 2、 常用的一些响应消息:  100 试呼叫(Trying)  180 振铃(Ringing)  181 呼叫正在前转(Call is Being Forwarded)  200 成功响应(OK)  302 临时迁移(Moved Temporarily)  400 错误请求(Bad Request)  401 未授权(Unauthorized)  403 禁止(Forbidden)  404 用户不存在(Not Found)  408 请求超时(Request Timeout)  480 暂时无人接听(Temporarily Unavailable)  486 线路忙(Busy Here)  504 服务器超时(Server Time-out)  600 全忙(Busy Everywhere) 2.2.3 会话构成 SIP 会话使用多达四个主要组件:SIP 用户代理、SIP 注册服务器、SIP 代理服务器和 SIP 重 定向服务器。这些系统主要传输包括了 SDP 协议的消息完成 SIP 会话。下面概括性介绍各个 SIP 逐渐以及其他过程中的作用。  用户代理 SIP 用户代理(UA)是终端用户设备,即用户。如用户创建和管理 SIP 会话的移动电话、 多媒体手持设备、PC、PAD 等。用户代理客户机发出消息。用户代理服务器对信息进行 响应。  注册服务器 SIP 注册服务器是包含域中所有用户代理的位置的数据库。在 SIP 通信中,这些服务器 会检索出对方的 IP 地址和其他关系信息,并将其他送到 SIP 代理服务器。  代理服务器 SIP 代理服务器接收 SIP UA 的会话请求并查询 SIP 注册服务器,获取收件方 UA 的地址 信息。然后他讲会话邀请信息直接转发给收件方 UA 或代理服务器。  重定向服务器 SIP 重定向服务器允许 SIP 代理服务器将 SIP 会话邀请信息定向到外部域。SIP 重定向服 务器可以与 SIP 注册服务器和 SIP 代理服务器同在一个硬件上。 2.2.4 SIP 呼叫建立 SIP 通过以下逻辑功能来完成通信: Asterisk 学习笔记 内部公开 知识产权属私人所有 第 10 页  用户定位功能:确定参与通信的终端用户 ip 位置。  用户通信能力协商功能:确定参与通信的终端类型和具体参数。  用户是否参与互叫功能:确定某个终端是否加入某个特定的会话中。  建立呼叫和控制呼叫功能:包括向主叫被被叫的呼叫参数、呼叫重定向、呼叫转移、终 止呼叫等。 2.2.4.1 同一域中建立 SIP 会话: 下图说明了在同一个 ISP(Internet Service Provider 互联网服务器提供商),从而使用同一域 的两个用户之间建立 SIP 会话的过程。用户 A 使用 SIP 电话。用户 B 有一台 PC,运行支持语音 和视频的软客户端程序。上电后,两个用户都在 ISP 网络中的 SIP 代理服务器上注册了他们的空 闲情况和 IP 地址。用户 A 发起呼叫,告诉 SIP 代理服务器要联系用户 B。然后,SIP 代理服务 器向 SIP 注册服务器发出请求,要求提供用户 B 的 IP 地址,并收到用户 B 的 IP 地址。SIP 代理服务器转发用户 A 与用户 B 进行通信的邀请信息(使用 SDP),包括用户 A 要使用的媒 体。用户 B 通知 SIP 代理服务器可以接受用户 A 的邀请,且已做好接收消息的准备。SIP 代 理服务器将此消息传达给用户 A,从而建立 SIP 会话。然后,用户创建一个点到点 RTP 连接, 实现用户间的交互通信。 主叫用户A 被叫用户B SIP电话 SIP软客 户机 SIP代理 服务器 SIP注册 服务器 1 2 4 5 6 37 1、 呼叫用户 B 2、 查询用户 B 的 IP 3、 响应用户 B 的 IP 地址 4、 呼叫 5、 响应 6、 响应 7、 多媒体通道已建立 2.2.4.2 不同的域中建立 SIP 会话 本情景与第一种情景的不同之处如下。用户 A 邀请正在使用多媒体手持设备的用户 B 进行 SIP 会话时,域 A 中的 SIP 代理服务器辨别出用户 B 不在同一域中。然后,SIP 代理服务器 在 SIP 重定向服务器上查询用户 B 的 IP 地址。SIP 重定向服务器既可在域 A 中,也可在域 B 中,也可既在域 A 中又在域 B 中。SIP 重定向服务器将用户 B 的联系信息反馈给 SIP 代 理服务器,该服务器再将 SIP 会话邀请信息转发给域 B 中的 SIP 代理服务器。域 B 中的 SIP 代理服务器将用户 A 的邀请信息发送给用户 B。用户 B 再沿邀请信息经由的同一路径转发接受 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 11 页 邀请的信息。 SIP电话 SIP软客户机 域A SIP代 理服务器 域A SIP注 册服务器 用户A “主叫” SIP电话 移动多媒体设备 用户B “被叫” 域B SIP代 理服务器 域B SIP注 册服务器 SIP重定向 服务器 SIP用户 代理 SIP用户 代理 1 2 3 4 56 7 8 9 10 域A 域B 1、 呼叫用户 B 2、 询问 B 中的用户 3、 响应 4、 呼叫域 B 中的 SIP 代理 5、 查询用户 B 在哪里 6、 响应用户 B 的地址 7、 代理呼叫用户 B 8、 响应 9、 响应 10、 响应 11、 多媒体通信已建立 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 12 页 第3章 Asterisk 体系架构 3.1 模块 Astreisk 是基于模块创建的。一个模块提供特定的功能,是一个可装卸的组件,比如信 道驱动(chan_sip.so)。 Asterisk 按照/etc/asterisk/modules.cof 配置文件装载模块。你只有理解 了 Asterisk 模块化的特点,才能充分理解 Asterisk 的架构。 Asterisk 模块类型包括:  应用程序  桥接模块  呼叫详单记录模块  信道事件日志模块  信道驱动  编码解码器  格式解析器  拨号计划函数  PBX 模块  资源模块  附加模块  测试模块 3.1.1 应用程序 应用程序用于拨号计划中,能够处理呼叫流程。比如 Dial()就是一个很重要的程序,辅助与 外部资源建立联接。 这部分代码可以在 Asterisk 源码 apps 文件中查看。 3.1.2 桥接模块 桥接模块是 Asterisk1.8 的新功能;他们一新的方式直线信道之间的桥接。他们每一个都提供 了不通的特性,用于不通的桥接需求。 这部分代码可以在 Asterisk 源码 bridges 文件中查看。 3.1.3 电话详单记录模块 CDR 模块是为了让各种形式的话单记录更方便。你可以把 CDR 存入文件,数据库,或 syslog、 Web 接口中会有一些和 CDR 相关的报告功能。 这部分代码可以在 Asterisk 源码 cdr 文件中查看。 3.1.4 信道事件日志模块 信道事件日志可以完整记录所有的呼叫活动。这也意味着你需要更小心地规划拨号计划,毕 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 13 页 竟它不可能自动开始工作。 这部分代码可以在 Asterisk 源码 cel 文件中查看。 3.1.5 信道驱动 没有信道驱动,Asterisk 就不可能建立呼叫。每种协议或信道类型都有自己特定的信道驱动。 信道模块可以看做是通往 Asterisk 内核的网管。 这部分代码可以在 Asterisk 源码 channels 文件中查看。 3.1.6 编码解码器 编码解码器允许 Asterisk 转换不同呼叫之间的音频格式。如果一个呼叫来自 PRI 电路(使用 G.711 编码),需要连接到一个 SIP 压缩信道(使用 G.729,SIP 支持的编码之一),那么相应的编 码解码器就会执行所需的转换。 注:如果编码解码需要复杂的算法,大量的转码工作会对 CPU 造成负担。有些像 Sangoma 和 Digium 厂商的卡会提供硬件解码编码。 这部分代码可以在 Asterisk 源码 codecs 文件中查看。 3.1.7 格式转换器 格式解释器调用编码解码器的功能,但他们操作文件而不是信道。如果你录制了一段 GSM 音频,要播放到其他非 GSM 信道,就需要一个格式解释器。 如果你录制成了多种格式(GSM,WAV),当某个信道需要该音频时,Asterisk 会选择一个转 换代价最小的格式。 这部分代码可以在 Asterisk 源码 formats 文件中查看。 3.1.8 拨号计划函数 拨号计划函数是对拨号计划应用程序的补充,提供了一些有用的增强功能,比如字符串处理、 日期时间转换、ODBC 连接性等。 这部分代码可以在 Asterisk 源码 funcs 文件中查看。 3.1.9 PBX 模块 PBX 模块提供增强的控制和配置机制。 这部分代码可以在 Asterisk 源码 pbx 文件中查看。 3.1.10 资源模块 资源模块用于集成外部资源。例如 res_odbc 用于访问 ODBC 数据库连接。 这部分代码可以在 Asterisk 源码 res 文件中查看。 3.1.11 附加模块 附加模块是社区开发的模块,用法和版权条款都和 Asterisk 的主代码不一样。它们位于不同 的目录,缺省是不会编译和安装的。要启用这些模块就要使用 menuselect 构建配置工具。 这部分代码可以在 Asterisk 源码 addons 文件中查看。 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 14 页 3.1.12 测试模块 测试模块被 Asterisk 开发团队用来验证新代码。它们会被频繁地添加或修改,对你没什么用, 除非你要开发 Asterisk。 如果你是 Asterisk 开发者,你也许会对 Asterisk 测试套件有兴趣,你可以执行自动测试并将 结果反馈给 Asteisk 项目。通过不断地添加测试用例,Asterisk 可以防止代码腐烂。通过添加你自 己的测试用例,升级的时候会更有把握些。 3.2 文件结构 Asterisk 是一个复杂的系统,由很多资源组成。这些资源以不同的方式使用文件系统。既然 Linux 在这一点上很灵活,那就有必要搞清楚什么数据存放子啊什么地方。 3.2.1 配置文件 Asterisk 配置文件包含 extensions.conf,sip.conf,modules.conf,以及各种信道,资源,模块 和函数用到的参数定义文件。这些文件一般位于/etc/asterisk,在做 Asterisk 的配置和管理管理工 作是你经常进到这个目录。 /etc/asterisk/asterisk.conf 主要配置文件, /etc/zaptel.conf 硬件接口的基本层. /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 加载模块配置文件 3.2.2 模块 Asterisk 的模块一般会安装到/usr/lib/asterisk/moules 目录。你一般不用关心这个目录;但你知 道模块在什么地方。举例来说,如果你升级了 Asterisk 并且在做 menuselect 时选择了不同的 modules,那么从前一个版本集成下来的旧的 modules 需要被删除,负责你会在安装新版本时看到 一个警告信息。删除这些就得文件就需要从 modules 文件下删除。你可以选择手工删除,或者通 过“uninstall”( make uninstall)。 3.2.3 资源库 有些资源需要外部的数据源。例如等待音乐(MOH)就需要音乐文件才能播放。系统的语言 提示也需要存储在硬盘的某个地方。/var/lib/asterisk 就是存放系统语言提示、AGI 脚本、等待音乐 (MOH)和其他资源的文件。 3.2.4 Spool Spool是linux用于存储频繁修改的,或者稍后需要其他处理器处理的文件的地方。例如在linux 系统下,打印作业或待处理的邮件一般是存储的 spool 中,直到它们被处理。 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 15 页 对 Asterisk 来说,spool 被用来存储临时项目,诸如语言留言(voice messages), 呼叫记录(call recording),呼叫文件(call file)等。 Asterisk spool 位于/var/spool/asterisk 目录下。 3.2.5 Logging Asterisk 能够生产几种不同类型的日志文件(log file)。这些日志都存储在/var/log/asterisk 目录下,例如呼叫详单(CDRS),信道日志记录(cel),调试日志(debug logs),队列日志(queue logs),消息(message),错误(error),以及一些其他输出记录。 这些日志对于任何故障排除工作都绝对非常重要。 3.2.6 Dailplan Dialplan 是 Asterisk 的核心。所有达到的 channel 都需要进过 Dialplan 的处理。在 dailplan 中, 包含有定义如何处理一个来电的呼叫流程脚本。采用传统的 Asterisk Dialplan 语法编辑 /etc/asterisk/extensions.cof 3.3 结论 Asterisk 服务器使用模块化设计,将功能处理模块和逻辑处理模块分开,以函数注册的 方式进行回调功能。这样设计使复杂系统以清新明了的方式呈现。 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 16 页 第4章 Asterisk 核心框架 本文主要从三个层面来描述 asterisk 内核,即 asterisk 内核模块、内核启动过程、基本呼叫流 程。 4.1 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 编解码模块等。 4.1.1 PBX 交换核心模块(PBX Switching Core) pbx.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 函数是每路呼叫的起点。 4.1.2 调度和 I/O 管理模块(Scheduler and I/O Manager) 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, Asterisk 学习笔记 内部公开 知识产权属私人所有 第 17 页 .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。 io.c io.c 实现了 asterisk 跟外部交互时的 I/O 管理,如 chan_sip 为了从外部接收 SIP 信令,调用 ast_io_add 添加 IO 接口,并调用 ast_io_wait 实现外部消息接收。 4.1.3 应用调用模块(Application Launcher) 在 pbx.c 中定义了一系列的应用调用接口。 applications 模块定义了 application 回调函数并注册后,在 pbx.c 中通过应用调用接口回调执 行。 应用调用接口的关键函数是 pbx_extension_helper , 它 执 行 dialplan ,在 cli 上 打 印 “Executing ……”,并抛出 ami event 事件,同时调用 pbx_exec 执行 application 回调函数。 4.1.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_...:对应各种编码的编解码执行模块. Asterisk 学习笔记 内部公开 知识产权属私人所有 第 18 页 4.1.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,在程序启动和退出时调用。 4.1.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:产生话单的接口函数,呼叫结束时被调用。 4.2 外围可加载模块 4.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 调用。 4.2.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 命令。 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 19 页 4.2.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 学习笔记 内部公开 知识产权属私人所有 第 20 页 第5章 Asterisk 基本呼叫流程 从内核的角度去分析问题时,弄清楚呼叫流程是非常关键的,只有理清了呼叫流程,才能理 清流程的各个环节细节中分析问题所在。 Asterisk 所有功能都是基于函数调用的模式, 呼叫流程也不例外。影刺如何从一团乱麻似的 内湖函数调用中李处函数调用执行路线,是解读呼叫流程的关键。 所有呼叫流程都跟 Asterisk 的 channel 有关。这路通话都包含了一个 incoming 连接和一个 outbound 连接。每个电话都是通过对应的 channel 程序建立起来的。比如 chan_sip 等等。每一类 的 channel,都拥有自己私有的 channel 数据结构,例如 chan_sip 的 struct sip_pvt 结构,这些私有 的结构从属于一个通用的 Asterisk 通道数据结构中,具体定义在 channel.h 的 Struct ast_channe 中。 5.1 Asterisk 呼叫流程 下面是 asterisk 的呼叫流程图: 1、 通过 Asterisk 的一个电话呼叫在一个通道驱动接口上到达,如 SIP Socket。 2、 通道驱动在该通道上创建一个 PBX 通道并启动一个 pbx 线程。 3、 拨号方案被执行,拨号方案在一些地方通过 dial 应用(查看 app_dial.c),强制 Asterisk 创建一个呼出呼叫,一旦呼出,Asterisk 会有下面两个动作将发生。 a) Dial 创建一个呼出的 PBX 通道并请求一种通道驱动创建一个呼叫 b) 当呼叫被应答时,Asterisk 桥接媒体流,于是在第一个通道上的主叫可以和在第二 个通道也就是呼叫通道上的被叫通话。 以 SIP 的呼叫过程为例来描述,其他 channel 的呼叫过程基本类似。 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 21 页 Application Launcher (asterisk.c) For(;;) CLI命令 Dynamic Module Loader(loader.c) Load_mudules Load_mudules Chan_sip.so reload_config ast_channel_register restart_monitor SIP通道的配置 文件,用来配置 通道的属性 monitoring thread do monitor ast_sched_wait ast_io_wait PBX Switching Core (pbx.c) ast_pbx_start ioc->fds>0 N Scheduler and I/O Manager (io.c and sched.c) ast_io_wait pbx_thread (处理当前这个输入通 道的所有事务) ast_pbx_run Finished? 通道配置的拨号计划: „ Exten=>„ 111,1, Dial(Sip/${EXTEN:11}@GW:5060) N channel.c ast_answer ast_request ast_call ast_indicate ast_hangup ast_read ast_write ast_bridge app_dial.so通过调用sip模块回调函数完成通话功能 sip_answer sip_call sip_indicate sip_request sip_bridge sip_hangup sip_read sip_write Chan_sip.so 网络驱动程序远程语音网关 Y 网关PSTN 循环监听外部设备 Y Asterisk poll(ioc->fds,ioc- >fdcnt,howlong) 读取sip.cof配置文件 循环等待cli命令输入 Xlite UA Asterisk 学习笔记 内部公开 知识产权属私人所有 第 22 页 5.2 呼入 Asterisk 下注册的 sip 用户主动发起一个呼叫的函数调用过程(呼入流程): do_monitor->sipsock_read->handle_request_do->handle_incoming->hand le_request_invite->sip_new/ast_pbx_start->pbx_thread->_ast_pbx_run->ast_s pawn_extension->pbx_extension_helper->pbx_exec->执行 dialplan; 当 chan_sip 模块被加载时,会启动一个独立的监听线程 do_monitor,不断监听 sip 端口上的 外部消息; 当 sip 用户拨叫被叫号码后,chan_sip 的 do_monitor 调用 sipsock_read 函数,在 sip 端口收到 invite 信息,然后调用 handle_request_do 和 handle_request_invite 进行处理。 在 handle_request_invite 中,首先解析 invite 信息,对该 sip 用户的业务属性分析,确认被叫 可达,然后专门调用 sip_new 申请 channle 资源,并调用 ast_pbx_start 函数启动一个 pbx_thread 线程来专门处理该呼叫。 pbx_thread 线程调用_ast_pbx_run。 _ast_pbx_run 是一个衔接 dialplan 和内核的关键函数,它首先调用 ast_exists_extension 函数, 根据分机号码的 context 属性,匹配对应的 dialplan;然后进入一个 for 死循环,逐渐执行 dialplan 对象的 context 中的语句。 在 pbx_extension_helper 中调用 pbx_find_extension 找到对应的 context 后,通过 verbose 打印 dialplan 执行语句“Excecuting…”,同时调用 pbx_exec 执行该 dialplan。 在等待被叫接通的过程中,完成媒体媒体协商过程,向主叫发送 180、200OK 信息接通呼叫。 5.3 呼出 当其他用户呼叫 asterisk 的 sip 用户时(呼出),函数调用过程如下: dial->dial_exec->dial_exec_full->ast_request/ast_call/wait_for_answer/ast_bridge_call. 呼叫执行到 dial 时,pbx_exec 调用 application dial 的接口函数 dial_exec,dial_exec 调用 dial_exec_full。 在 dial_exec_full 中,首先调用 ast_request,在 ast_request 调用 chan_sip 对应的回调函数 sip_request_call 为该被叫 sip 用户申请 channel 资源。然后调用 ast_call,在 ast_call 中调用 chan_sip 对应的回调函数 sip_call 向被叫发送 INVITE 消息,呼叫被叫 SIP 用户。 然后该呼叫线程会调用 wait_for_answer 等待被叫接通。 在呼叫接通后,也即 wait_for_answer 函数返回,在 dial_exec_full 中调用 ast_bridge_call 桥接 媒体,这样呼叫就正式接通了。 当 chan_sip 的侦听线程接收到 BYE 消息,则调用 handle_request_bye 找到相应的 channel,执 行 hangup 释放呼叫。 Asterisk 学习笔记 内部公开 知识产权属私人所有 第 23 页 第6章 Asterisk-Java 6.1 FastAGI 协议 FastAGI 协议是 Asterisk 和 Java 应用程序之间交互最方便的一种方法。通过 Manager API , AGI 脚本能处理呼入电话和 calls originated。 AGI(Asterisk Gateway Interface)实际上运行你去启动脚本通过 Asterisk 拨号计划。一般地, 在脚本和 Asterisk 之间交互使用标准输入输出,脚本必须和 Asterisk 运行在同一台机器上。 6.2 Manager API Manager API 是另外一种和 Asterisk 远程交互的方法,相比 FastAGI 协议,
还剩22页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 1 人已下载

下载pdf

pdf贡献者

Manager

贡献于2016-12-26

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf