2014/05/04 meeteasy
IP電話以其低廉的價格,較好的通話質量,成為通信市場的有力的競爭者[1]。IP電話分為硬件電話和軟件電話兩類。硬件IP電話和傳統電話一樣使用方便,但需要額外的硬件投資。軟件IP電話產品目前主要是基于PC平臺,市場上基于wi—Fi手機的軟件IP電話產品還很少,因此,本文的研究具有較高的實用價值。
1、IP電話軟件的設計
1.1設計目標
本軟件的功能要求如下:①用戶之間完整的語音 交互,包括對語音數據進行采集編碼和利用RTP/RTCP實現語音的傳輸和控制;②呼叫控制,包括呼叫的建立、維護和終止;⑧注冊功能,即在指定的SIP服務器上注冊自己的號碼;④友好的圖形用戶界面。
1.2總體設計
在硬件平臺之上,共分為操作系統模塊、SIP信令模塊、實時語音處理模塊、應用程序管理模塊4個部分,如圖1所示。
①操作系統模塊。操作系統模塊是嵌人式應用軟件開發的基礎,屬于底層軟件開發。它將上層應用軟件與硬件設備分離開來。主要用途是為了驅動相應的硬 件設備,提供給上層應用軟件一個統一的系統調用接口,使上層與底層的開發在邏輯上分離。本文選用 Pocket PC2003操作系統。
②SIP信令模塊。SIP信令模塊主要是用于進行呼叫控制,包括SIP消息的構造與發送、消息的接收與解析、SDP消息的構造與解析以及雙方媒體協商以及UA終端注冊等功能。
③實時語音處理模塊。實時語音處理模塊包括了語音處理和實時媒體傳輸兩大功能,主要是用以完成在實時條件下,對語音進行采集、編解碼和播放,以及語音媒體數據包的RTP封裝與分解以及數據包的發送和接收。
④應用管理模塊應用管理模塊是主控模塊,用于實現終端程序的初始化,創建工作線程,控制其他各模塊,并且是與用戶進行交互的接口,負責在全局上控制和管理其他各 模塊的工作和通信,負責整個系統的呼叫發起、呼叫響應及呼叫結束的動作。主要完成了本用戶代理終端的注冊以及終端之間的會話。
2、IP電話軟件的實現
2.1 操作系統模塊的實現
本文使用Platform Builder實現操作系統模塊的配置與編譯。首先創建新的Platform并命名,接著對該Platform做配置,再進行編譯,得到二進制系統鏡像,并輸出SDK安裝包。
2.2 SIP信令模塊的實現
SIP信令模塊的功能由SIP協議棧完成。用于提供SIP操作所需的基本數據結構和應用程序編程接口API。包括了用于表示SIP中各種對象(如SIP消息、各種頭域以及SDP消息體等)的數據結構以及對消息、消息體進行解析和封裝的API。
在嵌入式系統中,對SIP協議棧的要求是盡可能精簡、高效并且方便使用和移植。因此,在本系統中,使用基于C語言開發的開源協議棧PJSIP E2]為基礎,并根據具體情況進行了相應的修改,然后移植到開發板。 PJSIP的主要特點如下:①移植性強,可以方便地移植到各個目標平臺;②協議棧占用空問極少,核心部分少于150kB,并且提供完整的SIP功能;⑧高效的處理能力;④提供SIP的完整功能以及大量擴展功能;⑤優秀的文檔資料。
2.3實時語音處理模塊的實現
實時語音處理模塊主要負責語音采集與回放、語音數據編解碼和語音數據RTP實時傳輸。
2.3.1 語音采集與回放
在PJSIP中,提供一組高級的音頻采集與回放的接口抽象層,封裝了各種底層的音頻處理方式,使得程序的移植性更強。其接口抽象函數主要包括:
①pjmedia_snd_open():打開音頻設備并配置相關參數,然后進入等待狀態。②pjmedia_snd_stream start():啟動音頻流的播放或者錄音。③ pjmedia_snd_stream_stop():停止音頻流的播放或者錄音。④pjmedia_snd_stream close():關閉打開的音頻流。
2.3.2語音的編解碼
PJSIP中的高層類庫PJMEDIA-CODEC提供了各種常用的語音編解碼方案,包括G.711, GSM06.10,iBLC,L16,Speex等。本系統中,我們選用Speex語音編解碼方案。
Speex是一個專門針對VoIP設計的開源的音頻編解碼標準。它是GNU項目的組成部分之一,是一個基于CELP的語音編解碼器。Speex的設計目標是提供較高的會話質量和較強的帶寬適應能力,在對語音數據的壓縮比、失真度、還原能力處理上要明顯優于其他一些音頻編解碼方式。Speex能適應2kbps到 44kbps之間的傳輸速率,可以在絕大部分的網絡條件下正常工作,尤其在低比特率傳輸時與同類編解碼器比較更具優勢。因此,Speex非常適用于Internet上的語音應用。
2.3.3 語音的RTP實時傳輸
RTP是一種建立在UDP基礎上的用于多媒體數據實時傳輸的協議。
PJSIP中提供了RTP傳輸功能,主要接口定義如下:
①pimedia_rtp_session init():初始化一個 RTP會話。②pjmedia_rtp_encode rtp():根據RTP會話狀態以及填入的參數,生成一個RTP頭部數據。③pjmedia_rtp_decode_rtp():解碼一個收到的RTP包,分解為RTP頭部和RTP凈荷。
2.4應用管理模塊的實現
本模塊主要完成注冊和管理用戶代理(UA)之間 的會話功能。應用管理模塊的運行流程如圖2所示。
2.4.1終端注冊
終端啟動上線后,通過用戶代理客戶機自動向所 在域的服務器端發送注冊請求;該服務器的SIP注冊 服務模塊收到注冊請求后,對其進行身份驗證。終端注冊主要代碼如下:
pjsua_acc_config cfg;
pjsua_ace_config_default(&cfg);/*初始化一個賬戶信息*f
cfg.id=pJ_str(”sip:”+m_user+“@”+m_domain); /*以下配置賬戶信息*/
efg.cred_count_1;
cfg.cred_info[O].realm_pjstr(domain);
cfg.cred_info[O].scheme_Pi_str(“digest”);
cfg.cred_info[0].username_PJ_str(“username”);
cfg.cred_info~0].data_type_PJSIP_CRED_DATA_ PI AIN_PASSWD;
cfg.cred_info[O].data_PJ_str(“password”);
status_pjsua_acc_add(&cfg,PJ_TRUE,&acc_id) /*發出注冊請求*/
if(status!=PJ_SUCCESS)
error—exit(“Error registration.”);
/*注冊成功*/
…
2.4.2 會話控制
終端完成注冊后,進入等待狀態,等待主動發起呼 叫或者被動接收呼叫。
①主叫模式。該模式下,本終端作為一個UAC, 主動完成對遠程UAS的呼叫。主要由函數pjsua call make call()完成主叫功能。
②被叫模式。該模式下,本終端作為一個UAS, 在默認端口5060接收遠程UAC發來的會話請求并 回應。主要由兩個回調函數on_incoming_call(),和 on_call_media_state()完成被叫應答功能。配置回調函數代碼如下:
efg.cb.on_incoming_call=&on_incoming_call;
cfg.cb.on_call_media_state_&on_call_media_state;
3、測試與結論
3.1測試平臺
本IP電話軟件以帶有Pocket PC2003操作系統 的wi—Fi功能的智能手機為軟、硬件平臺上。本文采用如圖3所示的測試平臺。
其中,WiFi Phone為運行IP電話軟件的通話終端,是主要的測試對象;Brekeke SIP Server是一個SIP服務器;筆記本電腦上運行X—Lite軟件作為測試VoIP通話的對端,并且通過筆記本電腦上的無線網卡與Airopeek抓包軟件,完成抓取無線網絡數據包的工作,以供分析。
4、結論
通過測試表明,該系統能夠對SIP信令過程進行 很好的控制,從而完成注冊、呼叫、語音通信、呼叫撤銷 等基本功能。本終端除了可以與X—Lite互通,與 KPhone、Linphone也進行了互通測試,都可以進行正 常的呼叫建立與語音通信,說明本系統互通性良好。 本軟件在局域網內語音通話品質較好,沒有出現 明顯的延遲和回音,實現了VoIP的基本功能需求,但 其在惡劣的網絡環境下的性能不太理想,有待于進一步提高。
40088 411661033743080@qq.com
中國廣東省深圳市南山區西麗九祥嶺工業區10棟3樓