FreeSWITCH中用户信息默认是在directory下的xml中配置的,也可以通过lua脚本来使用其他配置, 参见 使用数据库存储Freeswitch账户与密码。
当有sip客户端向服务器注册时,在进行一番验证注册成功后,会向
/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。收到的事件的正文内容会包含一些用户的信息,比如号码、系统当前时间、超时时间等等。