李玲玲
摘要:PJSIP是一個開源的SIP協(xié)議棧,作為基于SIP的一個多媒體通信框架,它提供了非常清晰的API,實現(xiàn)了SIP、SDP、RTP、STUN、TURN、ICE等協(xié)議,以及NAT穿越的功能。PJSIP具有非常好的移植性,幾乎支持現(xiàn)今所有系統(tǒng):從桌面系統(tǒng)、嵌入式系統(tǒng)到智能手機。PJSIP支持語音、視頻、狀態(tài)呈現(xiàn)和即時通訊。PJSIP具有非常完善的文檔資料,對開發(fā)者是很友好的。本文基于PJSIP協(xié)議實現(xiàn)了Windows平臺下的音視頻通信系統(tǒng),其功能包括SIP賬號注冊、音視頻通信、狀態(tài)呈現(xiàn)等。通過在Windows 7操作系統(tǒng)下的測試表明,SIP通信系統(tǒng)的各項功能運行穩(wěn)定,對PJSIP修改的部分也達到了預(yù)期的效果。系統(tǒng)還具有良好的可擴展性,后期可以在此基礎(chǔ)上進行更多的功能實現(xiàn)。
關(guān)鍵詞:PJSIP;FreeSwitch;SIP
中圖分類號:TN911-34 文獻標(biāo)識碼:A 文章編號:1009-3044(2018)23-0241-03
Abstract: PJSIP is a free and open source multimedia communication protocol stack. As a multimedia communication framework based on SIP, PJSIP provides a very clear API, and implements standard based protocols such as SIP, SDP, RTP, STUN , TURN, ICE, and NAT traversal function. PJSIP has a very good portability, almost supporting all the existing systems ranging from desktops, embedded systems to mobile handsets.It supports audio, video,presence, and instant messaging,PJSIP has perfect documents and is very friendly to developers.Based on the PJSIP stack,I realize an audio and video communication system in the Windows platform.Its functions include the SIP account registration,audio and video communication,status presence,etc.Tests under Windows 7 operating systems demonstrate that all function of the SIP communication system works stably,the modification of PJSIP also achieved the expected affect.The system also has good extensibility and we can add more functions to it in the future.
Key words: PJSIP; FreeSwitch; SIP
1 PJSIP的簡介
PJSIP是一個開源的SIP協(xié)議棧,支持多種SIP的擴展功能,作為基于SIP協(xié)議的一個多媒體通信框架,它提供了非常清晰的API,實現(xiàn)了SDP、RTP、SIP、STUN、TURN、ICE等協(xié)議,以及NAT穿越的功能。并且具有非常好的移植性,幾乎支持現(xiàn)今所有系統(tǒng):從桌面系統(tǒng)、嵌入式系統(tǒng)到智能手機。同時支持語音、視頻、狀態(tài)呈現(xiàn)和即時通訊。它具有非常完善的文檔,對開發(fā)者是很友好的。PJSIP由Benny Prijono、Perry Ismangil在2005年創(chuàng)建,之后不久,Nanang Izzuddin、Sauw Ming加入開發(fā)團隊。2006年成立Teluu Ltd.,成為開發(fā)和維護PJSIP的公司。PJSIP采用雙License:GPLv2以及商業(yè)許可證,開發(fā)者可以根據(jù)需要選擇不同的License。
1.1 PJSIP框架
PJSIP包括:PJSIP - Open Source SIP Stack[開源的SIP協(xié)議棧]、PJMEDIA - Open Source Media Stack[開源的媒體棧]、PJNATH - Open Source NAT Traversal Helper Library[開源的NAT-T輔助庫]、PJLIB - UTIL - Auxiliary Library[輔助工具庫]、PJLIB - Ultra Portable Base Framework Library[基礎(chǔ)框架庫]、PJSUA-LIB等模塊。
其中PJSIP包含:CORE、SIMPLE、UA三個模塊,在PJMEDIA中包含了CODEC模塊。PJSIP的框架圖如圖1所示。
1.2 PJLIB框架
PJLIB是整個PJSIP庫的基礎(chǔ),所有的子模塊都是依賴于PJLIB,它主要實現(xiàn)對平臺的抽象,屏蔽了不同操作系統(tǒng)之間的差異,向上為PJSIP框架的業(yè)務(wù)相關(guān)模塊提供統(tǒng)一的接口。PJLIB提供的接口涉及如下幾個方面:
1) 內(nèi)存池方式的內(nèi)存分配。
2) OS抽象。
3) 網(wǎng)絡(luò)相關(guān)的支持。
4) 時間管理。
5) 各種工具性的數(shù)據(jù)結(jié)構(gòu)。
6) 異常處理。
7) LOG機制。
8) 隨機數(shù)及GUID的產(chǎn)生。
1.3 PJLIB-UTIL
PJLIB-UTIL是輔助工具庫。提供的輔助工具包括:
1) 提供命令行操作的接口。
2) 提供加密算法,如Base64、CRC32、MD5、SHA1等。
3) 文本跟字符串處理。
4) DNS協(xié)議處理。
5) 文件讀寫的處理,如JSON、XML解析處理。
1.4 PJNATH
PJNATH是開源的NAT穿越輔助庫,提供了標(biāo)準(zhǔn)的基于NAT的穿越方案。
1.5 PJMEDIA
PJMEDIA是開源的媒體棧,支持很多音視頻格式的處理、具有移植性強、代碼精簡、媒體處理質(zhì)量優(yōu)秀、對硬件支持度高以及擴展性良好等優(yōu)點。PJMEDIA還對SIP中的SDP協(xié)商提供部分支持,主要為SIP協(xié)議提供可傳輸?shù)拿襟w類型。在通信雙方的SDP溝通協(xié)商過程中,最終商定的傳輸媒體類型主要由PJMEDIA模塊提供支持。
1.6 PJMEDIA-CODEC
PJMEDIA-CODEC是一個靜態(tài)庫,它包含了各種編解碼器的實現(xiàn),對上層模塊通過提供PJMEDIA-CODEC框架來便于進行編解碼處理,該框架屏蔽了下層各個編解碼器的細節(jié)。
1.7 PJSIP、PJSIP-SIMPLE
PJSIP、PJSIP-SIMPLE是實現(xiàn)標(biāo)準(zhǔn)SIP協(xié)議以及SIMPLE擴展協(xié)議的SIP棧。
1.8 PJSIP-LIB、PJSUA-LIB
PJSIP-LIB以及PJSUA-LIB主要包含pjsua2和pjsua。其中pjsua2是面向?qū)ο蟮腃++語言實現(xiàn),pjsua是面向過程的C語言實現(xiàn)。pjsua2封裝了pjsua,為上層應(yīng)用提供面向?qū)ο蟮慕涌?。這兩個庫封裝了PJSIP框架底層的SIP棧、媒體處理及NAT穿越等功能,提供更高級的面向網(wǎng)絡(luò)電話業(yè)務(wù)的接口。
2 PJSIP配置和編譯
從www.linphone.org下載如下文件:linphone-3.5.2.tar.gz、libeXosip2-3.3.0.tar.gz、libosip2-3.3.0.tar.gz、 speex-1.2rc1.tar.gz、linphone-deps-win32-120218.zip。其中l(wèi)inphone-3.5.2.tar.gz主要包含linphone、oRTP、mediastreamer2,libosip2-3.3.0.tar.gz主要包含osip、osipparser2,libeXosip2-3.3.0.tar.gz為eXosip2; speex-1.2rc1.tar.gz在編譯mediastreamer庫時需要。linphone-deps-win32-120218.zip包含運行所需的庫及配置文件等。
2.1 編譯osipparser2庫、eXosip庫、osip庫
這三個庫下載的只有源碼,沒有vs項目文件,需要新建osipparser2、eXosip、osip三個項目。
以osippparser2為例,創(chuàng)建空的動態(tài)庫項目,項目名為osipparser2,將libosip2-3.1.0/src/osipparser2文件夾下的文件全部復(fù)制到剛創(chuàng)建的項目根目錄下,并將所有的源文件和頭文件都加入項目內(nèi),同時將libosip2-3.1.0中的INCLUDE文件夾導(dǎo)入到創(chuàng)建的工程中,編譯鏈接即可生成osipparser2.dll。
以osippparser2為例,創(chuàng)建空的靜態(tài)庫項目,項目名為osipparser2,將libosip2-3.1.0/src/osipparser2文件夾下的文件全部復(fù)制到剛創(chuàng)建的項目根目錄下,并將所有的源文件和頭文件都加入項目內(nèi),同時將libosip2-3.1.0中的INCLUDE文件夾導(dǎo)入到創(chuàng)建的工程中,編譯鏈接即可生成osipparser2.lib。
要注意的是此處需新建def文件,在文件中添加要導(dǎo)出的接口函數(shù)。osip2和eXosip方法類似,不再贅述。
2.2 編譯oRTP庫、mediastreamer2庫
oRTP源碼包中已經(jīng)有對應(yīng)的vs項目,無需做任何修改可直接編譯運行生成對應(yīng)的庫文件。mediastreamer2源碼包雖然有vs項目,但還需要稍作修改才可編譯:在項目屬性中添加一條宏定義:MS2_INTERNAL,然后刪除文件gsm.c,再添加qualityindicator.c、bitratecontrol.c、audioconference.c、eventqueue.c、bitratedriver.c 到工程中。
2.3 創(chuàng)建phonecore
在linphone/coreapi中沒有提供相應(yīng)的vs項目,需新建動態(tài)鏈接庫項目,將linphone/coreapi文件夾中除test_lsd.c、test_ecc.c 、tunnelmanager.hh、linphonecore_jni.cc、sipwizard.c、tunnelmanager.cc文件外的其他文件都添加到項目中,再新建def文件,在文件中添加需要用到的接口函數(shù)。
由于自定義的unistd.h,需要將頭文件引用方式由#include
在lpconfig.c文件中找到: if (chmod(filename, S_IRUSR | S_IWUSR) == -1),并注釋掉該if分支的所有語句。
在sal_eXosip2.c文件中找到:eXosip_set_tls_ctx(&tlsCtx;),注釋掉該調(diào)用語句。
此時編譯出現(xiàn)錯誤提示信息: too many initializers,定位到源碼SipSetup linphone_sip_login中發(fā)現(xiàn)其賦值的個數(shù)比定義的個數(shù)多,這里需要刪除sip_login_init_instance和sip_login_do_logout之間的3個的NULL。
然后修改misc.c,在文件中找到lp_spawn_command_line_sync函數(shù),由于在windows平臺下不支持popene及pclose函數(shù),需要將其中的第一行做如下修改:#if !defined(_WIN32_WCE) && !defined(_WIN32)。
此外,在編譯過程中出現(xiàn)“未聲明的標(biāo)示符”或“將此類型用作表達式非法”等錯誤信息時,這是找不到函數(shù)的定義所致,需將函數(shù)的定義放在文件頭。
3 SIP服務(wù)器的選擇及運行結(jié)果
3.1 SIP服務(wù)器的選擇
本系統(tǒng)中選擇開源的FreeSwitch。FreeSwitch是一種功能強大的VoIP開源軟交換機,兼容多種主流協(xié)議,包括SIP、H.323、H.261、H.263、H.264、MP4等,它具有以下幾個特點:
1)采用的是模塊化設(shè)計理念,通過使用特定的接口進行功能擴展,從而減小了系統(tǒng)核心對其它功能模塊的依賴性。
2)提供特定的API支持業(yè)務(wù)控制邏輯,系統(tǒng)控制流程支持使用JavaScript、Perl等腳本語言實現(xiàn)。
3)擁有中心化的可擴展標(biāo)記語言(XML)注冊表,從而使文件查詢解析更加方便。
4)與Asterisk、Kamailio等同類型的VoIP軟交換平臺相比較,F(xiàn)reeSwitch能夠并發(fā)支持更多的會話連接。
3.2 運行結(jié)果
4 結(jié)束語
本文中對PJSIP的源碼做了部分的修改,能夠?qū)崿F(xiàn)Windows平臺下的雙向720P視頻通話功能,還有很多待優(yōu)化的地方,如三方通話等功能,后期將繼續(xù)關(guān)注PJSIP的發(fā)展,希望能夠在PJSIP領(lǐng)域得到更進一步的提高。
參考文獻:
[1] 鄧凱. 基于Android平臺的PJSIP協(xié)議棧優(yōu)化設(shè)計與實現(xiàn)[D]. 北京: 北京郵電大學(xué), 2016.
[2] 凌小榮. 基于SIP網(wǎng)絡(luò)音視頻通信的研究與實現(xiàn)[D]. 廣州: 華南理工大學(xué), 2014.
[3] 陳歡. 支持移動終端的SIP客戶端設(shè)計與實現(xiàn)[D]. 沈陽: 中國科學(xué)院沈陽計算技術(shù)研究所, 2008.
[4] 黃月祥. 基于PJSIP的嵌入式VoIP終端的研究與實現(xiàn)[D]. 昆明: 昆明理工大學(xué), 2011.
[5] 孫濤,秦雅娟,楊冬,等. 基于FreeSwitch的會議電話系統(tǒng)研究與實現(xiàn)[J]. 鐵道通信信號, 2011,9(47).
【通聯(lián)編輯:梁書】