最近写了一个 kamailio mid-register 的路由脚本,简述如下:
kamailio 收到 REGISTER 请求后,可以增加 path 头(其他的不动),再 dispatcher 到 FreeSWITCH。
这是一种处理办法,就是转发注册。
但对 FreeSWITCH 版本有要求,需要 1.10.8 或者更高版本(之前的版本对 path 的处理是有 bug 的)
那如果碰到 FreeSWITCH 低版本(有的客户因为各种原因无法升级),那怎么办呢?
那就在 Contact 头上做文章,也就是把 Contact 头换成 kamailio 自己的。
这个就是 mid-register。
主要的路由代码如下:
route[REGISTRAR] {
if (!is_method("REGISTER")) return;
if (isflagset(FLT_NATS)) {
setbflag(FLB_NATB);
setbflag(FLB_NATSIPPING);
}
if (!ds_select_dst("1", "4")) {
send_reply("403", "Not Relay");
# sl_reply_error();
exit;
} else {
save("location", 2);
if (is_present_hf("expires")) {
$var(expires) = $hdr(expires);
} else {
if (str_ifind("$ct", "expires")) {
$var(expires) = $(ct{re.subst,/^(.*);expires=([0-9]+)/\2/});
} else {
$var(expires) = 0;
}
}
$var(lhst) = $(ct{re.subst,/^(.*);expires.*/\1/}); // contact 删除 expires
$var(lhst) = $(var(lhst){s.encode.base64t}); // base64 编码
remove_hf("Contact");
$var(sut) = $(sut{s.encode.base64t});
append_hf("Contact: <sip:$fU@MY_IP4_ADDR:MY_SIP_PORT;transport=tcp;lhst=$var(lhst);sut=$var(sut);bf=$bf>;expires=$var(expires)\r\n");
t_on_reply("MANAGE_REGISTER_REPLY");
route(RELAY);
exit;
}
}
onreply_route[MANAGE_REGISTER_REPLY] {
# ...
# 恢复 ua contact
return;
}
route[INVITE] {
# $var(contact) =
# $var(sut) =
# $var(bf) =
# $du = $var(sut);
# route(RELAY);
exit;
}
其中:
- lhst 参数: base64(ua contact)
- sut 参数: ua 地址
- bf 参数: 分支标志
mid-register 的另外一个作用可能是做流量处理,比如:
ua<---60秒注册--->kam<---3600秒注册--->fs
目前这个脚本暂时没有实现这个功能