基于嵌入式Linux的网络语音平台的设计与构建
以内核态运行的程序主要包括SLIC控制模块、DSR控制模块及接口和DSR数据模块这三部分,它们基本完成了底层所需的功能要求。用户态的程序都是运行在其上,对其进行管理控制,以实现上层的应用。
(1)SLIC控制模块
由于整个平台包含有FXS和FXO接口,故SLIC控制模块也可以相应地分为两部分。
对于FXS接口程序部分,其主要是模拟PSTN局端功能,对提供拨号音、电池电流与振铃电压和检测来自电话的环路关闭进行相应地控制。当有控制信息需要输出时,驱动程序通过向SLIC芯片的C1、C2和C3管脚写入相应的电平,实现对SLIC的控制(具体数值可参看表1)。可以根据SLIC所处的状态进行划分,设置如下四种状态:fxs_ring,fxs_take,fxs_onhook,fxs_offhook。当其处在fxs_ring状态下就可以为FXS接口提供拨号音、振铃等信号;当其处在fxs_take状态下表明用户刚刚摘机;当其处在fxs_offhook状态下表明该终端用户为主动呼叫者,需要处理摘机以后的操作;当其处在fxs_onhook状态下表明用户挂机。
相应的,当SLIC有中断输入时,中断处理程序会根据当前的状态来判断。如果确定是用户进行了摘机或挂机操作后,查询最后一次硬中断后该路SLIC的电平,为0则处于摘机状态,否则处于挂机状态。这里中断的处理较为重要。其内容包括:中断源是由哪个FXS端口发出的,并根据所处的状态来开启相应状态下的定时器,以保证状态变化间的时间间隔。
对于FXO接口程序部分,其主要是模拟电话机的功能,所以功能相对要简单些。在程序中主要设定有fxo_ring、fxo_onhook和fxo_offhook这三个状态。当其处在fxo_offhook状态下表明用户摘机。当其处在fxo_onhook状态下驱动程序就把DAA芯片的引脚拉高,表明用户挂机。相应的,当有控制信息需要输入时,其检测DAA芯片的引脚来进行判断,这里同样要启动相应的定时器,来判断回路上是否有振铃电平或何时回路上振铃信号结束等信息。当程序判断处在fxo_ring状态下,则表明线路上有振铃信号并做相关处理。
(2)DSR控制模块及接口
DSR控制模块及接口主要实现用户对串行语音数据通信接口HSS以及底层引擎NPE的控制。既与来自上层应用程序进行信息交互,又为上层应用程序和SLIC硬件之间提供控制接口。与一般的设备驱动一样,主要包括DSR_open()、DSR_close()、DSR_read()、DSR_write()和DSR_ioctl()这些函数。其中DSR_read()和DSR_write()主要负责从DSR读取消息和向DSR写入消息。DSR_ioctl()主要负责控制DSR的相关配置参数读入与读出和传递SLIC控制信息给底层的SLIC控制模块。参数包括根据当前所处状态判断后所得出的C1、C2和C3管脚写入相应的电平值、查询当前SLIC的工作状态信息、SLIC振铃信号的产生和停止等。DSR的相关配置参数包括DSR中DSP通道数目、通道编码器的类型、编解码器输出语音数据帧的大小等。
(3)DSR数据模块
DSR数据模块主要实现话音数据在内核与用户态之间的交互。包括从内核中读取数据,向内核中发送数据。为了有效把握数据传输节奏,需要建立一种内部缓存机制。包括从DSR读取到数据缓存后发送给用户态的应用程序和用户态的应用程序向DSR发送数据的缓存。缓存内的数据查询也是每隔一段时间后再进行的。但注意缓存不应开的过大,以免通话延时的加大。为了消除由于网络丢包而造成语音信息不完整的问题,DSR数据模块也建立了相应的机制来控制。
用户的应用程序主要运行在用户态,针对DSR模块和网络上收发的语音数据和控制信令进行处理操作。以编程实现直接内向呼叫、呼叫转移网络、呼叫等待和三方呼叫等功能。对于底层通话平台来说,主要关心的是处理电话和IP网络间的衔接问题,这需要做好如下几个接口:DSR控制接口、DSR数据接口和网络接口,以实现语音数据收发、通话信令收发和DSR控制消息收发的管理。
网络接口模块用来接受网络上传递进来的数据,做出相关处理后将压缩的语音数据通过DSR数据接口传递给内核处理,同时也负责将从DSR数据接口传递来的压缩后的语音数据发送到网络上。如果从网络上传递进来的数据是通话信令,则在做出相关处理后将具体的控制信息通过DSR控制接口发送给内核,或者根据底层操作的内容把相应的信令信息通过网络接口发送到网络上。例如,对DSR的相关控制消息包括打开与关闭DSR编解码功能、打开与关闭在向电话输出的电话信令音和开启与关闭检测用户键盘拨号等功能。
2 测试
为了保证当前系统能正确工作,需要对其底层功能进行测试。因为编码压缩的语音数据由实时传送协议RTP负责传递,故主要采用用户数据UDP包的形式接收与发送。出于这个角度考虑,可以实现将电话手柄的MIC采集的声音返回至同一电话手柄的听筒内。首先编写一个小程序来实现将话筒收集的语音数据发送至网络上,同时接受来自网络的数据并还原成模拟话音。假设网络上有一台IP地址为192.168.0.1的主机。其运行一个UDP数据包环回程序负责将网上接收到的UDP数据包转发回源发送端。开始测试前,先设定一些必要的控制信息,如对方IP地址和语音编解码方式等。将网线和话筒线连至网口和RJ11接口,拨通IP地址为192.168.0.1主机的电话,看看电话手柄的听筒内将能够听到话筒MIC所收集的话音。如果话音正确,则表明底层的功能已实现。
基于IXP421的网络语音平台方案实现了底层的相关功能,而上层的应用较为灵活,且有很强的扩展性,例如实现VPN功能及多媒体业务,还需要开发相应的软件,本文并未涉及到。随着网络语音相关技术的逐步走向成熟,相信会有越来越多的人因之受益。
linux相关文章:linux教程
评论