1、入口: src/switch.c 中的main函數
|_調用src/switch_core.c中的switch_core_init_and_modload()函數,初始化並加載所有的module,
| |_首先調用src/switch_core.c中的switch_core_init,bindsocket,建立sql、任務、事件線程
| |_src/switch_loadable_module.c 調用switch_loadable_module_init
switch_xml_init初始入freeswitch.xml,主要通過函數__switch_xml_open_root調用switch_xml_parse_file,保存於MAIN_XML_ROOT,
2、設置log
switch_core_init設置了讀取switch.conf.xml中的,設置runtime.hard_log_level,此處爲所有的Log的總出口。後面不同輸出還可再過濾。如控制檯的。釋放 可開啓debug(對應控制檯命令fsctl loglevel)
mod_console實現控制檯log功能, console.conf.xml 爲此模塊配置文件,默認爲info.(console loglevel 7)
sofia log 見
https://freeswitch.org/confluence/display/FREESWITCH/Sofia+SIP+Stack
log控制
logfile.conf.xml
3、認證
修改conf\sip_profiles中的對應配置,如:internal.xml
呼叫無 認證
<param name="accept-blind-auth" value="true"/>
註冊無認證
<param name="accept-blind-reg" value="true"/>
subscrible有認證
<param name="auth-subscriptions" value="true"/>
message有認證
<param name="auth-messages" value="true"/>
4、fs_cli -x 允許執行一條命令後退出,fs_cli連接到其它機器
http://www.360doc.com/content/13/1213/14/12747488_336851982.shtml
5、一些變量賦值
sofia_event_callback調用函數switch_core_session_request 產生session,函數調用switch_channel_init產生channel。
void sofia_handle_sip_i_invite調用函數switch_caller_profile_new,產生一個新的profile,調用switch_channel_set_caller_profile賦值、並替換舊的profile.
6、dailplan分析
當沒有配置dpln時,使用conf/sip_profiles/默認的。改成default比較好。如internal.xml
<param name="context" value="public"/>
dpln中的解析,括號前面爲函數,後面爲參數。函數執行的結果放於stream.data,最後會接在data的後面。data就是最後的返回值。
dpln data中的group對應的函數爲mod_commands.c 中的group_call_function。
dpln data中的sofia_contact對應的函數爲mod_sofia.c 中的sofia_contact_function。
dpln data中的strftime對應的函數爲smod_dptools.c中的trftime_api_function
dpln application中的bridge對應的函數爲mod_dptools.c中的audio_bridge_function
switch_core_session_exec函數調用switch_loadable_module_get_application_interface取得dpln中的application參數的值指定的函數,通過switch_channel_expand_variables_check進行data參數解析,如果data中有函數調用,在switch_api_execute調用switch_loadable_module_get_api_interface,取得data中的函數對應的指針進行執行。
switch_loadable_module_get_endpoint_interface 函數取得處理ep 的對象,如sofia開頭的指向sofia_endpoint_interface, user 開頭的指向user_endpoint_interface
7、rtp IP地址修改Profile
如external.xml
<param name="rtp-ip" value="$${local_ip_v4}"/>
<param name="sip-ip" value="$${local_ip_v4}"/>
<param name="ext-rtp-ip" value="auto-nat"/>
<param name="ext-sip-ip" value="auto-nat"/>
8、fs呼數限制
switch.conf.xml
<param name="max-sessions" value="2000"/>
<!--Most channels to create per second -->
<param name="sessions-per-second" value="2000"/>
9、介紹模塊
mod_hash、 hash函數
mod_sofia SIP協議棧
mod_sndfile 錄音存爲{ “r8”, “r16”, “r24”, “r32”, “gsm”, “ul”, “ulaw”, “al”, “alaw”, “adpcm”, “vox”, “oga”, “ogg”, NULL };後綴時
mod_dptools xml中的拔號相關
mod_command group呼時用到
mod_native_file 原生錄音
須編譯mod_console,控制檯才能生效
須編譯mod_dialplan_xml,呼叫才能路由xml
10、FS能自動替換RTP的源IP做爲目的IP
自動調整的功能默認是開啓的,可在Profile中禁用:
<param name="disable-rtp-auto-adjust" value="true"/>
或者僅針對個別的呼叫來禁用自動調整,在呼叫時設置通道變量來禁止。
<action application="set" data="disable_rtp_auto_adjust=true"/>
默認收到10RTP包才調整,修改如下:
<action application="set" data="rtp_auto_adjust_threshold=10"/>
11、sofia 註冊相關
mod_sofia_globals.max_msg_queues保存sofia能建幾個消息隊列,在mod_sofia_load中初始,最大爲mod_sofia_globals.max_msg_queues = SOFIA_MAX_MSG_QUEUE
最小爲2,一般爲CPU數/2+1
每個消息隊列存放的消息個數爲SOFIA_MSG_QUEUE_SIZE* mod_sofia_globals.max_msg_queues
SOFIA_MAX_MSG_QUEUE定義爲64
SOFIA_MSG_QUEUE_SIZE定義爲1000
mod_sofia_globals.msg_queue_len保存當前消息使用第幾個消息隊列
以上即每個線程能處理1000個消息。
sofia_queue_message函數中,mod_sofia_globals.msg_queue超過當前的線程數*SOFIA_MSG_QUEUE_SIZE,就會在sofia_msg_thread_start新建線程。
sofia_msg_thread_start函數中,檢查mod_sofia_globals.msg_queue_len>=mod_sofia_globals.max_msg_queues 就不再建線程了。
如果xml中配置了inbound-reg-in-new-thread 註冊使用新的線程,線程數不超過xml中指定的max-reg-threads,這個線程不統計在mod_sofia_globals.max_msg_queues.因爲這個消息不會放在mod_sofia_globals.msg_queue中。如果這步達到線程保合,就還走舊的方式。
還有一點要注意的是,在上面的入口函數sofia_event_callback中,mod_sofia_globals.msg_queue隊列如果>(((SOFIA_MSG_QUEUE_SIZE * mod_sofia_globals.max_msg_queues) * 900) / 1000),系統就會回503.
可修改internal.xml中去掉presence,,manage-presence 同時更換DB,提升註冊能力
<parem name="dbname" value="/dev/shm/sofia_internal.db">
12、壓力測試配置
https://wiki.freeswitch.org/wiki/Performance_testing_and_configurations
13、FreeSWITCH修改頭,指定代理添,加請求頭,響應頭,自定義頭等
http://www.freeswitch.net.cn/57.html
14、建立模塊
https://freeswitch.org/confluence/display/FREESWITCH/Creating+New+Modules