基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)

原文:基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)

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呼叫流程如图3所示。

(1)通过Asterisk的一个电话呼叫在一个通道驱动接口上到达,如SIP Socket。

(2)通道驱动在该通道上创建一个PBX通道并启动一个pbx线程

(3)拨号方案被执行,拨号方案在一些地方通过dial应用(查看app_dial.c)

强制Asterisk创建一个呼出呼叫,一旦呼出,Asterisk会有以下两个动作将发生。

(1)Dial创建一个呼出的PBX通道并请求一种通道驱动创建一个呼叫

(2)当呼叫被应答时,Asterisk桥接媒体流,于是在第一个通道上的主叫可以和在第

二个通道也就是呼出通道上的被叫通话。

                                     图3 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开源软件包。

时间: 2024-11-05 12:28:44

基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)的相关文章

基于Asterisk的VoIP开发指南——(1)实现基本呼叫功能

原文:基于Asterisk的VoIP开发指南--(1)实现基本呼叫功能 说明:        1.本文档探讨基于Asterisk如何实现VoIP的一些基本功能,包括基本呼叫功能的方案选取.主叫号码透传.如何编写Asterisk AGI程序.Radius认证计费模块等.        2.本文档VoIP软终端使用X-Lite,其它终端均可以接入测试.        3.文章内容仅供参考,转载请注明出处.           1 VoIP系统相关协议和标准 由于I P电话技术标准的开发涉及多个领域,

基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南

原文:基于Asterisk的VoIP开发指南--(2)Asterisk AGI程序编写指南 5. Asterisk AGI程序编写指南    5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或者外部数据库的查询,根据具体地需要,有几种做法: 1.使用Asterisk的通道变量.Goto函数.Gotoif函数等实现某些简单跳转,通过几个这样的函数的组合,实现简单的业务. 2.对终端接入用户的呼叫请求中的某些属性,进行简单的数据库增删改查,在Asterisk官方发布的asterisk-

基于SharpMap扩展程序开发实例

SharpMap是基于.Net平台开发的GIS地图渲染组件.在SharpMap的内部设计了基于OGC 标准的几何模型 构架,设计了IProvider策略模式的多源矢量地图数据适配器接口,地图要素渲染的底层主要通过几何变 换将Geometry转换为.Net支持的几何模型如System.Drawing.Point.System.Drawing.Rectangle. System.Drawing.Drawing2D.GraphicsPath等,然后调用System.Drawing.Graphics类的

基于YUI的组件开发(1)【珍珠奶茶帮】

分享人:拔赤 导语:如今的前端开发越来越OO,也越来越注重重用,娴熟的用js写出OO的前端代码已然是一个前端工程师的基本素质之一.与此同时,网站的开发过程也越来越类似于堆积木.模块思想也逐渐深入的应用在大型网站的开发之中,指导网站的设计和架构,在今天[珍珠奶茶帮]的分享中,我们来对基于YUI的组件开发做深入探讨. 模块化的前端开发 在web技术迅猛发展的今天,大型网站的前端开发越来越依赖复杂的团队配合,而模块化思想则能有效的指导团队开发的效率提升和成本压缩.它使得我们在项目中将注意力放在颗粒化组

讨论基于B/S架构开发项目的原型工具

这里说的原型仅针对基于B/S架构开发的项目. 目前有很多专业制作原型的工具例如axure.mockflow.InfoMaker和一些"非专业"软件:photoshop.Dreamweaver等等,如果你有足够的耐心使用word也可以做原型,当然还有笔.纸.橡皮擦. 我接触过很多原型制作工具,也做了很多所谓的原型,项目不同,公司不同,使用的工具也不一样. 个人认为用哪种工具制作原型, 第1取决于用哪种工具最适合项目人员间的交流与沟通. 第2要看原型制作者是否对此工具最熟悉,能以最快和最准

在基于CE的产品上使用手机模块

要在你的基于Windows CE的产品上具备无线通讯(拨号上网.拨打电话.收发短信)功能,你的选择是要么让用户外接手机,要么在你的产品上集成手机模块.如果是外接手机,那么手机只是起到在上网浏览期间接收和发送数据的作用.如果必须集成手机模块,那么手机模块要完成无线通讯的全部功能,从软件开发角度讲,相对要麻烦一点.本篇文章简略地讲解在开发控制手机模块的软件过程中需要注意的事项. 一.拨号上网 在连接Internet浏览网页过程中,手机模块负责连接ISP.从ISP接收数据和发送数据.如果ISP为中国移

Sculpture:基于MDD的集成开发平台

Sculpture是一个基于模型驱动的集成开发平台,目前已经发布了2.1版本. 相信大家对模型驱动,领域设计这些概念已经并不陌生,模型驱动能够极大的提高开发效率,当然这也和项目的类型有关,有所为有所不为,一定要因地制宜. 对于开发系统产品来说,一般是分三个方向: 1.一种是开发出一个功能全面的产品,功能可配置化,客户根据自己的需求进行功能的配置.如SAP 2.另外一种是根据客户的需求直接在平台上进行二次开发,开发完再提交给客户. 如U9 ,EasyBridge.Net 3.还有一种就是拿一个案例

【Qt编程】基于Qt的词典开发系列<一>--词典框架设计及成品展示

    去年暑假的时候,作为学习Qt的实战,我写了一个名为<我爱查词典>的词典软件.后来由于导师项目及上课等原因,时间不足,所以该软件的部分功能欠缺,性能有待改善.这学期重新拿出来看时,又有很多东西都不熟悉了.恰逢这学期课比较少,于是乎想写写关于这个软件制作的一系列文章,对日后重拾该软件时能够较快入手.当然,也非常乐意读者们在该软件的基础上添加一些功能,源代码会在该系列文章写完之后公布.可运行的词典软件的下载地址:http://download.csdn.net/detail/tengweit

分享六个基于Bootstrap的实用开发教程和模板演示

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 关于Bootstrap,相信大家一定不陌生,它已经成为现在主流产业的一个重要工具,Bootstrap提供了优雅的HTML和CSS规范,它基于jQuery框架开发的,它在jQuery框架的基础上进行了更为个性化和人性化的完善,形成一套自己独有的网站风格,并兼容大部分jQuery插件.今天,我们带来6款Bootstrap实现的几款小应用,希望可以