1. 程式人生 > >SIP協議學習pjsip

SIP協議學習pjsip

一、 在windows下利用vc6.0編譯pjsip原始碼

首先閱讀文件readme.txt,查詢在win32平臺原始碼的編譯方法。自己總結方法如下:

a.設定pjsua為當前活動工程

b.因為編譯的時候提醒缺少config_site.h檔案,所以在pjlib/include/pj/下新建一個空的config_site.h檔案。

c. 提醒找不到IPHlpApi.h,因為microsoft已經不維護vc6.0所以缺少,下載最新的Platform SDKfor internet加入Tools -> Option ->Directories,Library files和include

d.編譯出現unresolved external symbol _pj_get_sys_info錯誤,將pjlib\src\pj下的os_info.c加入pjlib工程

編譯在pjsip-apps\bin下生成pjsua_vc6.exe。

1. 在Linux下編譯pjsip原始碼

$ ./configure

$ make dep&& make clean && make

在/pjproject-2.1.0/pjsip-apps/bin下可以看到

pjsua-i686-pc-linux-gnu和pjsystest-i686-pc-linux-gnu

3 利用編譯原始碼生成的app,模擬一次會話的建立,利用wireshark抓包分析sip協議。

Windows端ip;172.16.2.138

linux端ip;172.16.2.63

二、首先windows端執行pjsua_vc6.exe


先選擇m,建立一個新的呼叫,然後輸入sip:172.16.2.63(linux端地址)。然後終端列印如下資訊,大致可分為三部分

1.起始行

INVITE sip:172.162.63 SIP/2.0

INVITE表示邀請使用者參加一個會話,sip版本2.0

2.訊息頭欄位

Via:SIP/2.0/UDP172.16.2.138:5060;rport;branch=z9hG4bKPj9d24f4650227482987e044d641050ef6

這裡給出了請求經過的路徑,應答請求將按照這個路徑傳送應答請求。分別是傳輸層協議、客戶名和地址,及接收響應的埠號

Max-Forwards: 70

標明請求被轉發的最大次數

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

請求傳送者

To: sip:172.16.2.63

請求接收者

Contact:<sip:172.16.2.138:5060;ob>

一個用來直接訪問傳送者的url

Call-ID: fdc4d3c08c594ac499b184fbdbc35550

一個全域性的唯一標誌,用來唯一標誌這個呼叫

CSeq: 2322 INVITE

用來標識傳送不同請求

Allow: PRACK, INVITE, ACK, BYE, CANCEL,UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS

Supported: replaces, 100rel, timer,norefersub

Session-Expires: 1800

Min-SE: 90

以上標識伺服器制定傳送地址有關響應的附加資訊

User-Agent: PJSUA v1.16.0win32-5.1/i386/msvc-12.0

傳送請求代理相關資訊

Content-Type: application/sdp

訊息體型別

Content-Length: 450

訊息體長度

3,標誌訊息結束的空行

4,SDP訊息體(這是可選的,有些時候沒有)

v=0 協議版本

o=- 3585476598 3585476598 IN IP4 172.16.2.138

依次是會話見者的使用者名稱,會話標識,版本,網路型別,地址

s=pjmedia

會話名稱

c=IN IP4 172.16.2.138

連線資料

t=0 0

起始時間和終止時間

a=X-nat:0

會話/媒體屬性:值

m=audio 4000 RTP/AVP 98 97 99 104 3 0 89 96

媒體型別,埠,呼叫者希望收發的格式

接下來是看到的是響應訊息,沒有可選的訊息體

SIP/2.0 100 Trying

100是狀態碼,Trying表示在連線

Via:SIP/2.0/UDP172.16.2.138:5060;rport=5060;received=172.16.2.138;branch=z9hG4bKPj9d24f4650227482987e044d641050ef6

Call-ID: fdc4d3c08c594ac499b184fbdbc35550

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

To: <sip:172.16.2.63>

CSeq: 2322 INVITE

Content-Length: 0

三、在linux端執行pjsua-i686-pc-linux-gnu即可看到一個連線請求

輸入200,表示接受連線,可以看到成功連線的響應訊息

SIP/2.0200 OK

Via:SIP/2.0/UDP172.16.2.138:5060;rport=5060;received=172.16.2.138;branch=z9hG4bKPj9d24f4650227482987e044d641050ef6

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

To:<sip:172.16.2.63>;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

CSeq:2322 INVITE

Contact:<sip:172.16.2.63:5060>

Allow:PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER,MESSAGE, OPTIONS

Supported:replaces, 100rel, timer, norefersub

Session-Expires:1800;refresher=uac

Require:timer

Content-Type:application/sdp

Content-Length: 274

v=0

o=-3585447798 3585447799 INIP4 172.16.2.63

s=pjmedia

b=AS:84

t=00

a=X-nat:0

m=audio40000 RTP/AVP 98 96

c=INIP4 172.16.2.63

b=TIAS:64000

a=rtcp:40001 IN IP4 172.16.2.63

a=sendrecv

a=rtpmap:98speex/16000

a=rtpmap:96telephone-event/8000

a=fmtp:960-15

接下來可以看到接收端發給請求端的ACK確認訊息,其實中的to,from,call-id,cseq欄位從上面invite請求複製而來。

ACKsip:172.16.2.63:5060 SIP/2.0

Via:SIP/2.0/UDP172.16.2.138:5060;rport;branch=z9hG4bKPj1fb3c29b50914f4db87a8bd92ce0921f

Max-Forwards:70

From:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

To:sip:172.16.2.63;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

CSeq:2322 ACK

Content-Length: 0

四、解除連線

在接收端輸入h,表示傳送一個BYE給連線端

BYEsip:172.16.2.138:5060;ob SIP/2.0

Via:SIP/2.0/UDP172.16.2.63:5060;rport;branch=z9hG4bKPjYBk6NnV2mwIut0wJaHNxU7S6h3eq42IJ

Max-Forwards:70

From:<sip:172.16.2.63>;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

To:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

CSeq:18290 BYE

User-Agent:PJSUA v2.1 Linux-2.6.35.22/i686/glibc-2.12

Content-Length: 0

接受到BYE端後會傳送一個接受到BYE確認訊息200過來

SIP/2.0200 OK

Via:SIP/2.0/UDP172.16.2.63:5060;rport=5060;received=172.16.2.63;branch=z9hG4bKPjYBk6NnV2mwIut0wJaHNxU7S6h3eq42IJ

Call-ID:fdc4d3c08c594ac499b184fbdbc35550

From:<sip:172.16.2.63>;tag=ypVNCtNyGRBI9Ij4K9-Ig3Hf14zTkucm

To:<sip:172.16.2.138>;tag=50bc6da5f91d441fb8802d2692c9ac5e

CSeq:18290 BYE

Content-Length: 0

用wireshark對這次會話可以抓取到6次


這六次依次是

1.客戶端向伺服器端傳送訊息INVITE訊息,

2.伺服器段同意呼叫,傳送100,狀態碼錶示請求已收到,正在處理中。

3. 傳送200表示請求已經完成。

4. 客戶端向伺服器端傳送ACK,證實已經收到。

5.客戶端突然不想參加此次會話,向伺服器傳送BYE。

6. 結束確認200。