SIP開源庫pjSIP簡介

基本框架說明

PJLib使用

Windows下庫編譯

 

PJSIP(http://www.pjsip.org/)是一個免費的開源多媒體通信庫,實現了基於標準的協議(如SIP,SDP,RTP,STUN,TURN和ICE)。把基於信令協議SIP的多媒體框架和NAT穿透功能整合成高層次、抽象的多媒體通信API。

基本框架說明

PJSIP庫主要包括:

  • SIP協議棧:處理SIP消息

  • 流媒體處理模塊:RTP/RTCP等媒體包處理

SIP協議部分

SIP協議由下往上進行了多層封裝:

  • pjlib庫:最底層、最基礎的庫,實現平臺抽象和框架(數據結構、內存分配、文件I/O,線程同步等)

  • pjlib-util庫:封裝常用算法,如MD5、CRC32等,以及json、xml格式解析

  • pjnath庫:處理NAT穿越問題

  • pjmedia和pjmedia-codec庫:處理SDP協商、媒體編碼和傳輸等

  • pjsip-core庫:SIP協議棧的核心,包含幾個重要的模塊SIP endpointSIP transaction moduleSIP dialog moduletransport layer

  • pjsip-simple庫:SIP時間與出席框架

  • pjsip-ua庫:INVITE會話的高層抽象,方便創建一個SIP會話,同時還實現了Client的註冊API

  • pjsua庫:高層次抽象API,是對前面庫的封裝

 

媒體處理部分

該模塊主要包含兩部分:

  • media transport:負責接收媒體流,支持RTP(UDP)、SRTP(加密)、ICE(NAT穿透)

  • 媒體端口(media port)框架:實現了各種媒體端口,每一個端口上定義各種操作(創建、銷燬、get/put等),常用媒體端口有:File writer(記錄媒體文件),File player(播放媒體文件)、stream port 、conference port(可以實現多方通話)、master port等。

 

 

PJLib使用

在使用PJLib時,需要遵守一定的規則,對應pjsua,在使用裏面接口前:

  • 創建SUA:pjsua_create,主要是初始化各底層庫、內存池,創建SIP端口(endpoint)

  • 初始化SUA:pjsua_init,主要是初始化SIP-UA(媒體處理、NAT處理等);此時可配置日誌文件(只有配置日誌文件纔會記錄日誌)

  • 創建傳輸協議:pjsua_transport_create,創建SIP與Media使用的傳輸協議(如UDP)

  • 啓動SUA:pisa_start,主要啓動底層子系統(電話、媒體、出席),並設定SUA爲running狀態

庫使用前初始化流程

auto status=pjsua_create();
if ( !PjRetsuccess(status) ){
  ...
}

//Init pisa
pisua_config pjconf;
pjsua_config_default(&pjconf);
pjconf.cb.on_incoming_call = &Onincomingcall;
pjconf.cb.on_call_media_state = &Onmediastate;
pjconf.cb.on_call_state = &Oncallstate;
pjconf.cb.on_reg_started = &Onregstarted;
piconf.cb.on_reg_state = &Onregstate;

pjsua_logging_config logconf;
pjsua_logging_config_default(&logconf);
logconf.logfilename ="./mylog.log";  // 設定日誌文件
logconf.console_level=0; // 禁用console輸出
logconf.level = 4; // 記錄Deubg及以上的日誌(<=此等級的全部記錄)
logconf.decor =PJ_LOG_HAS_LEVEL_TEXT;

status=pjsua_init(&pjconf, &logconf, NULL)
if (!PjRetsuccess(status)){
  ...
}

// add transport
pjsua_transport_config portconf;
pjsua_transport_config_default(&portconf);
portconf.port =0;  // select any available
status=pjsua_transport_create(PJSIP_TRANSPORT_UDP, &portconf, NULL);
if (!PjRetsuccess(status)){
  ...
}

// Start now
status=pisa_start();
if (!PjRetsuccess(status)){
  ...
}

在使用完成退出前,需調用pisa_destroy()完成清理工作;若有通話,則需要先通過pjsua_call_hangup_all()來掛斷(電話掛斷後,需要等待一定時間等待完成媒體端口的斷開與清理,如1s)。

Windows下庫編譯

下載源碼後,修改(新建)pjlib/include/pj/config_site.h(主要是各種宏定義,默認可爲空),然後使用VS2015直接編譯。編譯完成後主要生成libpjproject**.libpjsua2-**.lib

  • 若提示庫不匹配,修改:C/C++ - 代碼生成 - 運行庫

  • Link失敗,則需要增加依賴庫(連接器 - 輸入):iphlpapi.lib,;dsound.lib;dxguid.lib;netapi32.lib;mswsock.lib;ws2_32.lib;odbc32.lib;

  • samples中的代碼通過pjsip-apps\build\Samples-vc.mak進行編譯的,若要調試,需要通過sample_debug工程進行(在debug.cpp中include對應.c文件即可,但要注意c文件使用C++編譯時需要修改各種類型轉換錯誤)

若要使用高層接口(C++類)則引用pjsua2和pjproject,否則(使用基本庫)只需引用pjproject庫即可。對應的頭文件在:

  • pjsip/include

  • pjlib/include

  • pjlib-util/include

  • pjmedia/include

  • pjnath/include

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章