团队博客

从使用角度比较 Kamailio 和 OpenSIPS

小樱桃科技  2024-05

Kamailio 和 OpenSIPS 同根同源,很多语法、伪变量、模块使用方式,两者都极为相似。本文仅从使用角度对二者进行比较。但因受认识限制,描述的可能不够准确和全面,希望得到大家的批评指正。

核心、伪变量、转换函数等

  • Kamailio 支持预处理,OpenSIPS 不支持预处理
  • Kamailio RPC 的作用跟 OpenSIPS MI 大致相同
  • Kamailio 的 route 函数不能带参数,而 OpenSIPS 则可以带参数
  • 在 Kamailio $fU 和 $tU 可读可写,但在 OpenSIPS $fU 和 $tU 只读,如果需要修改主被叫号码,需要调用 uac 模块里面的函数
  • Kamailio 有 $fs 伪变量(Force send socket 的缩写),OpenSIPS 3.2 和 3.4 版本则换成了 $socket_out
  • Kamailio 有 $sut 伪变量(Source address as full URI 的缩写),而 OpenSIPS 用三个伪变量加到一起来与之对应($socket_in(ip), $socket_in(port), $socket_in(proto))
  • Kamailio 有 Selects 变量,比如在请求路由里面执行 xlog("got $sel(msg)\n",就可以打印 SIP 消息,非常方便。而 OpenSIPS 则没有 Selects 变量

缓存

Kamailio 的 htable 模块提供缓存功能,OpenSIPS cache 函数用起来也很方便。

用户位置共享

要实现用户位置共享,Kamailio 需启用 dmq 和 dmq_uscloc 模块。OpenSIPS 则需要 proto_bin 和 clusterer 等模块。

拓扑隐藏模块

Kamailio 有 topoh、topos、topos_redis 三个拓扑隐藏模块,而 OpenSIPS 的 topology_hiding 模块貌似更实用,一是没有 RR 头(好处是包更小);二是把 Contact 头换成 OpenSIPS 自己的地址。

uac-trunk-auth

这是 uac-trunk-auth 的典型流程:

1. A -> INVITE -> Proxy                     B
2. A              Proxy ->    INVITE     -> B
3. A              Proxy <-    401(7)     <- B
4. A              Proxy -> INVITE (auth) -> B (CSeq 加一)
5. A              Proxy <-      200      <- B
6. A  <- 200 <-   Proxy

在第 4 步时,CSeq 需要加一

OpenSIPS 需要用路由脚本实现这个加一的操作,而 Kamailio 配置 dialog 模块的一个参数即可,比较方便。

中间注册模块

OpenSIPS 有中间注册模块 mid_registrar,而 Kamailio 则无,当然可以在 Kamailio 的路由脚本里面实现该功能。

LUA 支持

OpenSIPS 虽然也支持 LUA 语言来写路由脚本,但显然 Kamailio 的 KEMI 更强大更方便。

结束语

二者能进行比较的显然不只上面提到的这些内容,比如都有 dispatcher 模块,功能大致相同,但细节不太一样。限于篇幅不再展开。

本人当然更熟悉 Kamailio 一些,但同时非常喜欢 OpenSIPS。可能有的读者会问,如果二选一该怎么办,我的回答是都可以,但有人这么说过:目前 OpenSIPS 用户数量更多,但查二者的邮件列表(Mailing List),Kamailio 程序崩溃更少一些。

用 XSwitch 检查 WAV 文件里面的 DTMF