PJSIP是一个包含了SIP、SDP、RTP、RTCP、STUN、ICE等协议实现的开源库。它把基于信令协议SIP的多媒体框架和NAT穿透功能整合成高层次、抽象的多媒体通信API,这套API能够很容易的一直到各种构架中,不管是桌面计算机,还是嵌入式设备等。
一,PJSIP的编译与安装
PJSIP的下载地址 :
http://www.pjsip.org/release/2.6/pjproject-2.6.tar.bz2
生成makefile
./configure
编译与安装
make && make dep && make install
注意,如果使用老版本的gcc编译pjsip-2.6可能出现错误,此时或升级gcc或在./configure的时候disable某些模块。
二、PJSIP的组织架构介绍
PJSIP开源库中主要包含两部分,一部分是SIP协议栈(SIP消息处理),另一部分媒体流处理模块(RTP包的处理)。
SIP协议栈模块
SIP协议栈这个模块,开源库由底层往上层做了各个层次的封装。
pjlib是最底层的,最基础的库,它实现的是平台抽象与框架(数据结构、内存分配、文件I/O、线程、线程同步等),是SIP协议栈的基石。其他所有与SIP相关的模块都是基于PJLIB来实现的。
pjlib-util则是封装了一些常用的算法,例如MD5、CRC32等,除此之外封装了一些涉及到字符串、文件格式解析操作的API,例如XML格式解析。
pjsip-core则是SIP协议栈的核心,在该库中,包含了三个非常重要的模块,分别是SIP endpoint、SIP transaction module、SIP dialog module、transport layer。后续会着重介绍前三个模块。
pjsip-simple则是SIP事件与出席框架,如果你程序中要实现出席制定,则该库是必备的。
pjsip-ua是INVITE会话的高层抽象,使用该套API比较容易创建一个SIP会话。此外该库还实现了SIP client的注册API。
pjsua是PJSIP开源库中能够使用到的最高层次抽象API,该库是基于pjsip-ua及以下库做了高层次的分装。
基于上图,SIP endpoint是整个协议栈模块的核心,一般来说,一个进程内只能创建一个SIP endpoint。因此SIP endpoint是基于PJSIP开发的应用程序内所有SIP objects的管理与拥有者。根据官方文档的描述,SIP endpoint主要承担了一下角色:
- 为所有的SIP对象管理内存池的分配与释放(在基于pjsip的应用程序中,动态内存的分配是在内存池基础上进行的)
- 接收来自于传输层的消息,并将消息分配到上层,这里的上层指的是图中的SIP transa