pjsip如何发送媒体声音_Asterisk环境下完整PJSIP分机拨号流程分析

本文介绍了Asterisk为何选择PJSIP作为新一代SIP协议栈,详细阐述了PJSIP在Asterisk中的结构、核心模块及处理流程。通过示例展示了PJSIP分机呼叫的13个步骤,帮助读者理解PJSIP的呼叫处理和拨号规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​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

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模块的几个核心模块如下:

### Asterisk 中 `pjsip_publishc_publish()` 与 `pjsip_publishc_send()` 函数解析 #### 定义与用途 `pjsip_publishc_publish()` 和 `pjsip_publishc_send()` 是用于管理 SIP 发布 (PUBLISH) 请求的两个不同接口。这些请求通常用来向服务器发布状态信息或其他资源数据。 - **`pjsip_publishc_publish()`**: 此函数负责创建并初始化一个新的 PUBLISH 客户端实例,设置必要的参数如目标URI、事件包类型等,并准备发送第一个 PUBLISH 请求[^1]。 - **`pjsip_publishc_send()`**: 当已有存在的 PUBLISH 客户端实例时,此函数被调用以重新发送或刷新现有的发布消息。这允许应用程序周期性地更新已发布的状态信息而不必每次都重建整个客户端对象[^2]。 #### 使用示例 下面展示了如何使用这两个 API 的简单例子: ```c // 创建并启动一次性的publish操作 void start_publish(const char *target_uri, const char *event_package){ pjsip_publishc_cfg cfg; // 初始化配置... memset(&cfg, 0, sizeof(cfg)); strcpy(cfg.event_package, event_package); pj_status_t status = pjsip_publishc_publish(target_uri, &cfg, NULL /* callbacks */, NULL /* user_data */); if(status != PJ_SUCCESS){ // 处理错误 } } // 刷新现有 publish 操作的状态 void refresh_existing_publish(pjsip_publishc_instance *inst){ pj_status_t status = pjsip_publishc_send(inst, NULL /* extra headers */, NULL /* body */); if(status != PJ_SUCCESS){ // 错误处理逻辑 } } ``` 上述代码片段中,`start_publish` 函数演示了怎样利用 `pjsip_publishc_publish()` 来发起一个新的发布会话;而 `refresh_existing_publish` 展现了当有一个活跃的发布实例 (`pjsip_publishc_instance`) 后,可以通过调用 `pjsip_publishc_send()` 方法来保持该会话的有效性和及时性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值