<a href="http://hi.baidu.com/ltlovelty/blog/item/837baf1ece7fc6f11ad57647.html" target="_blank">http://hi.baidu.com/ltlovelty/blog/item/837baf1ece7fc6f11ad57647.html</a>
經過對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基本協定,然後自己改造一個,或完全寫一個,可能效果更好。