PJSIP是目前Asterisk官方使用的最新的SIP协议栈。根据官方说明,Asterisk官方已经不再继续更新chan_sip协议栈,除非有重大安全漏洞才会进行升级维护。通过几年的测试和生成场景的使用,PJSIP在整体性能和功能支持方面已经超越了chan_sip 协议栈。因为PJSIP涉及了很多比较新的配置文件和呼叫流程,导致很多用户对PJSIP配置说明缺乏一定的了解。今天,我们针对一些PJSIP的流程,并且结合呼叫规则进行介绍。以前有很多用户对使用PJSIP协议栈有疑问,以及其完整的技术概要,读者可以访问PJSIP官方网站和Asterisk官方网站。这里,笔者仅结合Asterisk介绍PJSIP具体的处理过程和Asterisk呼叫流程方面的内容。
1
关于PJSIP介绍
PJSIP是开源的SIP协议栈,在最近的Asterisk版本中,官方已经开始使用PJSIP协议栈作为Asterisk引擎的SIP协议栈。关于为什么Asterisk选择PJSIP作为Asterisk新一代SIP协议栈的讨论读者可以查阅此链接:
SIP Stack Research
PJSIP的核心是SIP endpoint,通过pjsip_endpoint来表示。
![61fbe9f5dac2c1c6023fb4e52a7445df.png](https://i-blog.csdnimg.cn/blog_migrate/593a9c5a3eac9607a1bdecc1907828c5.jpeg)
pjsip_endpoint负责几个方面的工作:
- 它具有一个pool factory, 为SIP模块分配自己的pool。
- 它支持对每个SIP模块实现定时器管理。
- 它支持一个传输管理模块,传输管理模块支持对SIP传输和控制消息解析打印。
- 它支持PJLIB的 ioqueue支持网络事件的调度处理。
- 它提供thread安全保护,对每个应用的thread进行安全管理。
- 它可以管理PJSIP的相关模块,拓展,解析处理等功能。
- 它负责从管理模块接收到的SIP 进入的消息,分发SIP消息到其他模块。
因为篇幅的关系,笔者在这里不再做太多关于PJSIP的介绍,网络有很多关于PJSIP协议栈,PJSIPUA的使用方式,读者可以安装练习。这里,我们主要介绍pjsip_endpoint的作用,因为它直接影响着我们后续章节中所讨论的Asterisk呼叫流程。
2
PJSIP在Asterisk的结构
在Asterisk环境中,PJSIP通过各自的模块对终端,业务订阅,认证和传输都进行管理。PJSIP模块的几个核心模块如下: