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开发PDF转PNG的可视化工具

《基于Python开发PDF转PNG的可视化工具》在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转P... 目录一、引言二、功能特性三、技术架构1. 技术栈组成2. 系统架构javascript设计3.效果图

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

Android开发中gradle下载缓慢的问题级解决方法

《Android开发中gradle下载缓慢的问题级解决方法》本文介绍了解决Android开发中Gradle下载缓慢问题的几种方法,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、网络环境优化二、Gradle版本与配置优化三、其他优化措施针对android开发中Gradle下载缓慢的问

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Python利用自带模块实现屏幕像素高效操作

《Python利用自带模块实现屏幕像素高效操作》这篇文章主要为大家详细介绍了Python如何利用自带模块实现屏幕像素高效操作,文中的示例代码讲解详,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、获取屏幕放缩比例2、获取屏幕指定坐标处像素颜色3、一个简单的使用案例4、总结1、获取屏幕放缩比例from

nginx-rtmp-module模块实现视频点播的示例代码

《nginx-rtmp-module模块实现视频点播的示例代码》本文主要介绍了nginx-rtmp-module模块实现视频点播,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录预置条件Nginx点播基本配置点播远程文件指定多个播放位置参考预置条件配置点播服务器 192.

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,