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消息。

        後續的狀態遷移省略。

 

說明:呼叫狀態機會調用所有註冊的狀態回調函數,上圖中僅體現推動狀態遷移的關鍵調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章