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。

<think>好的,我需要回答用户关于PJSIPSIP实现或问题的询问。首先,我需要确认用户的具体需求。用户提到了PJSIPSIP,可能想了解它们之间的关系、PJSIP实现特点,或者在使用过程中遇到的常见问题。 首先,我应该回顾一下已有的引用内容。引用[1]提到PJNATH是PJSIP的一部分,用于NAT穿透,并且PJSIP与PJMEDIA、PJNATH集成在PJSUA-LIB中,提供高层API。引用[2][3]则涉及SIP协议的其他工具客户端,比如sipsakFreeSWITCH,这可能对用户的问题有帮助。 接下来,我需要组织回答结构。根据用户的问题,可能需要分点说明PJSIP的特点、实现功能、常见问题及解决方案,以及相关工具。同时,用户可能对如何开始使用PJSIP或调试问题感兴趣。 要注意使用中文,并且按照系统级指令处理数学公式,不过在这个问题中可能涉及较少数学内容,但需要确保所有技术术语代码块正确。例如,如果有示例代码,需要用正确的格式展示。 然后,我需要检查是否有遗漏的信息。例如,PJSIP的多线程支持、协议兼容性、性能优化等是否在引用中有提及。引用[1]提到了PJNATH作为NAT穿透方案,这可能与网络问题相关。引用[3]提到MacOS客户端其他协议支持,这可能对跨平台开发有帮助。 用户可能遇到的具体问题可能包括编译错误、NAT穿透失败、SIP消息处理问题等。需要根据引用外部知识,给出常见问题的解决思路,比如检查配置、使用调试工具如sipsak(引用[2])进行测试。 最后,生成相关问题,确保问题与PJSIPSIP相关,并且能引导用户进一步探索。例如,如何集成PJSIP到项目中,或者如何处理特定协议错误。 需要确保回答结构清晰,分点明确,引用标识自然添加。同时,避免使用Markdown格式,保持文本自然。可能还需要确认引用的来源是否正确,例如引用[1]确实关于PJNATHPJSIP的结构,引用[2]介绍sipsak工具用于SIP测试,这些都可以在回答中引用。</think>### PJSIPSIP实现解析 #### 1. PJSIP核心特性 PJSIP是一个开源的SIP协议栈,专注于嵌入式系统跨平台应用,提供以下功能: - **多协议支持**:完整实现SIP、SDP、STUN、TURN等协议[^1] - **NAT穿透能力**:集成PJNATH模块解决NAT环境通信问题(例如对称NAT场景) - **媒体处理**:通过PJMEDIA子库支持音频编解码、RTP传输 - **多线程架构**:事件驱动模型确保高并发处理能力 示例代码片段: ```c pjsua_acc_config cfg; pjsua_acc_config_default(&cfg); cfg.id = pj_str("sip:user@domain.com"); pjsua_acc_add(&cfg, PJ_TRUE, NULL); ``` #### 2. 典型问题解决方案 **问题1:NAT穿透失败** - 检查ICE配置: ```bash pjsua --use-ice --stun-srv stun.pjsip.org ``` - 验证TURN服务器证书有效性 **问题2:SIP消息解析错误** - 使用`sipsak`工具模拟测试(引用[2]): ```bash sipsak -vv -s sip:receiver@domain.com ``` - 启用PJSIP日志级别`LOG_LEVEL=5` **问题3:跨平台编译问题** - MacOS需配置特定编译参数: ```makefile export CFLAGS += -I/opt/local/include export LDFLAGS += -L/opt/local/lib ``` #### 3. 性能优化建议 - 启用SRTP加密时选择AES-CM模式 - 使用`pjsip_endpt_acquire_transport()`重用传输连接 - 限制并发会话数防止内存溢出 $$Throughput = \frac{Session_{active}}{Memory_{usage} \times CPU_{load}}$$ #### 4. 相关工具链 - **sipsak**:用于SIP服务探测压力测试(引用[2]) - **Wireshark**:SIP报文深度分析 - **FreeSWITCH**:可作为SIP B2BUA测试对接(引用[3])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值