基于局域網(wǎng)的IP電話設計
吳侃,杜俊俐,鄭秋生 中原工學院計算機科學系
2004/07/23
摘 要:主要介紹基于中等帶寬網(wǎng)絡的語音通訊的原理、關鍵技術和實現(xiàn)方法,給出了一般的開發(fā)過程和具體開發(fā)實例。重點介紹自定義的IP電話信令系統(tǒng)的原理和實現(xiàn)過程。
關鍵詞:IP電話;語音通信;CODECs;Winsock控件
1 引 言
IP電話是近些年網(wǎng)絡在實時通訊領域的一個重要應用。利用IP電話系統(tǒng)在實現(xiàn)通話功能的基礎上,還可以提供增值服務,如視頻電話、高保真的立體聲電話會議、IP電話會議、遠程電話教學應用等。
針對局域網(wǎng)的網(wǎng)絡帶寬和用戶需求,開發(fā)出一套基于局域網(wǎng)用戶的網(wǎng)絡電話系統(tǒng)。由于局域網(wǎng)內的網(wǎng)絡帶寬可以達到10 Mb/s甚至是100 Mb/s的速率,因此,只要選擇了恰當?shù)膲嚎s算法,實現(xiàn)高質量的語音通訊是沒有問題的。而且在使用局域網(wǎng)的用戶中,計算機的普及率也是非常高的。這樣的系統(tǒng)在學校、企事業(yè)單位的局域網(wǎng)內將有非常好的推廣價值。
2 關鍵技術
本文所討論IP電話指的是計算機到計算機形式的IP語音電話。
為了實現(xiàn)計算機到計算機的語音通話,至少需要解決以下兩方面的問題:
(1)雙方都知道對方的網(wǎng)絡地址。
(2)同時運行IP電話語音通訊程序。
解決方案是:通過在系統(tǒng)中駐留一個資源占用率小的管理程序來監(jiān)聽呼叫請求;在建立通話時再調用IP電話通訊程序。
2.1 語音通訊
語音通訊的基本原理是:對模擬語音信號經(jīng)過模數(shù)轉換,進行編碼壓縮后,按一定的打包規(guī)則將壓縮幀轉換成IP數(shù)據(jù)包通過數(shù)據(jù)網(wǎng)進行傳輸,在目的地經(jīng)過數(shù)據(jù)解壓、數(shù)模轉換復原成話音,從而達到語音通信的目的。這部分是IP電話的難點,也是需要不斷進行改進的地方?偟哪繕耸窃诒WC通話服務質量(QoS)的前提下,盡可能減少網(wǎng)絡和系統(tǒng)資源的占用。在廣域網(wǎng)語音通訊中,現(xiàn)有技術還不能完全達到二者兼顧。所幸對于局域網(wǎng)用戶,現(xiàn)有的技術已經(jīng)勉強可以達到要求。
2.1.1 語音采集與數(shù)據(jù)壓縮
語音的采集采樣率的大小直接決定語音的清晰度和采集的原始數(shù)字數(shù)據(jù)量的大小。語音采集的原理是通過在離散的時間間隔采樣原始聲音并記錄每次采樣的數(shù)字來表示和重建聲音波形。采集的聲音數(shù)據(jù)的格式有很多標準,軟件的設計中一般采用波形數(shù)據(jù)的格式。Windows系統(tǒng)中可以采用WAVE_FORMAT_PCM即PCM(脈沖編碼調制)格式,其采樣率可以為數(shù)據(jù)流采樣后需要對音頻數(shù)據(jù)進行壓縮。采用什么樣的壓縮算法決定了壓縮率的大小,這也是整個網(wǎng)絡語音通信技術的核心和最關鍵的技術之一。IP電話網(wǎng)關為主的IP語音通信主要使用ITU定義的幾個語音編碼標準:G723.1,G728和G729。他們采用的都是混合編碼的方法,如G.729語音壓縮采用的算法是共軛結構的代數(shù)碼激勵線形預測(CSACELP),是基于CELP編碼模型的算法。
CODEC是一小段用于壓縮(Compress)及解壓縮(DECompress)數(shù)據(jù)流的代碼。CODECs可以是由操作系統(tǒng)本身附帶的幾種標準的CODECs,如:DSPGroup TrueSpeech CODEC和MSG723.1 CODEC等,也可由系統(tǒng)中所安裝的應用程序安裝其他的CODECs。微軟的Windows操作系統(tǒng)中,所有安裝的CODECs由音頻壓縮管理器(ACM)管理。
2.1.2 數(shù)據(jù)包傳輸
壓縮后打包的音頻數(shù)據(jù)需要通過IP協(xié)議在網(wǎng)絡中傳輸,但首先必須在傳輸層協(xié)議TCP或UDP中選擇其一。UDP包不具備TCP包復雜的可靠性與控制機制,當強調傳輸性能(例如延時特性)而不是傳輸?shù)耐暾詴r,如:音頻和多媒體應用,UDP是較好的選擇。
Winsock控件封裝了許多網(wǎng)絡傳輸所用到的API函數(shù)。通過Winsock控件,使網(wǎng)絡編程變得輕松。
2.2 信令系統(tǒng)
決定IP電話可用性的關鍵是要使雙方能夠知道對方的IP地址,這并不太容易做到。以往的IP電話往往將重點集中于語音通訊模塊的優(yōu)化而忽視了信令系統(tǒng)的改進。為了得到對方IP,可以通過其他通訊方式,例如E-Mail ,OICQ信使服務、普通電話等辦法獲得,但這樣就減少了系統(tǒng)的易用性;當然,也可以設置一個固定的“通話服務器”,采用類似于電信電話的“交換機”方式進行通話“路由”。但這樣做勢必造成服務器的負荷很重。此外,集中通過中轉也必然造成服務器擁塞和丟包,通話延遲和語音質量難以改進。
通過設置一個信令服務器的方式綜合以上兩種方式的優(yōu)缺點。用戶通話程序工作于半客戶機狀態(tài),信令服務器負責客戶的集中呼叫。當某一個客戶呼叫,服務器負責中轉呼叫,當被叫客戶響應呼叫并應答后,自主于呼叫方進行通話而不必經(jīng)過信令服務器,這樣,大幅度地減少了服務器的數(shù)據(jù)量。有了集中的信令服務器,也便于客戶的管理,還可進行廣播消息的發(fā)布。
信令與駐留的管理程序相互配合,共同實現(xiàn)IP電話的基本通話邏輯和其他附加功能。信令系統(tǒng)可以設計得很復雜,也可以很簡單,但必須完成以下功能:呼叫、應答、指示通話、掛斷等基本功能。
3 程序設計實現(xiàn)[1~3]
基于以上的技術和所在單位的網(wǎng)絡資源,筆者初步成功地開發(fā)了基于局域網(wǎng)的語音通訊軟件。軟件平臺為Windows 98/ME/2000/XP;硬件平臺為含全雙工聲卡、麥克風和音響的多媒體PC;開發(fā)工具為VisualBasic 6.0,VisualC++6.0和Delphi6.0。下面介紹具體的開發(fā)過程。
3.1 整體結構
本系統(tǒng)從邏輯上分為2個部分:客戶端和服務器端。
客戶端與服務器端之間的關系如圖1所示。
直接呼叫是指輸入對方的IP地址,然后向其發(fā)出呼叫請求;而通過服務器呼叫指的是向服務器提交要呼叫的用戶名,由服務器在數(shù)據(jù)庫中查找用戶,如果該用戶在線的話將該用戶的IP返回給客戶端,然后再由客戶端發(fā)出呼叫請求。
服務器端的數(shù)據(jù)庫中包含了所有用戶的資料。例如用戶的密碼、最后一次登錄時使用的IP地址、該用戶是否在線、該帳號是否被禁用等信息。服務器端程序利用Winsock控件來監(jiān)聽客戶端發(fā)來的請求,對接收到的客戶端發(fā)來的請求進行處理,提取出命令字及參數(shù),按照定義好的命令字完成相應的工作。
服務器完成的任務基本上都是被動的,大部分是響應客戶端發(fā)出的請求。但系統(tǒng)也提供了一個服務器端向客戶端發(fā)消息的功能,可選擇發(fā)送到任一當前在線的用戶,也可以選擇發(fā)送到所有在線用戶。
如圖2所示,客戶端由2個主要模塊組成:系統(tǒng)駐留模塊、語音通訊模塊。
整個系統(tǒng)最重要的模塊為系統(tǒng)駐留模塊。在客戶94端登錄時,該模塊把登錄請求提交給服務器;在成功登錄服務器之后呼叫服務器上的用戶時,該模塊負責向服務器提交查詢用戶請求。從服務器返回的消息也交給該模塊處理。在直接呼叫時,也是通過該模塊建立連接。當連接建立起來,還是由該模塊調用語音通訊模塊來實現(xiàn)語音通訊。而且以后對系統(tǒng)進行二次開發(fā)、插件接口也是基于該模塊的接口定義而開發(fā)的。
語音通訊模塊負責建立起連接之后的語音通訊功能。該模塊從聲卡采集音頻數(shù)據(jù)并壓縮,然后根據(jù)從系統(tǒng)駐留模塊獲得的IP地址參數(shù)來把數(shù)據(jù)流發(fā)送到對方主機。同時該模塊還負責對接收到的語音數(shù)據(jù)流進行解壓縮并利用聲卡播放出來的任務。
服務器端和客戶端系統(tǒng)駐留模塊使用VB開發(fā),語音通訊模塊和部分應用界面使用Delphi和VC開發(fā)。這是綜合考慮了VB在界面和數(shù)據(jù)庫設計方面的優(yōu)越性,以及VC和Delphi在系統(tǒng)應用程序開發(fā)上的高效率后做出的選擇。
3.2 信令系統(tǒng)的實現(xiàn)
在C/S模式中,消息命令字起到了非常重要的作用,服務器端與客戶端、客戶端與客戶端之間通過發(fā)送以消息命令字開頭的包含指定消息的字符串來實現(xiàn)溝通。收到指定的消息命令字就去執(zhí)行該消息命令字對應的操作。消息命令字可以是以字節(jié)形式組成的,也可以是以比特位形式組成的。本系統(tǒng)采用的是用固定長度的字符串組成的消息命令字,通過定義特殊的消息命令字(信令)來控制系統(tǒng)工作。為避免混淆規(guī)定:服務器端可以處理的信令長度為4個字符;客戶端可以處理的信令長度為6個字符。
以下是系統(tǒng)自定義的部分信令格式及其說明:
(1)服務器端接收來自客戶端的消息,命令字長度為4 B。參數(shù)在命令字之后,并且用“/”分開。
LGIN:用戶登錄服務器的命令字。
消息格式:LGIN/客戶端主機地址/用戶名/密碼/新密碼(如果為空則表示不修改密碼)
使用說明:如果服務器收到該命令字,將處理用戶的登錄請求。對客戶端提供的用戶名和密碼進行驗證,并返回驗證結果。如果用戶提供了新密碼,則在驗證通過的前提下,將該用戶密碼修改為新密碼。
CALL:通過服務器來呼叫其他用戶的命令字。
消息格式:CALL/客戶端主機地址/用戶名/呼叫的用戶名
使用說明:如果服務器收到該命令字,將處理用戶的呼叫請求。服務器對客戶端所呼叫的用戶狀態(tài)進行查詢,并返回查詢的結果。
QUIT:用戶從服務器退出的命令字。消息格式:QUIT/客戶端主機地址/用戶名
使用說明:如果服務器收到該命令字,將處理用戶的退出請求。
(2)客戶端接收來自服務器端的消息,命令字長度為6 B。參數(shù)在命令字的后面。
REJECT:用戶名或密碼錯誤的命令字。
使用說明:該命令字沒有參數(shù)。為了防止用戶進行暴力破解,所以不提供是用戶名錯誤還是密碼錯誤的消息。
ACCEPT:登錄被接納的命令字。
使用說明:當客戶端提供的用戶名和密碼均正確,而且該帳號沒有被禁用的時候,服務器返回該命令字,表示客戶端的登錄請求已經(jīng)被接納。
(3)客戶端接收來自客戶端的消息,命令字長度為6 B。參數(shù)在命令字之后,并且用“/”分開。
RECEIV:接收到請求的命令字。
消息格式:RECEIV/客戶端主機地址/用戶名
使用說明:如果客戶端收到該命令字,則表示用戶發(fā)送的請求已經(jīng)成功的到達對方。確定網(wǎng)絡傳輸沒有問題。
ANSWER:接受語音通話請求的命令字。消息格式:ANSWER/客戶端主機地址/用戶名
使用說明:如果客戶端收到該命令字,則表示語音通話的請求已經(jīng)被接受。客戶端開始調用語音通訊程序來實現(xiàn)語音通訊。 REFUSE:接收到請求的命令字。消息格式:REFUSE/客戶端主機地址/用戶名
使用說明:如果客戶端收到該命令字,則表示對方已經(jīng)拒絕了您的請求。這個請求是您發(fā)出的進行語音通話或者使用插件程序的請求。
3.3 語音通訊的實現(xiàn)
針對系統(tǒng)要求分別使用Delphi和VC開發(fā)了2個05獨立的語音通訊模塊,F(xiàn)在介紹使用Delphi6.0開發(fā)的語音通訊模塊。
語音采集與壓縮使用Windows提供的ACM(Audio Compression Manager,音頻壓縮管理器)函數(shù),ACM的聲明文件提供并只提供直接調用ACMAPI的功能。如果有必要直接使用低層功能,可以按照下面的步驟使用ACM API。
(1)制定輸入輸出格式
為了實現(xiàn)語音的網(wǎng)絡傳輸必須合理定義語音壓縮的各種參數(shù),只有正確地定義了語音壓縮的各種參數(shù),才能使語音在網(wǎng)絡中快速傳播,而不產生延遲,同時又能獲得清晰的音質。
可以使用waveFormatEX數(shù)據(jù)結構記錄聲音格式,這一數(shù)據(jù)結構在Delphi里是TwaveFormatEX,定義在MMSystem單元里。打開ACM流,可以通過調用acmStreamOpen函數(shù)實現(xiàn),格式請參考MSDNplatform SDK的內容。制定輸入輸出緩沖區(qū)的大小,可以調用acmStreamSize,使用acmStreamOpen函數(shù)返回的流句柄作為參數(shù)。生成的轉換頭得到ACM源緩沖區(qū)和目的緩沖區(qū)的地址。ACM不會自動分配內存,必須由應用程序申請內存。
(2)轉換數(shù)據(jù)
通過調用acmStream Converth函數(shù)實現(xiàn)。 acmStreamConvert函數(shù)包括流句柄和轉換頭句柄。這個函數(shù)通過設定轉換頭中的cbDstLength Used表明轉換過程中真正被使用的字節(jié)數(shù)。
(3)完成輸出以后,釋放資源。轉換頭用acm Stream Unperrepare Header函數(shù)來釋放,流用acmStreamclose來關閉。
經(jīng)過比較采用ACM控件實現(xiàn)語音的采集、壓縮、播放。這一組ACM控件包括3個Component: ACMDialog,ACMWaveIn和ACMWaveOut。
tmpformat.wBitsPerSample:=16;
//定義采樣位數(shù)為16
為了實現(xiàn)語音的采集,使用了控件TACMWaveIn,先為他開辟了一塊連續(xù)的緩沖區(qū),用控件TACMWaveIn的TACMWaveIn.Open事件來實現(xiàn)語音的采集。為了實現(xiàn)語音的播放,首先通過語句ACMWaveOut1.Open(@format);把采集到的經(jīng)過壓縮后的語音取出來。然后以流的方式,通過局域網(wǎng)傳送到另一個主機的緩沖區(qū)。最后,通過語句ACMWaveOut1.PlayBack(pdata,Adata.Size)進行播放。
網(wǎng)絡傳輸可以使用各種方法實現(xiàn),不同的方法需要不同的處理技巧。本系統(tǒng)使用INDY網(wǎng)絡控件中的TIDUdpServer和TIDUdpClient這2個網(wǎng)絡控件實現(xiàn),基本符合要求。
4 結 語
作者設計開發(fā)的這個IP電話系統(tǒng),經(jīng)過初步測試可以滿足局域網(wǎng)用戶正常的通話需求。由于時間的關系,系統(tǒng)的測試時間不是很長,仍然存在一定的缺陷。但在開發(fā)的過程中,各部分功能劃分比較明確,所以對問題出現(xiàn)的原因比較容易定位。
此外,同時開發(fā)出利用ASP語言編寫的網(wǎng)頁帳號申請系統(tǒng),他可以在Web服務的支持下實現(xiàn)通過網(wǎng)頁申請帳號的功能。出于用戶需求擴充的考慮,也特別制定了插件的開發(fā)標準?蛻艨梢愿鶕(jù)自身的需要而開發(fā)自己的插件,來實現(xiàn)系統(tǒng)功能的擴充。目前,局域網(wǎng)使用較為成熟,寬帶網(wǎng)的技術不斷發(fā)展,各種網(wǎng)絡語音通信產品的技術開發(fā)變得容易,基于上述技術的產品將得到更廣泛的應用。介紹和討論網(wǎng)絡語音技術可能會對這些產品的開發(fā)起到積極的作用。
參考文獻
[1]Microsoft Corporation.MicrosoftWindows用戶經(jīng)驗[M].北京:北京大學出版社,2001.
[2]韓冰.Delphi多媒體應用開發(fā)技術與實例[M].北京:清華大學出版社,2002.
[3]Microsoft Corporation.VisualBasic Activex控件參考手冊[S].1998.
中國通信網(wǎng)(www.c114.net)—現(xiàn)代電子技術