FreeSWITCH中sip客戶端註冊細節

FreeSWITCH中用戶信息默認是在directory下的xml中配置的,也可以通過lua腳本來使用其他配置, 參見 使用數據庫存儲Freeswitch賬戶與密碼

註冊信息數據庫表

當有sip客戶端向服務器註冊時,在進行一番驗證註冊成功後,會向<dir>/freeswitch/db/core.db數據庫的registrations表中以及sofia_reg_internal.db數據庫的sip_registrations表中,存入註冊信息,兩者大部分數據是相同的。

//源文件sofia.c第2476行。
//將註冊信息存入sofia_reg_internal.db數據庫的sip_registrations表中。
sql = switch_mprintf("insert into sip_registrations "
                     "(call_id, sip_user, sip_host, presence_hosts, contact, status, rpid, expires,"
                     "user_agent, server_user, server_host, profile_name, hostname, network_ip, network_port, sip_username, sip_realm,"
                     "mwi_user, mwi_host, orig_server_host, orig_hostname, ping_status, ping_count) "
                     "values ('%q','%q','%q','%q','%q','Registered','%q',%ld, '%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q', '%q', %d)",
                     call_id, from_user, from_host, presence_hosts, contact_str, rpid, expires, user_agent, to_user, guess_ip4,
                     profile_name, mod_sofia_globals.hostname, network_ip, network_port, username, realm, mwi_user, mwi_host,
                     orig_server_host, orig_hostname, "Reachable", 0);

超時時間

core.db的registrations表中第五列數據(一個長整型數據,從UNIX紀元開始到現在的秒數),這個數據就是超時時間(即在這個時間失效前,用戶需要更新信息/重新註冊)。
sofiq_reg_internal.db的sip_registrations表中有上面registrations表中的所有數據,並有一些其他更詳細的數據。

註冊信息更新

如果在用戶的配置信息如1010.xml中添加一行。那麼1010這個sip客戶端就會在註冊後的每50~100秒內重新再註冊一次,然後更新註冊信息中的超時時間。

超時時間和註冊時間的關係

超時時間一般是在當前註冊時間的系統時間(秒數)的基礎上,加上一定的秒數x和秒數y。
即:超時時間 = 註冊時刻系統時間now + x + y 。
這個秒數x有兩種情況:

  • 如果用戶配置信息中配置了sip-force-expires具體值如100,那麼x等於100秒。

  • 如果用戶配置信息中沒配置該expires值,那麼就從sip客戶端註冊時提交的信息中獲取expires值,如x-lite sip客戶端一般將expires值設爲3600秒。那麼x等於3600秒。

這個秒數y是指:sip協議源代碼中,默認設置的一個安全時間,一般y是60秒。可以防止用戶配置信息中sip-force-expires設置的太小,導致頻繁檢測註冊用戶是否超時。

若要在源代碼中修改,可修改sofia_reg.c源文件中的 超時時間=(long)reg_time + (long)exptime + profile->sip_expires_late_margin 與上面式子一一對應。

註冊超時

sip協議源代碼中,會有個線程循環檢測比較當前系統時間和註冊信息表中的超時時間,如果系統時間到了超時時間,這條註冊信息還沒有更新超時時間,則認爲這條用戶註冊信息超時了(原因可能是對應用戶的sip客戶端斷網或者進程非正常結束)。但是不會立馬刪除數據庫中的這條數據,測試時發現在10秒左右之後,再刪除,併發送 CUSTOM sofia::expire 事件通知有用戶註冊超時。

用戶正常上下線事件通知

註冊與取消都有對應的事件:

  • 正常註冊上線:不管是第一次註冊還是後面每隔多少秒更新註冊,都會發送一個註冊事件CUSTOM Sofia::register。

  • 正常取消註冊下線時:此爲正常手動關閉退出sip客戶端程序,會產生事件CUSTOM Sofia::unregister。

  • 不正常下線時:如果因爲註冊超時,然後被刪除數據庫註冊信息,會收到 CUSTOM sofia::expire。

以上這些事件需要向freeswitch發送相關api訂閱api event plain CUSTOM sofia::register sofia::unregister sofia::expire。收到的事件的正文內容會包含一些用戶的信息,比如號碼、系統當前時間、超時時間等等。

 

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