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