林巧 唐余亮
【摘要】目前SIP協(xié)議在VoIP中的應(yīng)用越來越廣泛,許多VoIP系統(tǒng)都采用SIP作為它們的信令通信協(xié)議,在實(shí)現(xiàn)VoIP系統(tǒng)的過程中對(duì)于SIP協(xié)議棧的選擇及應(yīng)用就顯得非常重要。本文設(shè)計(jì)一種軟電話,利用eXosip協(xié)議來進(jìn)行信令交互,只要在同一網(wǎng)內(nèi),就可以不受限制的進(jìn)行通話。
【關(guān)鍵詞】SIPOsipeXosip軟電話
一、引言
eXosip2是Osip2的一個(gè)擴(kuò)展協(xié)議集,它部分封裝了Osip2協(xié)議棧,使得它更容易被使用。本文利用Osip協(xié)議和ORTP來構(gòu)造出一個(gè)VoIP通話系統(tǒng),考慮到以后智能終端的軟件移植,采用在Linux環(huán)境下開發(fā)。
二、Osip2協(xié)議棧簡介
Osip是按照RFC3261(SIP)和RFC2327(SDP)標(biāo)準(zhǔn),并使用標(biāo)準(zhǔn)C編寫的一個(gè)開放源代碼的SIP協(xié)議棧,具有短小簡潔的特點(diǎn),主要提供一些解析SIP/SDP消息的API和事務(wù)處理的狀態(tài)機(jī)。雖然在底層解析時(shí)效率比較高,但缺點(diǎn)也很明顯,首先就是可用性差,沒有很好的API封裝,使得上層應(yīng)用在調(diào)用協(xié)議棧時(shí)很破碎;其次,只做到了transaction層次的協(xié)議過程解析,缺少call、session、dialog等過程的解析,這也增加了使用的難度;再次,缺少線程并發(fā)處理的機(jī)制,使得它的處理能力有限。
三、eXosip2特點(diǎn)
eXosip是Osip2的一個(gè)擴(kuò)展協(xié)議集,其在Osip2的基礎(chǔ)上部分封裝了Osip2協(xié)議棧,使其更容易被使用。eXosip使用UDP socket套接字實(shí)現(xiàn)底層SIP協(xié)議的接收/發(fā)送;使用定時(shí)輪循的方式調(diào)用Osip2的事務(wù)處理函數(shù),這部分是協(xié)議棧運(yùn)轉(zhuǎn)的核心。通過添加/讀取事務(wù)消息管道的方式,驅(qū)動(dòng)事務(wù)的狀態(tài)機(jī),使得來自遠(yuǎn)端的SIP信令能匯報(bào)給調(diào)用程序,來自調(diào)用程序的反饋能通過SIP信令回傳給遠(yuǎn)端;增加了對(duì)各個(gè)類型事務(wù)的超時(shí)處理,確保所有資源都能循環(huán)使用,不會(huì)被耗用殆盡;使用jevent消息管道來向上通知調(diào)用程序底層發(fā)生的事件,調(diào)用程序只要讀取該消息管道,就能獲得感興趣的事件,進(jìn)行相關(guān)的處理。雖然eXosip較Osip2實(shí)用性更強(qiáng),但其局限于UA的實(shí)現(xiàn),使得用于registrar,sip server等時(shí)極其不容易。此外,它并沒有增加線程并發(fā)處理的機(jī)制,而且只實(shí)現(xiàn)了音頻支持,缺少對(duì)視頻和其他數(shù)據(jù)格式的支持。
綜合考慮,使用Osip2和eXosip協(xié)議棧的組合來實(shí)現(xiàn)SIP協(xié)議是很成功的選擇。當(dāng)然,在不同的應(yīng)用場合,必須添加其他模塊來實(shí)現(xiàn)更加復(fù)雜的功能。
四、SIP軟電話的設(shè)計(jì)
4.1系統(tǒng)環(huán)境搭建
如果在Windows下進(jìn)行程序開發(fā),會(huì)有很多集成開發(fā)環(huán)境,如Visual C++等,這些IDE都已經(jīng)很成熟。但在Linux下,開發(fā)C程序,一般都很少在IDE下進(jìn)行開發(fā),而是利用Linux下的編輯器來編寫程序,如vi,gedit等,然后用gcc編譯器來進(jìn)行編譯、連接生成所要的可執(zhí)行程序。本文設(shè)計(jì)的SIP軟電話程序中要用到各種庫,用來搭建整個(gè)程序的運(yùn)行環(huán)境。首先要安裝libosip2和libeXosip,然后安裝ortp庫。因?yàn)殚_發(fā)的是具有圖形界面的gnome程序,所以要安裝gtk+庫。
4.2系統(tǒng)分析
由上可以看出,整個(gè)系統(tǒng)分為五部分:主函數(shù)部分,負(fù)責(zé)監(jiān)控和傳輸信號(hào)變量進(jìn)行控制與調(diào)度;SIP部分,負(fù)責(zé)進(jìn)行信令傳輸和RTP通話時(shí)的參數(shù)傳輸;RTP部分,負(fù)責(zé)RTP會(huì)話建立,參數(shù)設(shè)置,發(fā)送和接收數(shù)據(jù);G.711部分,負(fù)責(zé)語音數(shù)據(jù)的編解碼;最后是用戶界面,作為用戶接口,負(fù)責(zé)傳送用戶設(shè)置的參數(shù)和撥打的號(hào)碼,以及顯示狀態(tài)信息等。
運(yùn)行SIP軟電話的主程序,初始化各種庫,然后向SIP服務(wù)器進(jìn)行注冊(cè)。如果注冊(cè)成功,生成用戶界面,監(jiān)聽用戶輸入,同時(shí)啟動(dòng)UAS線程,進(jìn)行監(jiān)聽(接收)SIP消息。以語音通信來說,此時(shí)應(yīng)用程序只需保存Osip協(xié)議棧的狀態(tài),然后調(diào)用語音處理模塊來接收/發(fā)送語音包就可以實(shí)現(xiàn)基于SIP的語音通信了。
五、總結(jié)
本文利用SIP和RTP庫:libosip2,libexosip2,libortp在Linux下面編程實(shí)現(xiàn)了一個(gè)SIP軟電話程序,并通過gnome編寫了一個(gè)界面。此SIP軟電話程序可以在Linux下穩(wěn)定運(yùn)行,通話質(zhì)量良好,并且提供很好的用戶接口,來設(shè)置參數(shù)和管理數(shù)據(jù)(如用戶地址等)。基本上是一個(gè)較穩(wěn)定的通話系統(tǒng)。當(dāng)然,這個(gè)軟電話還有一些不足,以后可以將它完善,編成一個(gè)界面友好,可以進(jìn)行視頻通話和多路通話的軟電話;同時(shí)利用更好的編解碼協(xié)議來完善,節(jié)約帶寬。
參考文獻(xiàn)
[1]李軍,謝贊福,崔懷林.基于SIP的語音通信程序設(shè)計(jì)與實(shí)現(xiàn).計(jì)算機(jī)工程,2005,31(24):117-119
[2]高麗平,邱志亮. Linux上基于SIP的IP軟電話的設(shè)計(jì)與實(shí)現(xiàn).北京:電子科技學(xué)院學(xué)報(bào),2005,13(4):72-74
[3] Camarillo G. SIP揭密.北京:人民郵電出版社,2003