1. 程式人生 > >我的SIP開發之路

我的SIP開發之路

lib 介紹 工作室 pjsip 開發人員 別人 想象 好的 分享

http://hi.baidu.com/ltlovelty/blog/item/837baf1ece7fc6f11ad57647.html

經過對SIP協議和開源協議棧快半年的研究,我現在終於有點入門了。還記得當時剛剛接觸這個敬仰已久的東東的時候,那個頭大啊,畢竟它的協議族太大了,每個知識點都可以無限延伸,光是鑒權機制就讓我花了不少精力。面對我的是大堆大堆的英文協議和代碼,看得我是應接不暇啊~~ 還好挺過來了,下面分享下我的經驗吧。

首先,推薦幾個不錯的資源給剛剛接觸SIP的朋友們:

(1)深圳一位好心的大牛翻譯的SIP協議中文版,對於和我一樣看英文頭暈的人絕對是個好東西啊,網上很多論壇都能下到,找不到的朋友給我發郵件吧,我這資料還是比較全的,呵呵~~;

(2)《74 Open Source VoIP Apps》,這個是國外的人總結的,對於選擇合適的開源協議棧是很有幫助的,裏面對於UA、Proxy、Test toots和RTP stack都按照開發平臺進行了分類和介紹,當時就是這個文章給我指了條明路啊;

(3)當然遇到模糊的概念的時候,RFC才是王道,可以到IETF的網站去找了(http://www.ietf.org/);

(4)強力推薦新力工作室的博客(http://www.i170.com/user/gatekeeper/ArtList/sip/P1/L),上面有大量很贊的文章,去看看絕對有意想不到的驚喜;

(5)還有一些開源網站也會對SIP進行很有針對性的介紹,可以花很少的時間去了解一些開發中需要註意的關鍵點,例如http://www.sipdev.org/wiki/index.php/A_newcomer‘s_guide_to_SIP和http://www.iptel.org/sip/intro。

此外,還有一個幫助學習SIP很好的方法那就是抓包了(抓包軟件例如Sniffer等等,甚多),雖然現在很多協議棧都把組合消息的工作替我們做了,但是閱讀SIP消息可以加深對協議的理解,而且可以幫助我們寫出兼容性更強的軟件,畢竟有些頭域在一些協議棧中是不支持的。

對於SIP協議棧的選擇我還是著實下了翻苦工,查閱無數開源網站啊!(估計也就10幾個吧,呵呵),在UA開發中我因為要考慮往DSP平臺的移植,只能選擇純C開發的棧,一開始看大家都推薦osip/exosip,於是也用了很長一段時間,但是現在改用pjsip了,哈哈,不得不要向大家隆重推薦一下了。不是因為osip不好,是因為pjsip太好了(說到這有點激動,畢竟花了快半個月時間找一個適合我自己的開源庫還是很值得啊),osip/exosip的體積比較小,很適合做嵌入式開發,也並不像網上有的人說的有很多bug。

pjsip的官網如下(http://www.pjsip.org/)。說說它的幾大好處吧!

(1)支持太多的平臺了,甚至有symbian,牛!

(2)代碼層次非常清晰,從低級到高級都提供了很方便的接口供開發;

(3)提供相當多的測試用例和一個基於pjsip開發的命令行UA程序供開發人員參考;

(4)文檔相當完善,幾乎無所不包,這對於開發者來說是很強大的支持;

(5)經過我的大量測試驗證它十分穩定(這個似乎不太權威,呵呵)。

對於SIP proxy的開發一開始選擇的是openser,這個功能非常強大的庫代碼也很龐大,基於C開發,加上是在linux上開發的,讓我對它望而卻步(本人的linux開發很菜)。最終選擇了reSIProcate(http://www.resiprocate.org),這個是基於C++開發的庫,面向對象的思想還是能減少我們不少的開發工作量。reSIProcate受到了很多商業項目的青睞,比較穩定。repro是reSIProcate項目的SIP proxy,它內置了數據庫和Web administrator,這一點是我比較看重的。reSIProcate的網上資料和官方文檔都不是很多,還好它的結構還是很清晰的,多多研究代碼了。

開源的sip服務器端,使用過的最好用的是Asterisk,標準C程序實現,代碼清晰。

sip的client相對比較多,個人使用過有exosip,pjsip和opal。

根據使用經驗,exosip簡單易用,在PC上用比較方便。但是涉及的相關資源太多,用了osip,srtp,ms2等眾多的開源庫,ms2下面還用到了ffmpeg,別的不說,光編譯就是噩夢。

opal功能最強,雖然也用到了ffmpeg ,但是自己封裝的非常好,采用插件方式,調用靈活。opal采用class方式提供封裝,接口非常友好。感覺唯一不爽的地方,就是低層使用了ptlib,雖然多平臺下都很好用,但放在嵌入式下感覺稍龐大了一些。

pjsip精巧,方便移植,嵌入式下應該是首選。不過視頻頻支持方面擴展起來比opal麻煩。個人感覺,對於windows開發者來說,pjsip最大的好處就是代碼調試方便。整個工程一次編譯通過,另外兩個庫還要找很多相關的資源。

其他的一些協議棧也調試過,比如reSipphone,好象是這個名字,還有Yate,不過從快速開發角度看,都不太合適。

現在搞sip開發的,一開始就是先找好協議棧。我開始時也是,滿天找別人的例子,可惜的很,完整的Demo總是找不到。linphone,ekiga什麽的,但龐大。對於剛開始做的,最好是一個精簡的demo。後來找到pjsip下面的幾個例子,慢慢地了解了sip的工作流程,當然少不了抓包工具和tcpdump。

不過,其實,sip沒有想象中的那麽麻煩。現在回頭看,剛開始做項目,使用協議棧絕對不是好想法。如果換個方向,先熟悉SIP基本協議,然後自己改造一個,或完全寫一個,可能效果更好。

我的SIP開發之路