freeswitch 自學雜記

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

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