Asterisk模块编写指南


基于 Asterisk 的 VoIP 开发指南——Asterisk 模块编写指南 2008/06/12 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 产品可以满足企业的各种需求。传统的 PBX 成品, 要么功能和灵活性不足,要么配置和维护复杂;而且都具有一个致命的缺点,那就是开 放性、可扩展性。 Asterisk 具有传统 PBX 无法比拟的优点,那就是其灵活性,可扩展能力;Asterisk 的扩展能力是通过开放相应的架构和接口来实现的。这就意味着 Asterisk 是一个组件 而不是一个成型的产品,Asterisk的核心提供了一个基本的可运行环境,而外围相应的 能力则可以通过加载和配置相关的插件和模块来实现。 Asterisk 是一个开源的 PBX 架构;但它并不是一个成品。Asterisk 的扩展能力是 通过开放相应的架构和接口来实现的。这就意味着 Asterisk 是一个组件而不是一个成 型的产品,Asterisk 的核心提供了一个基本的可运行环境,而外围相应的能力则可以通 过加载和配置相关的插件和模块来实现。 因此,使用 Asterisk,一定会面临二次开发问题,这些二次开发主要围绕以下几个 方面: (1)内部核心模块  开发扩展编解码能力模块  开发扩展相应的通道模块 (2)外围动态可加载模块  开发应用部分  开发外围管理部分 一般来说,Asterisk 使用者很少需要去开发编解码能力模块和通道模块等内部核心 模块;而需要开发最多的情况则是外围动态可加载模块,即外围管理部分和应用开发, 本文也是指这些方面的开发。 3.Asterisk 通道模型与呼叫流程 3.1 什么是 asterisk 通道? Asterisk 通道是指通过 asterisk 建立起来的一路通话。这类通话都包含一个 incoming 连接和一个 outbound 连接。每个电话都是通过一种通道驱动程序建立起来的, 比如 SIP,ZAP,IAX2 等等。每一类的通道驱动,都拥有自己私有的通道数据结构,这些 私有的结构从属于一个通用的 Asterisk 通道数据结构中,具体定义在 channel.h 和 channel.c 中。 3.2 基本的呼叫流程 Asterisk PBX 呼叫流程如图 2 所示。  通过 Asterisk 的一个电话呼叫在一个通道驱动接口上到达,如 SIP Socket。  通道驱动在该通道上创建一个 PBX 通道并启动一个 pbx 线程  拨号方案被执行,拨号方案在一些地方通过 dial 应用(查看 app_dial.c) 强制 Asterisk 创建一个呼出呼叫,一旦呼出,Asterisk会有以下两个动作将发生。  Dial 创建一个呼出的 PBX 通道并请求一种通道驱动创建一个呼叫。  当呼叫被应答时,Asterisk 桥接媒体流,于是在第一个通道上的主叫可以和在 第二个通道也就是呼出通道上的被叫通话。 图 2 Asterisk PBX 呼叫流程 4.RADIUS 协议的概述 (1)Radius 协议在协议栈中的位置 Radius 是一种流行的 AAA 协议,同时其采用的是 UDP 协议传输模式,AAA 协议在协议栈 中位置如图 3 所示。 图 3 Radius 协议在协议栈中的位置 (2)Radius 协议选择 UDP 作为传输层协议  NAS 和 Radius 服务器之间传递的是几十上百个字节长度的数据,且 Radius 要求 特别的定时器管理机制,用户可以容忍几十秒的验证等待时间。  当处理大量用户,服务器端采用多线程,UDP 简化了服务器端的实现过程。  TCP 是必须成功建立连接后才能进行数据传输的,这种方式在有大量用户使用的 情况下实时性不好。Radius 要有重传机制和备用服务器机制,它所采用的定时, TCP 不能很好的满足。由于数据包可能会在网络上丢失,如果客户没有收到响应, 那么可以重新发送该请求包。多次发送之后如果仍然收不到响应,RADIUS 客户 可以向备用的 RADIUS 服务器发送请求包。  Radius 依靠自身协议保证报文重传和服务器备份机制以确保计费可靠性。 5.认证计费功能概述 IP-PBX 呼叫控制功能,主要是VoIP 终端用户的认证计费控制过程,是VoIP 系统商 业化运营的核心模块。 Radius Client端,也叫 NAS,主要的任务就是根据 VoIP 终端的呼叫请求携带的各 种属性,包括账户 ID、被叫号码、通话时间等,封装成标准的 Radius 数据包发送到 Radius Server 端,达到账户信息实时更新的效果。整个 NAS 端程序主要由两个模块构成:认证 模块和计费模块,并把这两个模块整合到开源 IP-PBX 项目 Asterisk 中。 5.1 标准 RADIUS 协议分析 (1)Radius Packet RADIUS 数据包被包装在 UDP 数据报的数据块(Data field))中,其中的目的端口 为 1812,RADIUS 协议包结构如图 4 所示。 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Code | Identifier | Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Authenticator | | | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Attributes ...(不定长) +-+-+-+-+-+-+-+-+-+-+-+-+- Attribute: 0 1 2 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Type | Length | Value …(不定长) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 图 4 RADIUS 协议包结构图 (2)对 Radius Packet 格式各个域解释 Code:包类型,一个字节长,指示 RADIUS 包的类型,包含不合法的 Code 的 Radius 包将被直接丢弃,code 域主要包含了以下值类型。 1)code=1 Access-Request——认证请求数据包 本文 AAA 功能就是构建 code=1 的认证请求数据包。 2)code=2 Access-Accept——认证响应数据包 3) code=3 Access-Reject——认证拒绝数据包 4)code=4 Accounting-Request——计费请求数据包 本文 Asterisk 的 AAA 功能另外一个重点任务就是构建 code=4 的计费请求数据包, Accounting-Request 数据包中的两种状态类型(Acct-Status-Type)的计费请求数据 包:Start(Value=1):Client 开始对指定用户提供服务,计费开始;Stop(Value=2): Client 停止对指定用户提供服务,计费结束。 5)code=5 Accounting-Response——计费响应数据包 因为是要更新账户信息,所以目前本文不需要处理计费响应数据包。 Identifier:包标识符,一个字节长,用于匹配请求包和响应包,同一组请求包和 响应包的 Identifier 应相同。协议规定: 1) 在任何时间,发给同一个 RADIUS 服务器的不同包的 Identifier 域不能相同, 如果出现相同的情况,RADIUS 将认为后一个包是前一个包的拷贝而不对其进行处理。 2) Radius针对某个请求包的响应包应与该请求包在 Identifier 上相匹配(相同)。 Length:包长度,两个字节长,说明数据包的长度,是 code、identifier、length、 authenticator attribute fields 的长度总和,有效范围是 20~4096,超出范围的数据 将被视为附加数据(Padding)或直接被忽略。 Authenticator:验证字,16 字节长,用于验证消息的负载,对包进行签名,该验 证字分为两种。 1) 请求验证字---Request Authenticator,用在请求报文中,必须为全局唯一的随 机值。 2) 响应验证字---Response Authenticator,用在响应报文中,用于鉴别响应报文 的合法性。响应验证字=MD5(Code+ID+Length+请求验证字+Attributes+Key)。 Attributes:Type 指示了 Atribute 的类型,通用的有几十种,在系统中使用到的, 如表 4.1 所示。Asterisk AAA 模块的构建主要是构建表 1 列出的这些属性值的 RADIUS 数据包。 表 1 Atribute 的属性列表 属性值 属性名称 属性意义 1 User-Name 用户账户 ID 2 User-Password 用户密码 4 Nas-IP-Address Nas 的 ip 地址 5 Nas-Port 用户接入端口号 6 Service-Type 服务类型 7 Framed-Protocol 协议类型 8 Framed-IP-Address 为用户提供的 IP 地址 11 Filter-Id 过滤表的名称 27 Session-Timeout 通知 NAS 该用户可用的会话时长 (时长预付费) 32 NAS-Identifier 标识NAS 的字符串 40 Acct-Status-Type 计费请求报文的类型 41 Acct-Delay-Time Radius 客户端发送计费报文耗费的 时间 44 Acct-Session-Id 计费会话标识 45 Acct-Authentic 在计费包中标识用户认证通过的方 式 46 Acct-Session-Time 通话时长(用户在线时长) 49 Acct-Terminate-Case 用户下线原因 5.2 选择一个合适的 Radius Client API 上个小节介绍的 RADIUS 数据包格式,是构建应用协议层数据包的封装所关注的, 在 Asterisk 中如果需要亲自把标准 RADIUS 数据包的发送、接收等过程从零开始写起, 那本文就把重点放在了 RADIUS UDP 数据包与服务器通信过程的编写中了,实际本文关 注的是在 Asterisk 中根据 VoIP 通信中的业务需求,构建 RADIUS 认证计费模块,重点 是业务应用层的开发,即如何组织认证包、计费包的数据结构等,而 RADIUS 数据包传 输层直接调用现成的开源 API,目前主要有两种这样的开源项目。 (1)pam_radius 一个 PAM 模块提供了 RADIUS 客户端的功能。它是从开源项目Freeradius 中提取出 来的,如果要使用需要对代码做大量的修改、打补丁后才能使用。 (2)radiusclient-ng 相对比 PAM 的 pam_radius 模块而言,radiusclient-ng 的动态库代码不用修改就可 以拿过来使用,只需安装 radiusclient-ng 的动态库,然后根据配置文件、开放的 API 接口修改 Asterisk 代码就可以完成 Asterisk AAA 模块的构建。 所以在本文使用 radiusclient-ng 开源软件包。
还剩8页未读

继续阅读

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

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

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

下载pdf

pdf贡献者

165857

贡献于2010-12-21

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