爲了簡單起見,本文分析一個單邊呼叫。讓終端呼入到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消息。
後續的狀態遷移省略。
說明:呼叫狀態機會調用所有註冊的狀態回調函數,上圖中僅體現推動狀態遷移的關鍵調用。