1鹰霍、注冊(cè)信息數(shù)據(jù)庫(kù)表辛燥。
- 當(dāng)有sip客戶端向服務(wù)器注冊(cè)時(shí),在進(jìn)行一番驗(yàn)證注冊(cè)成功后春缕,會(huì)向<.dir.>/freeswitch/db/core.db數(shù)據(jù)庫(kù)的registrations表中以及sofia_reg_internal.db數(shù)據(jù)庫(kù)的sip_registrations表中,存入注冊(cè)信息艘蹋,兩者大部分?jǐn)?shù)據(jù)是相同的锄贼。
//源文件sofia.c第2476行。
//將注冊(cè)信息存入sofia_reg_internal.db數(shù)據(jù)庫(kù)的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);
2咱娶、超時(shí)時(shí)間。
- core.db的registrations表中强品,重點(diǎn)關(guān)注第五列數(shù)據(jù)(一個(gè)長(zhǎng)整型數(shù)據(jù)),這個(gè)數(shù)據(jù)就是超時(shí)時(shí)間屈糊,也就是指的這個(gè)用戶的注冊(cè)信息如果不更新將在這個(gè)時(shí)間后失效的榛。具體是指——“當(dāng)前系統(tǒng)正常時(shí)間-UNIX時(shí)間紀(jì)元(1970/1/1/00:00:00)”轉(zhuǎn)化成秒數(shù)的長(zhǎng)整型數(shù)字。
- sofiq_reg_internal.db的sip_registrations表中有上面registrations表中的所有數(shù)據(jù)逻锐,并多有一些其他更詳細(xì)的數(shù)據(jù)夫晌。
3雕薪、注冊(cè)信息更新。
- 如果在用戶的配置信息如1010.xml中添加一行
<variable name="sip-force-expires" value="100"/>
晓淀。那么1010這個(gè)sip客戶端就會(huì)在注冊(cè)后的每50~100秒內(nèi)重新再注冊(cè)一次所袁,然后更新注冊(cè)信息中的超時(shí)時(shí)間。
4凶掰、超時(shí)時(shí)間和注冊(cè)時(shí)間的關(guān)系燥爷。
- 超時(shí)時(shí)間一般是在當(dāng)前注冊(cè)時(shí)間的系統(tǒng)時(shí)間(秒數(shù))的基礎(chǔ)上,加上一定的秒數(shù)x和秒數(shù)y懦窘。
即:超時(shí)時(shí)間 = 注冊(cè)時(shí)刻系統(tǒng)時(shí)間now + x + y 前翎。
這個(gè)秒數(shù)x有兩種情況:
1)如果用戶配置信息中配置了sip-force-expires具體值如100,那么x等于100秒畅涂。
2)如果用戶配置信息中沒(méi)配置該expires值港华,那么就從sip客戶端注冊(cè)時(shí)提交的信息中獲取expires值,如x-lite sip客戶端一般將expires值設(shè)為3600秒午衰。那么x等于3600秒立宜。
這個(gè)秒數(shù)y是指:sip協(xié)議源代碼中,默認(rèn)設(shè)置的一個(gè)安全時(shí)間臊岸,一般y是60秒橙数。可以防止用戶配置信息中sip-force-expires設(shè)置的太小扇单,導(dǎo)致頻繁檢測(cè)注冊(cè)用戶是否超時(shí)商模。
若要在源代碼中修改,可修改sofia_reg.c源文件中的 超時(shí)時(shí)間=(long)reg_time + (long)exptime + profile->sip_expires_late_margin
與上面式子一一對(duì)應(yīng)蜘澜。
5施流、注冊(cè)超時(shí)
- sip協(xié)議源代碼中,會(huì)有個(gè)線程循環(huán)檢測(cè)比較當(dāng)前系統(tǒng)時(shí)間和注冊(cè)信息表中的超時(shí)時(shí)間鄙信,如果系統(tǒng)時(shí)間到了超時(shí)時(shí)間瞪醋,這條注冊(cè)信息還沒(méi)有更新超時(shí)時(shí)間,則認(rèn)為這條用戶注冊(cè)信息超時(shí)了(原因可能是對(duì)應(yīng)用戶的sip客戶端斷網(wǎng)或者進(jìn)程非正常結(jié)束)装诡。但是不會(huì)立馬刪除數(shù)據(jù)庫(kù)中的這條數(shù)據(jù)银受,測(cè)試時(shí)發(fā)現(xiàn)在10秒左右之后,再刪除鸦采,并發(fā)送 CUSTOM sofia::expire 事件通知有用戶注冊(cè)超時(shí)宾巍。
6、用戶正常上下線事件通知
- 正常注冊(cè)上線渔伯。不管是第一次注冊(cè)還是后面每隔多少秒更新注冊(cè)顶霞,都會(huì)發(fā)送一個(gè)注冊(cè)事件CUSTOM Sofia::register。這些注冊(cè)方式都是UDP锣吼。
- 不正常注冊(cè)上線時(shí)选浑。如果是用戶在斷網(wǎng)或其他原因不正常下線后又恢復(fù)網(wǎng)絡(luò)重新注冊(cè)時(shí)蓝厌,注冊(cè)方式會(huì)是TCP,會(huì)產(chǎn)生3個(gè)事件CUSTOM Sofia::register古徒。
- 正常取消注冊(cè)下線時(shí)拓提。此為正常手動(dòng)關(guān)閉退出sip客戶端程序,會(huì)產(chǎn)生事件CUSTOM Sofia::unregister隧膘。
- 不正常下線時(shí)代态。如果因?yàn)樽?cè)超時(shí),然后被刪除數(shù)據(jù)庫(kù)注冊(cè)信息舀寓,會(huì)收到 CUSTOM sofia::expire 事件通知有用戶注冊(cè)超時(shí)胆数。
以上這些事件需要向freeswitch發(fā)送相關(guān)api訂閱
api event plain CUSTOM sofia::register sofia::unregister sofia::expire
。收到的事件的正文內(nèi)容會(huì)包含一些用戶的信息互墓,比如號(hào)碼必尼、系統(tǒng)當(dāng)前時(shí)間、超時(shí)時(shí)間等等篡撵。