一、 在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。