news 2026/5/6 3:21:11

Kamailio usrloc 细节测试

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Kamailio usrloc 细节测试

版本 kamailio 5.7.x

IP 地址 192.168.43.68

窥视 usrloc 细节

慢慢测试,慢慢写


ul.rm vs ul.rm_contact

这二个不一样,比如 eyebeam 以 1000 注册,同时 microsip 也以 1000 注册

执行 ul.rm location 1000@192.168.43.68

就把 eyebeam 和 microsip 都删除掉了

ul.rm_contact 可以按需删除,比如只删除 eybeam

下面是例子:

eyebeam 注册,

ul.dump 得知 Address: sip:1000@192.168.43.68:57492;rinstance=020b7ff3f71cb288

ul.rm_contact location 1000@192.168.43.68 sip:1000@192.168.43.68:57492;rinstance=020b7ff3f71cb288
就成功删除了 eyebeam


ul.rm 和删表

ul.rm 之后内存里面已经找不到 eyebeam, 但 location 表是不是马上就删除 eybeam?

配置下面几个参数,进行测试:
modparam("usrloc", "timer_interval", 3600) # 这么大仅仅 是为了测试,生产上不建议
modparam("usrloc", "timer_procs", 1)
modparam("usrloc", "use_domain", MULTIDOMAIN)
modparam("usrloc", "db_url", DBURL)
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "db_timer_clean", 1)
modparam("usrloc", "handle_lost_tcp", 1)
modparam("usrloc", "close_expired_tcp", 1)

结果是 ul.rm 之后, location 表马上就删除了 eyebeam


注册过期和删表

eybeam 用 tcp 方式注册

之后在任务管理器里面删除 eyebeam

测试的结果是 ul.dump 等到过期后 Expires 的值是 expired,但 location 表里面照样有 eyebeam, 要等到 timer_interval 到期才会删表

或者在路由里面处理注册过期事件,调用 ul.rm_contact 才能起到删表的目的(ul.flush也可,强迫缓存写表)

到底要怎样做,回头再补充

基本的思路是:

检查 save 返回值,如果是新注册,就要记录下来

加载 tcpops 模块,tcp 事件里面,如果是 close 或者是 reset, 调用 ul.rm_contact

当然,如果是 udp 注册,就要使能 usrloc 的 ka_mode 参数(这个暂时不做测试,我的客户主要用 JsSIP)


路由处理

usrloc 模块同上

loadmodule "tcpops.so"
loadmodule "htable.so"
loadmodule "jansson.so"

modparam("registrar", "method_filtering", 1)
/* uncomment the next line to disable parallel forking via location */
# modparam("registrar", "append_branches", 0)
/* uncomment the next line not to allow more than 10 contacts per AOR */
# modparam("registrar", "max_contacts", 10)
/* max value for expires of registrations */
modparam("registrar", "max_expires", 3600)
/* set it to 1 to enable GRUU */
modparam("registrar", "gruu_enabled", 0)
/* set it to 0 to disable Path handling */
modparam("registrar", "use_path", 1)
/* save Path even if not listed in Supported header */
modparam("registrar", "path_mode", 0)

modparam("registrar", "xavp_cfg", "reg")
modparam("registrar", "xavp_rcd", "ulrcd")
modparam("registrar", "case_sensitive", 1)
modparam("registrar", "xavp_rcd_mask", 0)

modparam("htable", "htable", "tcpusrloc=>size=8;autoexpire=3600;")

route[REGISTRAR] {
if (!is_method("REGISTER")) return;

if(isflagset(FLT_NATS)) {
setbflag(FLB_NATB);
#!ifdef WITH_NATSIPPING
# do SIP NAT pinging
setbflag(FLB_NATSIPPING);
#!endif
}
if (!save("location")) {
sl_reply_error();
}

if ($rc == 1){
xnotice("ruid = $xavp(ulrcd[0]=>ruid)\n");
xnotice("contact = $xavp(ulrcd[0]=>contact)\n");
if(reg_fetch_contacts("location", "$fu", "caller")){
$avp(i) = 0;
while($avp(i) < $(ulc(caller=>count))){
if($xavp(ulrcd[0]=>ruid) == $(ulc(caller=>ruid)[$var(i)])) {
$avp(aor) = $_s($fU@$fd);
$avp(conid) = $(ulc(caller=>conid)[$var(i)]);
if ($avp(conid) == $null) {
xnotice("udpconn\n");
} else {
$avp(k) = $avp(conid);
$avp(v) = $_s({"contact": "$xavp(ulrcd[0]=>contact)", "aor": "$avp(aor)"});
$sht(tcpusrloc=>$avp(k)) = $avp(v);
xnotice("tcpconn\n");
}
}
$avp(i) = $avp(i) + 1;
}
reg_free_contacts("caller");
}
}

exit;
}

eyebeam tcp 注册

kamcmd htable.dump tcpusrloc
{
entry: 55
size: 1
slot: {
{
name: 1
value: {"contact": "sip:1000@192.168.43.68:54071;transport=TCP;rinstance=e65785e1e29b4605", "aor": "1000@192.168.43.68"}
type: str
}
}
}


event_route[tcp:closed] {
xlog("L_INFO", "$proto connection closed ($conid)\n");
route(rm_contact);
}

event_route[tcp:timeout] {
xlog("L_INFO", "$proto connection timed out ($conid)\n");
route(rm_contact);
}

event_route[tcp:reset] {
xlog("L_INFO", "$proto connection reset by peer ($conid)\n");
route(rm_contact);
}

route[rm_contact] {
$avp(k) = $conid;
$avp(j) = $sht(tcpusrloc=>$avp(k));
if ($avp(j) == $null){
return;
}

xnotice("rm_contact, json = $avp(j)\n");

if (!jansson_get("contact", $avp(j), "$avp(contact)")) {
return;
}
xnotice("contact = $avp(contact)\n");

if (!jansson_get("aor", $avp(j), "$avp(aor)")) {
return;
}
xnotice("aor = $avp(aor)\n" );

# rpc

jansson_set("string", "jsonrpc", "2.0", "$avp(req)");
jansson_set("string", "method", "ul.rm_contact", "$avp(req)");

$avp(params) = "[]";
jansson_append("string", "", "location", "$avp(params)");
jansson_append("string", "", "$avp(aor)", "$avp(params)");
jansson_append("string", "", "$avp(contact)", "$avp(params)");

jansson_set("array", "params", $avp(params), "$avp(req)");

xnotice("req = $avp(req)\n");

jsonrpc_exec("$avp(req)");
xinfo("code = $jsonrpl(code)\n");
xinfo("body = $jsonrpl(body)\n");
}

逻辑看起来没有问题,但实际执行起来,不对

req = {"jsonrpc":"2.0","method":"ul.rm_contact","params":["location","1000@192.168.43.61","sip:1000@192.168.43.68:60146;transport=TCP;rinstance=1d88e94f64296775"]}
Dec 11 13:44:11 debian kamailio[4279]: ERROR: <core> [db.c:489]: db_use_table(): invalid connection parameter
Dec 11 13:44:11 debian kamailio[4279]: ERROR: usrloc [ucontact.c:1602]: db_delete_ucontact_ruid(): sql use_table failed
Dec 11 13:44:11 debian kamailio[4279]: ERROR: usrloc [urecord.c:656]: delete_ucontact(): failed to remove contact from database

有可能 tcp事件路由里面不能调用 rpc, 我不太确定


引人 mqueue 模块,完美解决,哈哈

loadmodule "mqueue.so"
loadmodule "rtimer.so"

modparam("mqueue", "mqueue", "name=myq;size=20;")
modparam("rtimer", "timer", "name=nsqt;interval=1;mode=1;")
modparam("rtimer", "exec", "timer=nsqt;route=RUN_CDR_PUBLISH")
。。。

细节不再提供,别再等了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:53:53

河北省企业营销策划实战经验

河北省企业营销策划实战经验在当前竞争激烈的市场环境中&#xff0c;河北省的企业要想脱颖而出&#xff0c;必须具备高效的营销策划能力。本文将结合快印客众合青阳广告传媒&#xff08;码客汀大城旗舰店&#xff09;的实战经验&#xff0c;探讨如何在河北省进行有效的营销策划…

作者头像 李华
网站建设 2026/5/1 18:13:44

Docker与Vercel AI SDK集成实战(从零到上线仅需3小时)

第一章&#xff1a;Docker与Vercel AI SDK集成概述将 Docker 容器化技术与 Vercel AI SDK 相结合&#xff0c;为构建可扩展、高性能的 AI 驱动应用提供了强大支持。通过容器化部署 AI 应用&#xff0c;开发者能够在一致的运行环境中实现快速迭代、无缝迁移和高效协作。Vercel A…

作者头像 李华
网站建设 2026/4/28 1:54:21

Visual Studio Markdown编辑器终极指南:5分钟快速提升文档编写效率

Visual Studio Markdown编辑器终极指南&#xff1a;5分钟快速提升文档编写效率 【免费下载链接】MarkdownEditor2022 A Visual Studio extension 项目地址: https://gitcode.com/gh_mirrors/ma/MarkdownEditor2022 你是否曾经在编写技术文档时&#xff0c;不得不在源码编…

作者头像 李华
网站建设 2026/4/23 11:26:13

Wan2.2-T2V-A14B在游戏过场动画预制作中的高效应用

Wan2.2-T2V-A14B在游戏过场动画预制作中的高效应用 你有没有经历过这样的场景&#xff1f;策划写完一段史诗级的剧情&#xff1a;“主角孤身跃下千丈悬崖&#xff0c;身后爆炸火光冲天&#xff0c;滑翔伞在狂风中剧烈抖动——”然后美术团队一脸懵&#xff1a;“……这画面感在…

作者头像 李华
网站建设 2026/5/4 9:57:29

网页在线访问全攻略:5 步实现网站上线

网页在线访问全攻略&#xff1a;5步实现网站上线 要让搭建的网页在线访问&#xff0c;需完成以下核心步骤&#xff1a;准备服务器 → 注册域名并解析 → 上传网站文件 → 配置服务器和防火墙 → (可选)备案和HTTPS。下面是详细操作指南&#xff1a; 一、准备服务器&#xff1a;…

作者头像 李华
网站建设 2026/5/3 6:31:19

Wan2.2-T2V-A14B能否生成宠物行为模拟视频?

Wan2.2-T2V-A14B能否生成宠物行为模拟视频&#xff1f; 在智能内容创作的浪潮中&#xff0c;一个看似“无厘头”却极具代表性的挑战正在浮现&#xff1a;能不能让AI模型准确理解并生成“一只布偶猫打滚撒娇”的全过程&#xff1f; 这可不是简单的图像叠加或动作拼接——它要求模…

作者头像 李华