FreeSwitch呼入处理流程

        为了简单起见,本文分析一个单边呼叫。让终端呼入到FS,然后播放一个文件就退出,不执行FS的呼出动作。参考拨号方案:

    <extension name="fs_one_way_inbound">
      <condition field="destination_number" expression="^10086$">
        <action application="sleep" data="1000 "/>
        <action application="answer"/>
        <action application="playback" data="ivr/8000/ivr-welcome_to_freeswitch.wav"/>
      </condition>
    </extension>

        Sofia栈捕获INVITE消息后,处理100 Trying,调用模块初始化时注册的回调函数sofia_event_callback()。处理新的INVITE请求,首先调用switch_core_session_request_uuid()实例化Session对象,同时实例化Channel对象,并把Channel状态初始化为CS_NEW,激活通道处理线程。

        Sofia栈进一步处理INVITE消息,抛出nua_i_invite事件通报事件进展,这时驱动状态机变化,状态机由CS_NEW状态迁移到CS_INIT状态。最终由状态机核心代码里的switch_core_standard_on_init()驱动状态迁移到CS_ROUTING。进而执行核心回调switch_core_standard_on_routing(),这个函数执行拨号方案的定位与查找,记录一个todo list,查找结束后,状态迁移到CS_EXECUTE。核心回调switch_core_standard_on_execute()挨个执行前一步todo list的APP。执行answer时,会触发 SIP的200 OK消息发出;当执行完最后一条APP后,触发一个hangup,即发SIP BYE消息。

        后续的状态迁移省略。

说明:呼叫状态机会调用所有注册的状态回调函数,上图中仅体现推动状态迁移的关键调用。

猜你喜欢

转载自blog.csdn.net/yetyongjin/article/details/106219705