pjsip消息在模块与实例间的流动

原创 2012年03月22日 16:59:50

一个模块会有多个实例,模块更像一个部门,而实例就是部门里的人。比如user_agent模块中有多个dlg实例。目前涉及的模块优先级有高到低依次是transaction, user_agent(dlg),mod_inv(inv), application。 

首先,每隔模块都有一个回调函数on_rx_request(), 该函数返回bool型的值,表示该模块是否处理了该数据。当收到消息时,endpoint会依次按模块优先级把消息传给注册到该endpoint上模块,直到有个模块返回ture为止。 比如user_agent模块的on_rx_request()返回true后,该消息就不会由endpoint传给mod_inv模块和application模块了;当然有可能会由user_agent模块中的dlg实例传给mod_inv模块中的某个inv实例(dlg和inv一一对应)。 以上可阅读《pjsip_dev_guide》。 

下面以第一次收到request(数据为rdata)为例(也就是说消息会传到application模块), 说明各个模块和实例间消息的流动。 首先,endpoint收到消息后先传给模块transaction,注意是模块。 transaction模块有个哈希表,保存了所有的transaction实例。transction模块首先根据rdata计算出一个key,如果transtation模块有rdata对应的transaction实例,可以通过这个key得到。 如果该消息时符合rfc3261的,那么key是由branch参数计算的来的,而branch参数是可以唯一标示某个transaction实例的。如果消息时符合rfc2543的,这个key则由唯一标识transaction实例的数据得来。总之,这个key和transaction实例是一一对应的, 不管transaction模块中有没有对应的transaction实例。如果找到对应的transaction实例(还要求该transaction没处于terminated的状态,以后只说明主要流程,这类细节不在详述),transaction模块的on_rx_request()将返回true,endpoint将停止对消息的传送, 接下来由对应的transaction实例传送消息。transaction实例怎么传送消息,后面再做论述。 

按前面的假设,transaction模块没找到对应的transaction实例,transaction模块的on_rx_request()将返回false,消息将再传给user_agent模块。user_agent模块和transaction模块有些类似,也有自己的hash表来保存现有的dlg实例。同样的,user_agent也会根据rdata中的 数据(比如from tag, to tag)计算出key来查找有无对应的dlg。dlg实例传送消息和transaction实例类似,也在后面论述。同样的,user_agent模块的on_rx_request()也返回false,消息传到mod_inv模块。mod_inv模块位于pjsip中的pjsip_ua项目,它只接受来自dlg实例的请求,即它会根据rdata中endpt_info中的mod_data[mod_ua.id]中对应dlg的指针是否为NULL,判断是否返回false。如果为NULL,则返回false。至于为什么根据mod_data[mod_ua.id]来判断,后面再介绍。如果该指针不为NULL,mod_inv模块并不立刻返回true,而再根据rdata中的method等条件判断,具体的这里不再详述。

在本例中,那个指针为NULL,mod_inv模块的on_rx_request()将返回false。 最后,endpoint将消息传到application模块。application模块是开发者自己写的,其on_rx_request()的返回值自己判断,如果还是返回false,endpoint的行为我还没看,以后再介绍。估计是丢弃消息,或是返回5xx消息。

PJSIP开发手册之模块(二)

第二章 模块 模块框架是在PJSIP程序中各个软件组件之间派发SIP消息的主要方法。PJSIP中所有的软件组件,包括transaction层和dialog层,都是以模块实现的。如果没有模块,核心栈(...
  • smllyy
  • smllyy
  • 2014年11月05日 13:06
  • 3039

PJSIP开发手册之用户代理(十)

第十章基本用户代理层(UA) 基本Dialog概念 基本的UA dialog提供管理SIP dialogs的基础设备和dialog usages,像dialog的状态,会话计数器,Call-ID,...
  • smllyy
  • smllyy
  • 2014年11月05日 14:52
  • 1792

PJSIP开发手册之消息发送(七)

第七章 发送消息 发送和接收消息是SIP应用的核心操作。每个模块里的on_rx_request()和on_rx_response()回调函数来处理接收到来的消息。 这章将介绍基本的发送外出消息的方...
  • smllyy
  • smllyy
  • 2014年11月05日 13:30
  • 3046

PJSIP开发指南中文版

  • 2010年06月27日 14:55
  • 2.46MB
  • 下载

pjsip消息在模块与实例间的流动

一个模块会有多个实例,模块更像一个部门,而实例就是部门里的人。比如user_agent模块中有多个dlg实例。目前涉及的模块优先级有高到低依次是transaction, user_agent(dlg)...
  • sjtu_phoenix
  • sjtu_phoenix
  • 2012年03月22日 16:59
  • 947

PJSIP开发手册之传输层(六)

第六章 传输层 Transport是用来通过网络发送/接收消息的。PJSIP的transport框架是可扩展的,这意味着程序可以自己的transport来传输消息。 传输层设计 类图 下图展示...
  • smllyy
  • smllyy
  • 2014年11月09日 00:06
  • 1773

PJSIP开发手册之解析器(四)

第四章 解析器 下面PJSIP解析器的一些特征: 1. 它是自顶而下,手写的解析器。它使用了PJLIB的扫描器,此scanner速度很快,并减轻了解析器的复杂性。这样增加解析器可读性。 2. 如...
  • smllyy
  • smllyy
  • 2014年11月08日 23:50
  • 1355

android pjsip编译

编译系统分析 1.configure pjsip是基于autoconf与automak的编译系统,首先用./configure 传入参数,然后传入build.mak.in,最后生成buil...
  • xiaomitop
  • xiaomitop
  • 2016年08月10日 21:42
  • 459

Asterisk12 上使用pjsip模块

PJSIP在Asterisk12中被集成进来,作为asterisk第二个SIP协议栈。以下是安装步骤,记录下来已备忘。 首先安装版本控制工具git,在这里只是下载pjsip的代码; 下载git-1.8...
  • clliu
  • clliu
  • 2014年03月29日 12:44
  • 2666

PJSIP开发手册之SIP事件通知(十三)

第十三章 SIP特定的事件通知 SIP事件特定的通知在RFC3265“Session Initiation Protocol-SpecificEvent Notification”描述。这个核心协议...
  • smllyy
  • smllyy
  • 2014年11月05日 15:55
  • 2663
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pjsip消息在模块与实例间的流动
举报原因:
原因补充:

(最多只允许输入30个字)