B2B在FreeSwitch中的呼叫流程

假设 1003 呼叫 1002

1003 向FS发送inivte消息:

sofia模块收到sip消息后,回调 sofia_event_callback() 进入 sofia_handle_sip_i_invite() 为 1003 建立 sessionchannel ,进入 1003 的channel状态机。依次执行:1003 的 CS_INIT --> 1003 的 CS_ROUTING --> 1003 的 CS_EXECUTE。

在 CS_EXECUTE 状态下,FreeSwitch 会执行针对于 1003 设定的Applications,当然是通过 dialplan 里的 xml 配置文件获取相应APP。

对于B2B情况,1003 此时会执行一系列的 set 和 hash,如下:

    <extension name="Local_Extension">
      <condition field="destination_number" expression="^(10[01][0-9])$">
        <action application="set" data="dialed_ext=$1"/>
        <action application="export" data="dialed_ext=$1"/>
      </condition>
      <condition field="destination_number" expression="^${caller_id_number}$">
        <action application="set" data="voicemail_authorized=${sip_authorized}"/>
        <action application="answer"/>
        <action application="sleep" data="1000"/>
        <action application="voicemail" data="check default $${domain} ${dialed_ext}"/>
        <!-- bind_meta_app can have these args <key> [a|b|ab] [a|b|o|s] <app> -->
        <anti-action application="bind_meta_app" data="1 b s execute_extension::dx XML features"/>
        <anti-action application="bind_meta_app" data="2 b s record_session::$${base_dir}/recordings/${caller_id_number}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/>
        <anti-action application="bind_meta_app" data="3 b s execute_extension::cf XML features"/>
        <anti-action application="set" data="transfer_ringback=${us-ring}"/>
        <anti-action application="set" data="call_timeout=30"/>
        <!-- <anti-action application="set" data="sip_exclude_contact=${network_addr}"/> -->
        <anti-action application="set" data="hangup_after_bridge=true"/>
        <!--<anti-action application="set" data="continue_on_fail=NORMAL_TEMPORARY_FAILURE,USER_BUSY,NO_ANSWER,TIMEOUT,NO_ROUTE_DESTINATION"/> -->
        <anti-action application="set" data="continue_on_fail=true"/>
        <anti-action application="db" data="insert/call_return/${dialed_ext}/${caller_id_number}"/>
        <anti-action application="db" data="insert/last_dial_ext/${dialed_ext}/${uuid}"/>
        <anti-action application="bridge" data="user/${dialed_ext}@$${domain}"/>
        <anti-action application="answer"/>
        <!--<anti-action application="send_display" data="Voicemail for ${dialed_ext}"/>-->
        <anti-action application="sleep" data="1000"/>
        <anti-action application="voicemail" data="default $${domain} ${dialed_ext}"/>
      </condition>

    </extension>

最后会执行 bridge 和 answer ,其中 bridge 又调用 switch_ivr_originate() ,最终调用 sofia_outgoing_channel() 为1002(即b_leg建立 session 和 channel ,并启动 1002 session 的状态线程。而 answer 则是对1003做出应答。 

当为 1002 建立了状态循环线程后,1002同样会进入:

1)1002 的 CS_INIT:在这里 freeswitch 会调用 1002 的终端 endpoint_interface 的 init 状态函数——sofia_on_init(),继而调用sofia_glue_do_invite(session/*1002的session*/),在 sofia_glue_on_invite() 里,FS 向 1002 发送 invite 消息。

(2)1002的CS_ROUTING。

(3)1002的CS_EXECUTE:由于是 b-leg,execute 状态里不再有 application 了。

猜你喜欢

转载自blog.csdn.net/daitu3201/article/details/80031217
今日推荐