基于嵌入式Linux和MiniGUI的SIP电话设计
0 引言
随着VoIP的迅猛发展,越来越多的个人用户正在使用软件电话、IP电话通过VoIP系统拨打国内和国际长途,IP电话的需求量越来越大,同时,人们对IP电话的要求也越来越高,例如要求IP电话体积小、方便携带、功耗低、待机时间长、漂亮的人机交互界面,功能可扩展等。解决这些需求的可行方案就是用嵌入式系统,具体而言就是采用一款32位嵌入式处理芯片(如ARM、Power PC),将Linux操作系统和MiniGUI图形库经过裁减移植到这些嵌入式处理芯片所构建的硬件平台上。由于Linux具有强大的网络功能,而MiniGUI是一款优秀的针对嵌入式Linux的轻量级图形用户界面库,在它们的基础上做应用开发,能够保证IP电话的稳定性和功能扩展,也能开发出漂亮的人机交互界面。
目前用来实现VoIP系统的协议有三种:SIP、MGCP和H.323,其中SIP协议是应用得最广泛的协议,所谓SIP电话就是支持SIP协议的IP电话。
1 SIP电话实现方案
根据IP电话的功能需求,SIP电话应当实现人机界面的交互、呼叫处理、语音的采集和播放、语音的编码和解码、语音的实时传输。本设计人机界面的交互使用嵌入式系统硬件平台上的LCD和功能按键,采用MiniGUI图形库和Linux按键驱动;呼叫处理模块使用硬件平台上的网络接口,采用eXoSIP协议栈;语音的采集与播放使用硬件平台上的音频接口,采用Linux音频设备驱动;语音的编码和解码直接采用开源G.7-29A源代码;语音的实时传输使用RTP协议,采用开源的JRTPLIB库。
SIP电话软件结构图如图1所示。SIP电话由八个模块组成。每一模块对应一个线程。其中,主线程(线程1)的任务是:a.加载配置文件到内存中;b.初始化音频设备和功能按键设备;c.创建RTP会话实例和初始化eXoSIP协议栈;d.初始化四个数据区缓冲结构;e.创建、管理、撤消子线程;f. 显示SIP配置文件的配置信息和状态信息,处理来自呼叫处理模块子线程的消息。呼叫处理模块子线程(线程2)的任务是:通过调用eXoSIP协议栈的API函数,实现SIP电话的呼叫过程控制。语音采集模块子线程(线程3)的任务是:实现语音的采集并将采集到的语音数据存储到全局数据缓冲区队列1中。语音编码模块子线程(线程4)的任务是:从全局数据缓冲区队列1中读取PCM码流并对其进行编码,将转化过后的G.729码流存储到全局数据缓冲区队列2中。数据发送模块子线程(线程5)的任务是:从全局数据缓冲区队列2中提取G.729码流,打包成RTP数据包发送到出去。数据接收模块子线程(线程6)的任务是:检测接收端口上的RTP语音包,提取G.729码流存储到全局数据缓冲区队列3中。语音解码模块子线程(线程7)的任务是:从全局数据缓冲区队列3中读取G.729码流对其进行解码,将转化过后的PCM码流存储到全局数据缓冲区队列4中。语音播放模块子线程(线程8)的任务是:从全局数据缓冲区队列4中读取PCM码流,通过D/A转换成模拟语音信号。
评论