今天的课程围绕 Kamailio模块 和 SIP服务器类型 展开,详细讲解了多个核心模块的功能、参数和使用方法,并深入探讨了SIP中B2BUA和Proxy Server的区别与应用场景。以下是今天课程的主要内容总结:
Kamailio模块与SIP服务器类型详解
模块/主题 | 重要知识点 | 备注 |
---|---|---|
PV模块 | - 伪变量的定义与使用 - pv_isset 、pv_unset 、is_int 等函数的使用 |
伪变量用于动态访问SIP消息、数据库等信息。 |
PV Headers模块 | - 消息头的收集与修改 - pvh_collect_headers 、pvh_apply_headers 等函数 |
支持对SIP消息头的灵活操作,适用于复杂消息头处理场景。 |
App Lua模块 | - Lua脚本的执行 - lua_dofile 、lua_run 等函数- KEMI框架与 KSR 模块 |
通过Lua脚本实现复杂的SIP逻辑,支持KEMI框架。 |
App Lua SR模块 | - 旧版sr 模块的支持- register 参数的使用 |
主要用于旧版Lua脚本的平滑迁移,未来可能被废弃。 |
Dialog模块 | - 会话状态管理 - 会话分类(Profiling) - dlg_manage() 、dlg_bye() 等函数 |
用于管理SIP会话的生命周期和状态。 |
UUID模块 | - 生成唯一标识符 - $uuid(g) 、$uuid(r) 、$uuid(t) 等变量 |
适用于需要唯一标识的场景,如SIP实例标识、会话ID等。 |
SIP服务器类型 | - Proxy Server:信令转发、负载均衡 - B2BUA:会话控制、媒体流处理 |
Proxy Server 适合高性能场景,B2BUA 适合复杂业务逻辑和媒体流处理场景。 |
Proxy Server | - 无状态与有状态模式 - 路由、负载均衡、安全控制 |
专注于信令转发,不处理媒体流。 |
B2BUA | - 会话终止与重建 - 媒体流控制、协议转换 |
完全控制会话和媒体流,支持复杂业务逻辑。 |
pv_isset
、pv_unset
、is_int
、typeof
等。pvh_collect_headers
、pvh_apply_headers
、pvh_modify_header
等。KSR
模块。lua_dofile
、lua_run
、lua_runstring
等。sr
模块,支持Lua脚本的平滑迁移。register
,用于注册Kamailio子模块到Lua中。dlg_manage
、dlg_bye
、dlg_get
等。$uuid(g)
、$uuid(r)
、$uuid(t)
。今天的课程内容涵盖了Kamailio中多个核心模块的功能和使用方法,包括伪变量操作、消息头处理、Lua脚本执行、会话管理、唯一标识生成等。同时,我们还深入探讨了SIP中B2BUA和Proxy Server的区别与应用场景。通过学习,我们掌握了如何通过Kamailio实现灵活的SIP逻辑处理,并理解了不同SIP服务器类型的特点和适用场景。希望这些知识能够帮助大家在实际项目中更好地设计和实现SIP相关功能。
Dialog模块的主要功能是管理SIP会话(Dialog),并提供对会话状态的跟踪和控制。
Kamailio通过TM模块可以作为有状态代理(stateful proxy)运行。这里的“有状态”指的是事务状态(transaction state),而不是会话状态(dialog state)。某些应用场景可能需要代理能够感知整个会话(call),而不仅仅是事务。
例如,常见的需求是限制某个终端、账户或用户组可以同时进行的呼叫数量。为了实现这种限制,代理需要能够跟踪整个会话,而不仅仅是事务。Dialog模块提供了这种会话感知能力,能够跟踪当前会话、提供会话信息(如活跃会话数量),并管理会话的各种特性。
dlg_manage()
函数来创建会话。这个函数需要在创建对应的事务之前执行。default_timeout
)和自定义超时时间(timeout_avp
)控制。会话有以下几种状态:
其中,早期会话和已删除会话的状态不会更新到数据库中。
会话分类是一种机制,用于对会话进行分类、排序和跟踪。分类标准可以是管理员定义的任何属性,例如SIP消息属性、伪变量、自定义值等。会话可以动态地添加到一个或多个分类表中。
会话分类有两种类型:
一个会话可以同时属于多个分类。
Dialog模块依赖于以下Kamailio模块:
Dialog模块提供了许多配置参数,以下是一些重要的参数:
Dialog模块提供了许多函数,可以在配置脚本中使用。以下是一些常用的函数:
Dialog模块提供了以下统计信息:
Dialog模块支持通过RPC命令进行管理,例如:
Dialog模块导出了以下变量,可以在配置脚本中使用:
Dialog模块提供了以下事件路由:
Dialog模块提供了API,开发者可以通过注册回调函数来扩展功能。例如:
Dialog模块是Kamailio中非常重要的模块,用于管理SIP会话的生命周期。通过该模块,可以实现对会话的跟踪、分类、限制和统计等功能。开发者可以通过配置脚本和API进一步扩展其功能。
这段代码是关于Kamailio中Dialplan模块的详细说明。Dialplan模块用于实现基于匹配和替换规则的通用字符串转换。它可以用来处理请求URI(Request URI)或伪变量(PV),并将其转换为新的格式或值。Dialplan模块非常灵活,适用于多种场景,例如呼叫路由、号码前缀重写等。
Dialplan模块实现了基于匹配和替换规则的通用字符串转换功能。它可以用于:
Dialplan模块的典型应用场景包括:
Dialplan模块可以用于以下场景:
Dialplan模块提供了许多配置参数,以下是一些重要的参数:
Dialplan模块提供了以下函数,可以在配置脚本中使用:
dp_replace(dpid, inval, outvar)
dpid
:Dialplan组ID。inval
:输入值。outvar
:输出变量。dp_replace("240", "$rU", "$var(newru)");
xlog("'$rU' was translated to '$var(newru)'\n");
dp_match(dpid, inval)
dpid
:Dialplan组ID。inval
:输入值。dp_match("240", "+49$rU");
xlog("the attributes associated with '+49$rU' are '$var(attrs)'\n");
dp_translate(id, [src[/dest]])
id
:Dialplan组ID。src
:输入值。dest
:输出变量。dp_translate("240", "$ruri.user/$avp(s:dest)");
xlog("translated to var $avp(s:dest) \n");
dp_reload()
dp_reload();
Dialplan模块支持通过RPC命令进行管理,例如:
Dialplan模块需要一个数据库表(dialplan
)来存储规则。可以通过Kamailio提供的SQL脚本(dialplan-create.sql
)创建该表。
以下是一个Dialplan表的示例规则:
dpid: 1
pr: 1
match_op: 1
match_exp: ^0[1-9][0-9]+$
match_len: 0
subst_exp: ^0([1-9][0-9]+)$
repl_exp: 0049\1
attrs: de
Dialplan模块目前没有提供API供其他Kamailio模块使用。
Dialplan模块是Kamailio中非常强大的工具,适用于各种字符串转换和匹配场景。通过配置数据库中的规则,可以实现灵活的号码转换、服务检测等功能。开发者可以通过脚本函数和RPC命令进一步扩展其功能。
这段代码是关于Kamailio中UUID模块的详细说明。UUID模块用于生成唯一的标识符(UUID),这些标识符可以用于SIP消息中的+sip.instance
媒体特性标签,或者用于定义一组SIP会话的唯一会话ID。
以下是对这段代码的中文讲解:
UUID模块导出了$uuid(type)
类变量,这些变量使用libuuid
库中的函数生成唯一的值。UUID(通用唯一标识符)在SIP中常用于+sip.instance
媒体特性标签,但也可以用于其他场景,例如为一组SIP会话定义唯一的会话ID。
UUID模块提供了以下变量,可以在配置脚本中使用:
$uuid(g)
uuid_generate()
函数生成UUID。$var(uuid) = $uuid(g);
xdbg("生成的UUID是 [$var(uuid)]\n");
add_rr_param(";uuid=$var(uuid)");
$uuid(r)
uuid_generate_random()
函数生成基于随机数的UUID。$var(uuid) = $uuid(r);
xdbg("生成的随机UUID是 [$var(uuid)]\n");
$uuid(t)
uuid_generate_time()
函数生成基于时间的UUID。$var(uuid) = $uuid(t);
xdbg("生成的时间UUID是 [$var(uuid)]\n");
$uuid(s)
uuid_generate_time_safe()
函数生成基于时间的UUID。如果生成不安全,则返回$null
。uuid_generate_time()
相同。$var(uuid) = $uuid(s);
if ($var(uuid) != $null) {
xdbg("生成的安全时间UUID是 [$var(uuid)]\n");
} else {
xdbg("UUID生成不安全\n");
}
以下是一个完整的示例,展示如何在Kamailio配置脚本中使用UUID模块:
# 生成一个UUID
$var(uuid) = $uuid(g);
xlog("生成的UUID是 [$var(uuid)]\n");
# 将UUID添加到Record-Route头中
add_rr_param(";uuid=$var(uuid)");
# 生成一个随机UUID
$var(random_uuid) = $uuid(r);
xlog("生成的随机UUID是 [$var(random_uuid)]\n");
# 生成一个基于时间的UUID
$var(time_uuid) = $uuid(t);
xlog("生成的时间UUID是 [$var(time_uuid)]\n");
# 生成一个安全的时间UUID
$var(safe_uuid) = $uuid(s);
if ($var(safe_uuid) != $null) {
xlog("生成的安全时间UUID是 [$var(safe_uuid)]\n");
} else {
xlog("UUID生成不安全\n");
}
UUID模块是Kamailio中一个简单但非常有用的工具,用于生成唯一的标识符。通过$uuid(g)
、$uuid(r)
、$uuid(t)
和$uuid(s)
等变量,可以灵活地生成不同类型的UUID,并将其应用于SIP消息或其他场景中。
这段代码是关于Kamailio中Utils模块的详细说明。Utils模块实现了各种与SIP无关的实用功能,主要包括:
Utils模块提供了多种实用功能,主要包括:
xcap_auth_status
功能,则需要加载数据库模块。Utils模块提供了以下配置参数:
forward_active
(整数)0
(禁用)。modparam("utils", "forward_active", 1)
pres_db_url
(字符串)xcap_auth_status
功能会被禁用。modparam("utils", "pres_db_url", "mysql://foo:secret@localhost/pres")
xcap_table
(字符串)"xcap"
。modparam("utils", "xcap_table", "pres_xcap")
Utils模块提供了以下函数:
xcap_auth_status(watcher_uri, presentity_uri)
watcher_uri
:订阅者的URI(伪变量)。presentity_uri
:被订阅用户的URI(伪变量)。ACTIVE_STATUS
:允许订阅。PENDING_STATUS
、TERMINATED_STATUS
、WAITING_STATUS
:不允许订阅。-1
:发生错误。if (method=="MESSAGE") {
xcap_auth_status("$fu", "$ru");
if ($retcode == 1) {
t_relay();
} else {
send_reply("403", "Forbidden");
}
}
Utils模块支持通过MI(Management Interface)命令进行管理,主要包括:
forward_list
kamctl fifo forward_list
forward_switch
kamctl fifo forward_switch 0=on
forward_filter
kamctl fifo forward_filter 0=REGISTER:INVITE
forward_proxy
kamctl fifo forward_proxy 0=host-c.domain-c:5060
Utils模块的配置语法如下:
switch_setting_list
switch_setting { "," switch_setting }
0=on,1=off
filter_setting_list
filter_setting { "," filter_setting }
0=REGISTER:INVITE,1=REQUEST
proxy_setting_list
proxy_setting { "," proxy_setting }
0=host-a.domain-a:5060,1=host-b.domain-b:5060
switch_setting
id "=" switch
0=on
filter_setting
id "=" filter_list
0=REGISTER:INVITE
proxy_setting
id "=" proxy
0=host-a.domain-a:5060
switch
"off" | "on"
on
filter_list
filter { ":" filter }
REGISTER:INVITE
proxy
host ":" port
host-a.domain-a:5060
filter
special_filter | regular_filter
REQUEST
special_filter
"REQUEST" | "REPLY"
REQUEST
regular_filter
:
的字符串。REGISTER
host
char { char }
host-a.domain-a
port
number
5060
id
number
0
number
digit {digit}
5060
digit
0-9
5
Utils模块是Kamailio中一个非常实用的工具模块,提供了动态转发和XCAP授权状态检查等功能。通过FIFO命令和MI命令,可以灵活地配置和管理转发规则。xcap_auth_status
函数则可以帮助实现基于数据库的订阅授权检查。
这段代码是关于Kamailio中Usrloc模块的详细说明。Usrloc模块用于管理用户位置表(User Location Table),存储用户的注册信息(如SIP地址、联系人信息等),并提供对这些信息的访问接口。该模块本身不直接导出可供路由脚本使用的函数,而是通过其他模块(如Registrar模块)间接使用。
Usrloc模块维护一个用户位置表,并为其他模块提供访问该表的接口。该模块的核心功能是管理用户的注册信息,包括:
sip:user@domain
)。sip:[email protected]:5060
)。在NAT穿越(NAT Traversal)场景中,联系人匹配是一个重要问题。由于NAT的存在,同一用户的不同设备可能会使用相同的联系人信息,或者同一设备的重新注册可能会被视为新的联系人。为了解决这些问题,Usrloc模块提供了多种联系人匹配算法:
可以通过matching_mode
参数(见3.30节)选择匹配算法。
Usrloc模块提供了许多配置参数,以下是一些重要的参数:
nat_bflag
(整数)modparam("usrloc", "nat_bflag", 3)
use_domain
(整数)0
(禁用)。modparam("usrloc", "use_domain", 1)
db_mode
(整数)0
:禁用数据库,仅使用内存。1
:写穿透(Write-Through),所有更改立即写入数据库。2
:写回(Write-Back),更改先写入内存,定时同步到数据库。3
:仅数据库(DB-Only),无内存缓存,所有操作直接操作数据库。4
:启动时从数据库加载记录,运行时仅使用内存。0
。modparam("usrloc", "db_mode", 2)
timer_interval
(整数)60
。modparam("usrloc", "timer_interval", 120)
matching_mode
(整数)0
:仅基于联系人。1
:基于联系人和Call-ID。2
:基于联系人和Path。3
:仅基于Call-ID。0
。modparam("usrloc", "matching_mode", 1)
ka_mode
(整数)0
:禁用保活。1
:为所有联系人启用保活。2
:仅为NAT后的联系人启用保活。4
:仅为UDP联系人启用保活。0
。modparam("usrloc", "ka_mode", 1)
Usrloc模块支持通过RPC命令进行管理,例如:
Usrloc模块导出了以下统计信息:
Usrloc模块提供了一组API,供其他模块使用。例如:
Usrloc模块是Kamailio中非常重要的模块,用于管理用户的注册信息。通过灵活的配置参数和RPC命令,可以实现高效的用户位置管理。开发者可以通过API进一步扩展其功能,例如实现自定义的联系人匹配算法或保活机制。
PV模块(Pseudo-Variables Module)是Kamailio的核心模块之一,用于管理和操作伪变量(Pseudo-Variables)。伪变量是Kamailio配置脚本中用于动态访问和操作SIP消息、数据库、系统信息等的特殊变量。
PV模块提供了核心的伪变量(Pseudo-Variables),这些变量可以在Kamailio配置文件中使用。伪变量的完整列表可以在Kamailio的Wiki文档中找到:Pseudo-Variables Section。
PV模块提供了以下配置参数:
shvset
(字符串)$shv(name)
)的初始值。该参数可以多次设置。name=type:value
name
:共享变量名称。type
:值类型(i
:整数,s
:字符串)。value
:要设置的值。NULL
。modparam("pv", "shvset", "debug=i:1")
modparam("pv", "shvset", "pstngw=s:sip:10.10.10.10")
varset
(字符串)$var(name)
)的值。该参数可以多次设置。name=type:value
name
:脚本变量名称。type
:值类型(i
:整数,s
:字符串)。value
:要设置的值。NULL
。modparam("pv", "varset", "init=i:1")
modparam("pv", "varset", "gw=s:sip:11.11.11.11;transport=tcp")
avp_aliases
(字符串)NULL
。modparam("pv", "avp_aliases", "email=s:email_addr;tmp=i:100")
PV模块提供了以下函数,可以在配置脚本中使用:
pv_isset(pvar)
null
。pvar
- 伪变量标识符。if(pv_isset("$avp(s:x)")) {
...
}
pv_unset(pvar)
null
)。pvar
- 伪变量标识符。pv_unset("$avp(s:x)");
is_int(pvar)
pvar
- 伪变量标识符。1
(是整数),-1
(不是整数)。if (is_int("$var(foo)")) {
xlog("L_INFO", "variable foo contains integer value\n");
}
typeof(pvar, vtype)
pvar
- 伪变量标识符。vtype
- 类型(int
:整数,str
:字符串,null
:空值)。true
(类型匹配),false
(类型不匹配)。if (typeof("$var(foo)", "str")) {
xdbg("variable foo is a string\n");
}
not_empty(pvar)
pvar
- 伪变量标识符。true
(非空),false
(空)。if (not_empty("$var(foo)")) {
append_hf("X-Foo: $var(foo)\r\n");
}
xavp_copy(source_name, source_index, destination_name)
source_name
- 源XAVP名称。source_index
- 源XAVP索引。destination_name
- 目标XAVP名称。xavp_copy("a", "2", "b");
xavp_params_explode(sparams, xname)
sparams
- 参数字符串(格式:name1=value1;name2=value2
)。xname
- 目标XAVP名称。xavp_params_explode("a=b;c=d;e=f", "x");
xavp_params_implode(xname, pvname)
xname
- 源XAVP名称。pvname
- 目标变量名称。xavp_params_implode("x", "$var(out)");
PV模块支持通过RPC命令进行管理,例如:
PV模块是Kamailio中非常重要的模块,提供了丰富的伪变量操作功能。通过配置参数和函数,可以实现灵活的变量管理和操作。开发者可以通过RPC命令进一步扩展其功能,例如动态设置和获取共享变量的值。
这段代码是关于Kamailio中PV Headers模块的详细说明。PV Headers模块的主要目标是将SIP消息头的处理转移到XAVI动态容器中,并提供高级方法和伪变量来简化SIP消息头的修改。
PV Headers模块的核心功能是将SIP消息头的处理转移到XAVI动态容器中,并提供高级方法和伪变量来简化SIP消息头的修改。通过该模块,可以轻松地收集、修改和应用SIP消息头。
auto_msg
参数设置为1,则需要加载tm模块。PV Headers模块提供了以下配置参数:
xavi_name
(字符串)"headers"
。modparam("pv_headers", "xavi_name", "headers")
结果:
$xavi(headers[0]=>From)
$xavi(headers[0]=>To)
$xavi(headers[0]=>Call-ID)
header_value_size
(整数)1024
。modparam("pv_headers", "header_value_size", 512)
header_collect_flag
(整数)27
。modparam("pv_headers", "header_collect_flag", 17)
header_apply_flag
(整数)28
。modparam("pv_headers", "header_apply_flag", 18)
skip_headers
(字符串)"Record-Route,Via,Route,Content-Length,Max-Forwards,CSeq"
。modparam("pv_headers", "skip_headers", "Record-Route,Via,Route")
split_headers
(字符串)""
。modparam("pv_headers", "split_headers", "Diversion")
结果:
Diversion: ,,
Diversion:
,Diversion:
,Diversion:
auto_msg
(整数)1
(启用)。modparam("pv_headers", "auto_msg", 1)
PV Headers模块提供了以下函数,可以在配置脚本中使用:
pvh_collect_headers()
pvh_collect_headers();
pvh_apply_headers()
pvh_apply_headers();
pvh_reset_headers()
pvh_reset_headers();
pvh_check_header(hname)
hname
- 头名称。if (pvh_check_header("From")) {
...
}
pvh_append_header(hname, hvalue)
hname
- 头名称。hvalue
- 头值。pvh_append_header("X-My-Header", "MyValue");
pvh_modify_header(hname, hvalue, [idx])
hname
- 头名称。hvalue
- 头值。idx
- 头的索引(可选)。pvh_modify_header("From", "sip:[email protected]");
pvh_remove_header(hname, [idx])
hname
- 头名称。idx
- 头的索引(可选)。pvh_remove_header("X-My-Header");
pvh_value_exists(hname, hparameter)
hname
- 头名称。hparameter
- 参数名称。if (pvh_value_exists("From", "tag")) {
...
}
pvh_remove_header_param(hname, hparameter)
hname
- 头名称。hparameter
- 参数名称。pvh_remove_header_param("From", "tag");
PV Headers模块导出了以下伪变量,可以在配置脚本中使用:
$x_hdr
:消息头。$x_fu
:From头的URI部分。$x_fU
:From头的用户名部分。$x_fd
:From头的域名部分。$x_fn
:From头的显示名称。$x_ft
:From头的标签部分。$x_tu
:To头的URI部分。$x_tU
:To头的用户名部分。$x_td
:To头的域名部分。$x_tn
:To头的显示名称。$x_tt
:To头的标签部分。$x_rs
:Reply-To头的URI部分。$x_rr
:Record-Route头的URI部分。PV Headers模块是Kamailio中用于简化SIP消息头处理的强大工具。通过该模块,可以轻松地收集、修改和应用SIP消息头,同时提供了丰富的伪变量和函数来支持复杂的头操作。开发者可以通过配置参数和函数进一步扩展其功能,例如动态修改From/To头或移除特定的头参数。
App Lua模块允许在Kamailio配置文件中执行Lua脚本,并实现了KEMI框架。KEMI框架允许通过外部脚本语言(如Lua)来控制Kamailio的行为,而不需要直接修改C代码。
Lua是一种快速且易于嵌入的脚本语言。Kamailio通过KSR
模块向Lua脚本导出API,开发者可以通过Lua脚本来操作SIP消息、调用Kamailio函数等。
App Lua模块有两个Lua上下文:
lua_dofile()
和lua_dostring()
函数。lua_run()
函数和load
参数。这个上下文用于缓存模式,避免每次执行时都重新读取文件。App Lua模块提供了以下配置参数:
load
(字符串)lua_run(function, params)
在运行时执行脚本中的函数。null
。modparam("app_lua", "load", "/usr/local/etc/kamailio/lua/myscript.lua")
reload
(布尔值)app_lua.reload
重载脚本。1
(启用)。modparam("app_lua", "reload", 0)
log_mode
(整数)0
。modparam("app_lua", "log_mode", 1)
App Lua模块提供了以下函数,可以在配置脚本中使用:
lua_dofile(path)
path
- Lua脚本路径(可以是包含伪变量的字符串)。lua_dofile("/usr/local/etc/kamailio/lua/myscript.lua");
lua_dostring(script)
script
- Lua脚本(可以是包含伪变量的字符串)。if(!lua_dostring("KSR.log([[err]], [[----------- Hello World from $fU\n]])")) {
xdbg("SCRIPT: failed to execute lua script!\n");
}
lua_run(func [, params])
func
- Lua函数名。params
- 传递给函数的参数(最多3个字符串参数)。if(!lua_run("sr_append_fu_to_reply")) {
xdbg("SCRIPT: failed to execute lua function!\n");
}
lua_runstring(script)
script
- Lua脚本(可以是包含伪变量的字符串)。if(!lua_runstring("KSR.log([[err]], [[----------- Hello World from $fU\n]])")) {
xdbg("SCRIPT: failed to execute lua script!\n");
}
App Lua模块支持通过RPC命令进行管理,例如:
load
参数加载的所有脚本。创建一个Lua脚本并存储在文件系统中,例如:/usr/local/etc/kamailio/lua/myscript.lua
。
function sr_append_fu_to_reply()
KSR.hdr.append_to_reply("P-From: " .. KSR.pv.get("$fu") .. "\r\n");
end
在Kamailio配置文件中加载脚本并执行函数:
modparam("app_lua", "load", "/usr/local/etc/kamailio/lua/myscript.lua")
route {
...
if(!lua_run("sr_append_fu_to_reply")) {
xdbg("SCRIPT: failed to execute lua function!\n");
}
...
}
App Lua模块是Kamailio中用于执行Lua脚本的强大工具,通过KEMI框架导出了丰富的API供Lua脚本使用。开发者可以通过Lua脚本来实现复杂的SIP消息处理逻辑,而无需修改Kamailio的C代码。通过配置参数和RPC命令,可以灵活地管理和重载Lua脚本。
这段代码是关于Kamailio中App Lua SR模块的详细说明。App Lua SR模块导出了Lua模块sr
,这是在KEMI框架之前存在的旧API。该模块依赖于app_lua
模块,并主要用于支持旧版Lua脚本的平滑迁移。
App Lua SR模块导出了Lua模块sr
,这是在KEMI框架之前存在的旧API。该模块的主要目的是为了支持使用sr
模块的旧版Lua脚本平滑迁移到KEMI框架和KSR
模块。
注意:该模块将在未来被标记为过时并最终移除。如果发现sr
模块中有任何函数在KSR
模块中没有对应的替代函数,请报告给sr-dev
邮件列表。
Lua是一种快速且易于嵌入的脚本语言。Kamailio通过sr
模块向Lua脚本导出API,开发者可以通过Lua脚本来操作SIP消息、调用Kamailio函数等。
register
参数指定的模块。App Lua SR模块提供了以下配置参数:
register
(字符串)alias_db
:注册alias_db
模块的函数到sr.alias_db
。auth
:注册auth
模块的函数到sr.auth
。auth_db
:注册auth_db
模块的函数到sr.auth_db
。dispatcher
:注册dispatcher
模块的函数到sr.dispatcher
。maxfwd
:注册maxfwd
模块的函数到sr.maxfwd
。msilo
:注册msilo
模块的函数到sr.msilo
。presence
:注册presence
模块的函数到sr.presence
。presence_xml
:注册presence_xml
模块的函数到sr.presence_xml
。pua_usrloc
:注册pua_usrloc
模块的函数到sr.pua_usrloc
。registrar
:注册registrar
模块的函数到sr.registrar
。rls
:注册rls
模块的函数到sr.rls
。rr
:注册rr
模块的函数到sr.rr
。sanity
:注册sanity
模块的函数到sr.sanity
。sdpops
:注册sdpops
模块的函数到sr.sdpops
。siputils
:注册siputils
模块的函数到sr.siputils
。sl
:注册sl
模块的函数到sr.sl
。sqlops
:注册sqlops
模块的函数到sr.sqlops
。textops
:注册textops
模块的函数到sr.textops
。tm
:注册tm
模块的函数到sr.tm
。xhttp
:注册xhttp
模块的函数到sr.xhttp
。注意:sr
、sr.hdr
和sr.pv
模块始终会注册到Lua中。
null
。modparam("app_lua_sr", "register", "sl")
App Lua SR模块是为了支持旧版Lua脚本而存在的过渡模块,导出了sr
模块供Lua脚本使用。随着KEMI框架的引入,推荐使用KSR
模块来替代sr
模块。开发者可以通过register
参数将Kamailio子模块注册到Lua中,以便在Lua脚本中调用这些模块的函数。
在SIP(Session Initiation Protocol)协议中,B2BUA(Back-to-Back User Agent) 和 Proxy Server 是两种常见的服务器类型,它们在SIP通信中扮演不同的角色。以下是对它们的详细讲解:
Proxy Server 是SIP协议中的一种中间服务器,负责转发SIP消息(如INVITE、REGISTER等)。它不直接参与媒体流的传输,而是专注于路由和转发SIP信令。
B2BUA 是一种特殊的SIP服务器,它同时扮演UAC(User Agent Client) 和 UAS(User Agent Server) 的角色。B2BUA 会终止来自一端的SIP会话,并重新发起一个新的SIP会话到另一端,因此它可以完全控制会话的建立和媒体流的传输。
特性 | Proxy Server | B2BUA |
---|---|---|
会话状态 | 无状态或有状态 | 有状态 |
媒体流处理 | 不处理媒体流 | 可以处理媒体流 |
会话控制 | 仅转发信令 | 完全控制会话 |
协议转换 | 不支持 | 支持 |
复杂性 | 简单 | 复杂 |
性能 | 高性能,适合高并发 | 性能开销较大 |
典型应用 | 路由、负载均衡、注册 | 呼叫控制、协议转换、媒体流处理 |
选择 Proxy Server 的场景:
选择 B2BUA 的场景:
根据实际需求选择合适的服务器类型,可以更好地满足SIP通信的需求。