售前電話
135-3656-7657
售前電話 : 135-3656-7657
VoIP(Voice over Internet Protocol)即首先數(shù)字化語音信號并壓縮成幀,轉(zhuǎn)換為IP數(shù)據(jù)包在網(wǎng)絡(luò)上傳輸,以此完成語音通話的業(yè)務(wù),是一種利用IP協(xié)議傳輸語音數(shù)據(jù)的、新興的通信技術(shù)。
隨著我國三網(wǎng)融合的推進(jìn),VoIP與IPTV(Interactive Personality TV)一起成為這一龐大工程的重要標(biāo)志。而目前手機(jī)中,VoIP的解決方案并不是很多,特別是在Google公司推出的開源操作系統(tǒng)Android中。盡管該系統(tǒng)推出時間不長,憑借強(qiáng)大的功能、良好的界面、廣泛的商業(yè)支持,為用戶帶來很好的體驗,成為2010年最熱門且發(fā)展最快的手機(jī)操作系統(tǒng)。因此,兩者的結(jié)合,將是未來的發(fā)展趨勢。本文提出一種基于PJSIP協(xié)議棧的解決方案,通過Android本地開發(fā)工具(NDK),實現(xiàn)一個高效、穩(wěn)定且功能強(qiáng)大的VoIP系統(tǒng),具有較高的參考和實用價值。
VoIP設(shè)計方案
設(shè)計目標(biāo)
本方案所設(shè)計的系統(tǒng)包含以下功能:首先,完成用戶終端(如手機(jī))中語音數(shù)據(jù)的采集與編碼,并通過RTP(實時傳輸協(xié)議)/RTCP(RTP傳輸控制協(xié)議)進(jìn)行傳輸和控制;其次,完成會話的控制,包括會話的注冊、發(fā)起、維護(hù)與結(jié)束、注銷等;再次,作為一個應(yīng)用程序,必須實現(xiàn)一個良好的界面,與用戶交互;最后,作為一個開放系統(tǒng),需具有良好的可擴(kuò)展性。
總體設(shè)計
本方案基本上符合Android的NDK框架的開發(fā)規(guī)范,將系統(tǒng)分為4層,如圖1所示。最上層為應(yīng)用層,該層將在Android SDK的框架內(nèi),采用Java語言來實現(xiàn);第二層為JNI層,SIP協(xié)議棧有很多種實現(xiàn),其中,采用C語言的SIP協(xié)議棧在效率、速度、系統(tǒng)占用方面有著超越其他庫(如Java協(xié)議棧)的優(yōu)勢,因此,該方案將在第三層采用純C語言實現(xiàn)的PJSIP協(xié)議棧。為了讓Java應(yīng)用層能調(diào)用協(xié)議棧層,在兩層之間需要一個銜接的橋梁,這就是JNI層。最后一層是驅(qū)動層,這部分一般是由手機(jī)廠商來實現(xiàn)的,本文將不做重點介紹。
VoIP的具體實現(xiàn)
這里將實現(xiàn)一個完整的VoIP系統(tǒng),包括協(xié)議棧的實現(xiàn)、JNI的編寫以及上層UI的設(shè)計實現(xiàn)等。
SIP協(xié)議棧及UA
SIP協(xié)議棧直接關(guān)系到整個系統(tǒng)的質(zhì)量與效率,本文將采用純C語言開發(fā)的PJSIP庫。該庫采用C語言開發(fā),且源碼開放,在兼容性與效率上有明顯優(yōu)勢,不僅體積小(完整的SIP封裝也不過150 KB),同時還實現(xiàn)了一個內(nèi)存池,使得安全系數(shù)與運行效率大為提高,該系統(tǒng)所采用的就是優(yōu)化后的PJSIP庫。
PJSIP協(xié)議棧
PJSIP協(xié)議棧遵循標(biāo)準(zhǔn)的SIP協(xié)議,采用分層架構(gòu):SIP/SDP消息編碼解析層、傳輸管理層、SIP終端、事務(wù)層、會話層以及應(yīng)用層等。由于SIP協(xié)議采用文本消息發(fā)送請求和響應(yīng),所以首先需要將SIP消息按照巴斯克范式(ABNF)編碼和解析,這就是SIP/SDP消息編碼解析層所完成的功能。傳輸管理層用來管理用戶代理與服務(wù)器之間的請求和相應(yīng);SIP終端是PJSIP中轉(zhuǎn)機(jī)制的實現(xiàn),它主要負(fù)責(zé)管理各個SIP組建,例如像SIP終端實例注冊組件,分發(fā)消息到事務(wù)層、會話層及應(yīng)用層,回傳處理結(jié)果,管理定時器、I/O隊列等;事務(wù)層通過狀態(tài)機(jī)機(jī)制管理SIP信令,每一次狀態(tài)機(jī)狀態(tài)的改變都將觸發(fā)回調(diào)函數(shù);會話層負(fù)責(zé)會話的發(fā)起與響應(yīng),一般與應(yīng)用層結(jié)合在一起,用于用戶交互,不同的平臺有不同的實現(xiàn),本文使用Andriod的GUI來實現(xiàn)。
PJSIP是一個高度封裝的庫,實際上它是通過PJSUA子庫來實現(xiàn)應(yīng)用的。一個完整的PJSUA生命周期,首先需要初始化,通過函數(shù)init()來實現(xiàn)。在這個函數(shù)中,將創(chuàng)建代理、初始化變量和堆棧,以及創(chuàng)建一個UDP傳輸并在最后啟動代理;第二步將為UA添加用戶,如果需要的話,還要向服務(wù)器注冊用戶;當(dāng)用戶添加成功后,此時可以建立一個呼叫連接,發(fā)起會話;當(dāng)會話連接成功后,就可以使用SRTP協(xié)議實時傳輸加密后的數(shù)據(jù),進(jìn)行通話。最后的過程是掛起或銷毀呼叫。
UA(User Agency)是協(xié)議棧的具體實現(xiàn),PJSIP通過封裝了的PJSUA來實現(xiàn),在這一點上,大部分的SIP庫都大同小異,在此將介紹UA的工作原理。