PJSIP开发手册之模块(二)

2024-01-13 18:32
文章标签 模块 开发 手册 pjsip

本文主要是介绍PJSIP开发手册之模块(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第二章 模块

模块框架是在PJSIP程序中各个软件组件之间派发SIP消息的主要方法。PJSIP中所有的软件组件,包括transaction层和dialog层,都是以模块实现的。如果没有模块,核心栈(pjsip_endpoint和transport)就不知道如何处理SIP消息。

模块框架是基于一个简单但是功能强大的接口抽象。对于接收到的消息,Endpoint(pjsip_endpoint)按照优先级向各个模块分发这个消息,直到其中一个模块处理了这个消息。对于发出的消息,Endpoint在电缆传输数据之前,会将这个消息分发到各个模块,允许它们对消息做最后的修改。

 

模块声明

模块接口在<pjsip/sip_module.h>中声明,如下:

所有的函数指针是可选的,如果它们没有被指定,它们将会被认为是成功返回的。

Load,start,stop,和unload这四个函数将会被Endpoint调用去控制模块状态。下图是模块状态的生命周期:



on_rx_request()和on_rx_response()函数指针是模块从Endpoint(pjsip_endpt)或其他模块接收SIP消息的主要方法。这些回调函数的返回值很重要。如果一个回调函数返回非0(例如真的条件),表示这个模块已经处理了这个消息,这样,Endpoint就可以停止分发消息到其他模块。

在一个消息被发送之前,on_tx_request()和on_tx_response()函数指针将会被传输管理调用。这就给了一些模块(比如sipcomp,message signing)机会去对消息做最后的修改。所有的模块必须返回PJ_SUCCESS(例如0状态),否则传输将被取消。

on_tsx_state()函数指针用于接收由于接收到消息、发送消息、定时器事件或者网络错误事件引起的事务状态改变的通知。

模块优先级

模块的优先级决定了模块被调用来处理回调的顺序。高优先级的模块(例如,较小的优先级数)将会先调用它们的on_rx_request()和on_rx_response(),最后调用它们的on_tx_request()和on_tx_response()函数。

下面给出的是标准的模块优先级的值:(注意:数字越小优先级越高)


Transport Manager使用的是PJSIP_MOD_PRIORITY_TRANSPORT_LAYER优先级。这个优先级是用来控制消息的传输,例如,优先级比它低的模块(有更大的优先级数)的on_tx_request()和on_tx_response()函数将会在传输层处理消息之前调用(例如,目的地址的计算,在连续的缓存里打印消息等等)。而且高优先级的模块将会在传输层处理完成之后,才会调用回调函数。

Transaction层使用PJSIP_MOD_PRIORITY_TSX_LAYER优先级。Transaction层接收属于一个Transaction里的所有接收到的消息。

UA层(如dialog框架)或proxy层使用PJSIP_MOD_PRIORITY_UA_PROXY_LAYER优先级。UA层吸收所有属于同一个dialog集的所有接收到的消息(这代表有分歧的响应)。

Dialog usages使用PJSIP_MOD_PRIORITY_DIALOG_USAGE优先级。目前PJSIP实现了两种dialog usages:INVITE会话和事件订阅会话(包括REFER订阅)。Dialog usage吸收属于一个特定的会话的同一个dialog的消息。

对于应用模块来说PJSIP_MOD_PRIORITY_APPLICATION是一个合适的值,因为应用希望利用transactions、dialogs和dialog usages。

到来消息的模块处理

当消息到来时,它将被表示为接收消息缓存(struct pjsip_rx_data)。传输管理解析这个消息后,把解析后的数据结构存放在接收消息缓存中,并把消息传给Endpoint。

Endpoint通过调用on_rx_request()或on_rx_response()回调函数将接收消息缓存分发给各个已注册的模块。先分发到高优先级的模块,直到有个模块返回非零。当一个模块返回非

这篇关于PJSIP开发手册之模块(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/602401

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

python urllib模块使用操作方法

《pythonurllib模块使用操作方法》Python提供了多个库用于处理URL,常用的有urllib、requests和urlparse(Python3中为urllib.parse),下面是这些... 目录URL 处理库urllib 模块requests 库urlparse 和 urljoin编码和解码

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录