1。Asterisk 体系结构
Asterisk 系统的体系结构非常明晰,他不同于传统的PSTN 交换机,更多的时候,Asterisk 被当做一个连通电话的中间件,Asterisk 的可扩展性使其可以应用的各个领域,基于Asterisk的产品如 trixbox , freeries等,图3.1为Asterisk的内核结构。
Asterisk 内核包含了五个必要的核心操作模块和四个可加载的应用接口,它们共同组成了Asterisk的完整结构,五个核心模块分别是:PBX核心模块、动态加载器模块、实时调度和I/O管理器、编解码转换模块和应用启动器模块,四个扩展客家在接口分别是:编码转换接口、Asterisk通道接口(SIP,IAX等)、扩展应用接口(AGI,AMI),文件格式接口。
图 3.1 Asterisk 内核结构
Asterisk是基于模块化设计的,通过模块的动态加载实现设定的功能,用户可通过动态加载需要的模块。每当Asterisk启动,动态模块加载器就会加载模块的驱动程序。这些模块包括通道驱动、文件格式、会话记录、编解码器、应用启动器等。
Asterisk 启动后,其PBX核心即启动一个monitor线程监听通道消息,接受并处理通道上的会话请求,这些请求包括会话的初始或通道(Channel)的拆除等。通道接口负责管理会话呼入者的连接状态,无论VOIP连接、PRI连接还是ISDN连接,通道接口会给每一个呼叫的绘画建立一个信道,然后根据需要将这些信达澳彼此相连接,具体的连接细节都将由Asterisk的内核完成。
扩展应用接口允许各式各样的任务模块运行在Asterisk平台上:电话会议、语音信箱、在线数据交换等等。通过这些接口,开发人员可以在电话呼叫的任意阶段与Asterisk交互,可以编写全新的电话应用程序,例如,笔者在开发过程中实现话务员自动报号功能时即在坐席与客户接通时执行一个AGI接口程序,实现向客户报告话务员编号功能。
2 Asterisk内核初始化流程
Asterisk的模块初始化工作由Asterisk 负责,包括系统的启动、初始化各个模块等工作,其中 main()函数是系统的入口,这里负责初始化文件日志系统、设置RTP/RTCP端口、信令通道的初始话(如SIP)等, main()函数通过调用load_modules()函数加载各个模块并且注册各个app的入口函数,load_pbx()函数负责加载Asterisk内嵌的函数,它通过读取全局数组builtins中每个app的信息,然后调用ast_register_application注册app的各个入口函数,模块初始化流程如图 3-2 所示。
图 3.2 Asterisk 模块初始化流程
3 Asterisk 呼叫流程
每一个