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