基于嵌入式Linux的網(wǎng)絡(luò)語音平臺的設(shè)計(jì)與構(gòu)建
FXO部分電路主要采用SILICON LABS公司的SI3016和SI3021。SI3016為一個(gè)DAA電路,能為線路上的信號提供光電隔離和2/4線轉(zhuǎn)換功能,以滿足編解碼與數(shù)字交換對四線傳輸?shù)囊?。并且能夠?qū)崿F(xiàn)對線路上的振鈴信號、呼叫方ID和極性反轉(zhuǎn)檢測等功能。SI3021一方面提供直接連接DSP的通信接口,另一方面也提供控制接口。電路可工作于On-Hook(電話線可供使用)和Off-Hook(電話線忙碌)這兩種狀態(tài)下,通過設(shè)定SI3021的引腳電平的高低來控制:為高表示處于On-Hook狀態(tài),可以接收或發(fā)起一個(gè)呼叫;為低表示處于Off-Hook狀態(tài),電話線忙碌。當(dāng)線路上有振鈴信號時(shí)通過引腳表示。并可以通過配置M1和M0腳來選定串行數(shù)據(jù)接口的工作模式。整個(gè)平臺還配有CPLD電路,是為了控制各個(gè)電話接口,并協(xié)調(diào)各端口間的通信。
主處理器IXP421是INTEL公司IXP42x系列的網(wǎng)絡(luò)處理器,它在VoIP應(yīng)用方面具有自己的特點(diǎn)。如提供了兩個(gè)高速同步串口HSS, 同時(shí)含有高速網(wǎng)絡(luò)處理引擎NPE,在Xscale的配合下它可以實(shí)現(xiàn)DSP等高級數(shù)據(jù)處理的應(yīng)用。并配有基于Xscale的DSP軟件庫,支持2~4路語音信號的處理。在網(wǎng)絡(luò)處理方面,IXP421集成有10~100兆MAC,通過MII/RMII接口連接通用PHY芯片,并連至IP網(wǎng)絡(luò)。
1.2 軟件部分
軟件可從功能上或驅(qū)動(dòng)模塊上劃分,下面將從以上兩個(gè)方面進(jìn)行分析。
1.2.1 軟件功能模塊
從功能上可劃分如圖2所示的模塊結(jié)構(gòu)。
本文引用地址:http://butianyuan.cn/article/152541.htm
其中DSR模塊是IXP421進(jìn)行底層語音數(shù)據(jù)處理的模塊,它主要采用由INTEL提供的DSR(DSP software release)軟件庫。一方面,它與上層應(yīng)用程序進(jìn)行通信,傳遞數(shù)據(jù)或響應(yīng)來自上層的控制消息。另一方面,它與底層接口進(jìn)行通信與控制。
編碼部分負(fù)責(zé)進(jìn)行編碼和對從HSS到IP接口的數(shù)據(jù)分組打包,提供對G.711等音頻標(biāo)準(zhǔn)的支持,并提供有增益控制功能的自動(dòng)等級控制ALC單元和區(qū)分背景噪聲的VAD功能。并將多個(gè)語音幀合并成一個(gè)IP分組包。對語音包以特定的幀長進(jìn)行壓縮編碼,壓縮后的語音包送入網(wǎng)絡(luò)處理單元。網(wǎng)絡(luò)處理單元為語音添加包頭、時(shí)標(biāo)和其他信息后,把數(shù)據(jù)放在可變長的數(shù)據(jù)報(bào)或分組中,然后給每個(gè)數(shù)據(jù)報(bào)附帶尋址和控制信息,并通過網(wǎng)絡(luò)發(fā)送到目的地。
相對于解碼部分負(fù)責(zé)把從IP網(wǎng)絡(luò)接收的語音分組包進(jìn)行打包并轉(zhuǎn)成語音數(shù)據(jù)流發(fā)送至HSS接口。類似于編碼部分,解碼部分也包含G.711和G.729數(shù)據(jù)處理和ALC處理單元。不同的是其包含產(chǎn)生適當(dāng)背景噪聲的CNG單元、消除由于網(wǎng)絡(luò)丟包而造成語音信息不完整問題的PLC單元和控制從IP網(wǎng)絡(luò)到HSS接口數(shù)據(jù)傳輸節(jié)奏的JitterBuffer單元。
電話信號音監(jiān)測模塊負(fù)責(zé)監(jiān)控300~3500Hz的電話信號音,如DTMF信號等。主要是采用快速傅立葉算法FFT來進(jìn)行分析和判斷。電話信號音產(chǎn)生模塊則負(fù)責(zé)產(chǎn)生相應(yīng)的電話信號音。而網(wǎng)絡(luò)節(jié)點(diǎn)是連接HSS端口與編解碼等部分的程序模塊,它把需要從HSS端口發(fā)送的數(shù)據(jù)放入HSS發(fā)送緩沖區(qū),或把需要從HSS端口接收的數(shù)據(jù)放入HSS接收緩沖區(qū)內(nèi)。
1.2.2 狀態(tài)機(jī)的結(jié)構(gòu)
為了模擬通常狀態(tài)下的電話機(jī)工作流程,需要相應(yīng)地建立幾種不同的狀態(tài),并實(shí)現(xiàn)不同狀態(tài)的轉(zhuǎn)換。一般通話雙方有空閑、撥號、發(fā)送信令、回應(yīng)、建立連接和斷開連接等狀態(tài),故可以定義如下幾個(gè)狀態(tài)值:call_idel、call_dial、call_cancel、call_invite、call_ack、call_connect、call_bye等。例如用戶摘機(jī)事件發(fā)生后會(huì)有中斷產(chǎn)生,若該路終端目前的狀態(tài)為call_ack時(shí),表明該終端用戶為被動(dòng)接收者,且已接收到invite信令并等待用戶摘機(jī)。故此時(shí)狀態(tài)轉(zhuǎn)為call_connect并進(jìn)行相關(guān)處理。而當(dāng)該路終端目前的狀態(tài)不為call_ack時(shí),表明該終端用戶為主動(dòng)呼叫者,準(zhǔn)備撥號撥打電話。此時(shí)狀態(tài)轉(zhuǎn)為call_dial,話筒中產(chǎn)生等待音,DSR模塊開始等待用戶撥號。當(dāng)用戶結(jié)束撥號后狀態(tài)轉(zhuǎn)為call_invite并進(jìn)行相關(guān)處理。大致流程如圖3所示。
為了保證狀態(tài)機(jī)能在不同的狀態(tài)之間轉(zhuǎn)換和方便控制管理各路話音通話的信息。還需要建立一些全局?jǐn)?shù)據(jù)結(jié)構(gòu):
struct call_params{
unsigned char local_num;
unsigned char remote_num;
unsigned char local_addr;
unsigned char remote_addr;
unsigned char status;
};
用于保存當(dāng)前網(wǎng)關(guān)中各路話音的配置參數(shù),num表示該路通話的本地號碼和對端號碼,addr表示該路通話對應(yīng)在DSR內(nèi)所使用的本地和遠(yuǎn)端網(wǎng)絡(luò)地址,status記錄本地終端在該通話中處于狀態(tài)機(jī)中的狀態(tài)。設(shè)備在加電啟動(dòng)后,需要按步驟進(jìn)行一系列的初始化工作。包括一些記錄狀態(tài)信息的全局變量,初始化SLIC接口、DSR模塊、網(wǎng)絡(luò)接口、信令處理模塊并開啟所需的監(jiān)控線程,等待控制狀態(tài)的變化。
1.2.3 軟件驅(qū)動(dòng)模塊
因?yàn)榫W(wǎng)絡(luò)語音底層平臺使用嵌入式LINUX做為其操作系統(tǒng),故需要?jiǎng)澐秩鐖D4所示的幾個(gè)模塊并寫出相應(yīng)的驅(qū)動(dòng)。
linux相關(guān)文章:linux教程
評論