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。