基于嵌入式Linux的網(wǎng)絡(luò)語音平臺的設(shè)計與構(gòu)建
以內(nèi)核態(tài)運行的程序主要包括SLIC控制模塊、DSR控制模塊及接口和DSR數(shù)據(jù)模塊這三部分,它們基本完成了底層所需的功能要求。用戶態(tài)的程序都是運行在其上,對其進行管理控制,以實現(xiàn)上層的應(yīng)用。
(1)SLIC控制模塊
由于整個平臺包含有FXS和FXO接口,故SLIC控制模塊也可以相應(yīng)地分為兩部分。
對于FXS接口程序部分,其主要是模擬PSTN局端功能,對提供撥號音、電池電流與振鈴電壓和檢測來自電話的環(huán)路關(guān)閉進行相應(yīng)地控制。當有控制信息需要輸出時,驅(qū)動程序通過向SLIC芯片的C1、C2和C3管腳寫入相應(yīng)的電平,實現(xiàn)對SLIC的控制(具體數(shù)值可參看表1)。可以根據(jù)SLIC所處的狀態(tài)進行劃分,設(shè)置如下四種狀態(tài):fxs_ring,fxs_take,fxs_onhook,fxs_offhook。當其處在fxs_ring狀態(tài)下就可以為FXS接口提供撥號音、振鈴等信號;當其處在fxs_take狀態(tài)下表明用戶剛剛摘機;當其處在fxs_offhook狀態(tài)下表明該終端用戶為主動呼叫者,需要處理摘機以后的操作;當其處在fxs_onhook狀態(tài)下表明用戶掛機。
相應(yīng)的,當SLIC有中斷輸入時,中斷處理程序會根據(jù)當前的狀態(tài)來判斷。如果確定是用戶進行了摘機或掛機操作后,查詢最后一次硬中斷后該路SLIC的電平,為0則處于摘機狀態(tài),否則處于掛機狀態(tài)。這里中斷的處理較為重要。其內(nèi)容包括:中斷源是由哪個FXS端口發(fā)出的,并根據(jù)所處的狀態(tài)來開啟相應(yīng)狀態(tài)下的定時器,以保證狀態(tài)變化間的時間間隔。
對于FXO接口程序部分,其主要是模擬電話機的功能,所以功能相對要簡單些。在程序中主要設(shè)定有fxo_ring、fxo_onhook和fxo_offhook這三個狀態(tài)。當其處在fxo_offhook狀態(tài)下表明用戶摘機。當其處在fxo_onhook狀態(tài)下驅(qū)動程序就把DAA芯片的引腳拉高,表明用戶掛機。相應(yīng)的,當有控制信息需要輸入時,其檢測DAA芯片的引腳來進行判斷,這里同樣要啟動相應(yīng)的定時器,來判斷回路上是否有振鈴電平或何時回路上振鈴信號結(jié)束等信息。當程序判斷處在fxo_ring狀態(tài)下,則表明線路上有振鈴信號并做相關(guān)處理。
(2)DSR控制模塊及接口
DSR控制模塊及接口主要實現(xiàn)用戶對串行語音數(shù)據(jù)通信接口HSS以及底層引擎NPE的控制。既與來自上層應(yīng)用程序進行信息交互,又為上層應(yīng)用程序和SLIC硬件之間提供控制接口。與一般的設(shè)備驅(qū)動一樣,主要包括DSR_open()、DSR_close()、DSR_read()、DSR_write()和DSR_ioctl()這些函數(shù)。其中DSR_read()和DSR_write()主要負責從DSR讀取消息和向DSR寫入消息。DSR_ioctl()主要負責控制DSR的相關(guān)配置參數(shù)讀入與讀出和傳遞SLIC控制信息給底層的SLIC控制模塊。參數(shù)包括根據(jù)當前所處狀態(tài)判斷后所得出的C1、C2和C3管腳寫入相應(yīng)的電平值、查詢當前SLIC的工作狀態(tài)信息、SLIC振鈴信號的產(chǎn)生和停止等。DSR的相關(guān)配置參數(shù)包括DSR中DSP通道數(shù)目、通道編碼器的類型、編解碼器輸出語音數(shù)據(jù)幀的大小等。
(3)DSR數(shù)據(jù)模塊
DSR數(shù)據(jù)模塊主要實現(xiàn)話音數(shù)據(jù)在內(nèi)核與用戶態(tài)之間的交互。包括從內(nèi)核中讀取數(shù)據(jù),向內(nèi)核中發(fā)送數(shù)據(jù)。為了有效把握數(shù)據(jù)傳輸節(jié)奏,需要建立一種內(nèi)部緩存機制。包括從DSR讀取到數(shù)據(jù)緩存后發(fā)送給用戶態(tài)的應(yīng)用程序和用戶態(tài)的應(yīng)用程序向DSR發(fā)送數(shù)據(jù)的緩存。緩存內(nèi)的數(shù)據(jù)查詢也是每隔一段時間后再進行的。但注意緩存不應(yīng)開的過大,以免通話延時的加大。為了消除由于網(wǎng)絡(luò)丟包而造成語音信息不完整的問題,DSR數(shù)據(jù)模塊也建立了相應(yīng)的機制來控制。
用戶的應(yīng)用程序主要運行在用戶態(tài),針對DSR模塊和網(wǎng)絡(luò)上收發(fā)的語音數(shù)據(jù)和控制信令進行處理操作。以編程實現(xiàn)直接內(nèi)向呼叫、呼叫轉(zhuǎn)移網(wǎng)絡(luò)、呼叫等待和三方呼叫等功能。對于底層通話平臺來說,主要關(guān)心的是處理電話和IP網(wǎng)絡(luò)間的銜接問題,這需要做好如下幾個接口:DSR控制接口、DSR數(shù)據(jù)接口和網(wǎng)絡(luò)接口,以實現(xiàn)語音數(shù)據(jù)收發(fā)、通話信令收發(fā)和DSR控制消息收發(fā)的管理。
網(wǎng)絡(luò)接口模塊用來接受網(wǎng)絡(luò)上傳遞進來的數(shù)據(jù),做出相關(guān)處理后將壓縮的語音數(shù)據(jù)通過DSR數(shù)據(jù)接口傳遞給內(nèi)核處理,同時也負責將從DSR數(shù)據(jù)接口傳遞來的壓縮后的語音數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。如果從網(wǎng)絡(luò)上傳遞進來的數(shù)據(jù)是通話信令,則在做出相關(guān)處理后將具體的控制信息通過DSR控制接口發(fā)送給內(nèi)核,或者根據(jù)底層操作的內(nèi)容把相應(yīng)的信令信息通過網(wǎng)絡(luò)接口發(fā)送到網(wǎng)絡(luò)上。例如,對DSR的相關(guān)控制消息包括打開與關(guān)閉DSR編解碼功能、打開與關(guān)閉在向電話輸出的電話信令音和開啟與關(guān)閉檢測用戶鍵盤撥號等功能。
2 測試
為了保證當前系統(tǒng)能正確工作,需要對其底層功能進行測試。因為編碼壓縮的語音數(shù)據(jù)由實時傳送協(xié)議RTP負責傳遞,故主要采用用戶數(shù)據(jù)UDP包的形式接收與發(fā)送。出于這個角度考慮,可以實現(xiàn)將電話手柄的MIC采集的聲音返回至同一電話手柄的聽筒內(nèi)。首先編寫一個小程序來實現(xiàn)將話筒收集的語音數(shù)據(jù)發(fā)送至網(wǎng)絡(luò)上,同時接受來自網(wǎng)絡(luò)的數(shù)據(jù)并還原成模擬話音。假設(shè)網(wǎng)絡(luò)上有一臺IP地址為192.168.0.1的主機。其運行一個UDP數(shù)據(jù)包環(huán)回程序負責將網(wǎng)上接收到的UDP數(shù)據(jù)包轉(zhuǎn)發(fā)回源發(fā)送端。開始測試前,先設(shè)定一些必要的控制信息,如對方IP地址和語音編解碼方式等。將網(wǎng)線和話筒線連至網(wǎng)口和RJ11接口,撥通IP地址為192.168.0.1主機的電話,看看電話手柄的聽筒內(nèi)將能夠聽到話筒MIC所收集的話音。如果話音正確,則表明底層的功能已實現(xiàn)。
基于IXP421的網(wǎng)絡(luò)語音平臺方案實現(xiàn)了底層的相關(guān)功能,而上層的應(yīng)用較為靈活,且有很強的擴展性,例如實現(xiàn)VPN功能及多媒體業(yè)務(wù),還需要開發(fā)相應(yīng)的軟件,本文并未涉及到。隨著網(wǎng)絡(luò)語音相關(guān)技術(shù)的逐步走向成熟,相信會有越來越多的人因之受益。
linux相關(guān)文章:linux教程
評論