FS SIP呼叫的消息线程和状态机线程

系统 1963 0

THREAD

当收到一次呼叫的时候, FS 会在 TU 层创建两个线程,一个线程为状态机线程,另外一个为消息线程。状态机线程通过 switch_core_session_thread_launch创建,顾名思义其作用是不断的检查channel 的状态,并进行处理。以下为详细处理过程。

状态机的执行机制:

2 个回调函数

分别为:

const switch_state_handler_table_t *driver_state_handler = NULL;

const switch_state_handler_table_t *application_state_handler = NULL;

 

下面为具体的代码分析:

FS 里面有大量的结构体,其变量的类型为函数指针。然后定义此结构,直接使用全局函数名称进行初始化。达到回调的效果。

例:

结构体

struct switch_state_handler_table {

/*! executed when the state changes to init */

switch_state_handler_t on_init;

/*! executed when the state changes to routing */

switch_state_handler_t on_routing;

。。。。/ 这里只显示部分

};

全局结构变量

switch_state_handler_table_t sofia_event_handlers = {

/*.on_init */ sofia_on_init,

/*.on_routing */ sofia_on_routing,

。。。

};

通过sofia_event_handlers 即可对所有的函数进行调用。

 

通过宏定义进行回调

#define STATE_MACRO(__STATE, __STATE_STR)  do{....}while(...)

 

状态机的回调过程,下图:

 

  概括为:

1、根据状态机的状态执行 mod_sofia 中对应的回调函数

2、根据状态机的状态执行 application core 设置的对应的回调函数

3、如果状态没有发生改变根据状态机的状态执行对应的 standard 函数

 

l 状态机状态一览

typedef enum {

CS_NEW,

CS_INIT,

CS_ROUTING,

CS_SOFT_EXECUTE,

CS_EXECUTE,

CS_EXCHANGE_MEDIA,

CS_PARK,

CS_CONSUME_MEDIA,

CS_HIBERNATE,

CS_RESET,

CS_HANGUP,

CS_REPORTING,

CS_DESTROY,

CS_NONE

} switch_channel_state_t;

以上为呼叫过程中的所有状态机。其中标注蓝色的状态会根据当前状态执行状态机函数。

修改 channel 状态

channel 的状态发生改变,进行修改时,会进行唤醒动作,把之前进入 sleep session 线程唤醒。然后从新执行状态机。

 

另外一个线程为消息线程,其功能为不断的从呼叫对应的消息队列里面取出消息,并进行处理,我在 SESSION 文档里面有过描述,会创建一个消息队列。

消息的处理会在消息队列里面进行描述。这里不再消息讲述。

FS SIP呼叫的消息线程和状态机线程


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论